Det er fordi $pdo->errorInfo() henviser til den sidste erklæring, der blev udført. Siden $sql->execute() returnerer falsk, så kan den ikke henvise til det udsagn (enten til ingenting eller til forespørgslen før).
Med hensyn til hvorfor $sql->execute() returnerer falsk, jeg ved det ikke... enten er der et problem med dine $params array eller med din databaseforbindelse.
Bemærk:PHP-manualen (https://php.net/manual/en/pdo .errorinfo.php
) definerer ikke nøjagtigt, hvad "sidste operation på databasehåndtaget" betyder, men hvis der var et problem med bindingsparametre, ville den fejl være opstået inde i PDO og uden interaktion med databasen. Det er sikkert at sige, at hvis $pdo->execute() returnerer true , at $pdo->errorInfo() er gyldig. Hvis $pdo->execute() returnerer false , adfærden for $pdo->errorInfo() fremgår ikke eksplicit af dokumentationen. Hvis jeg husker rigtigt fra min erfaring, udfør returnerer true , selvom MySQL returnerede en fejl, returnerer false hvis der ikke blev foretaget nogen operation. Da dokumentationen ikke er specifik, kan den være db-driverspecifik.
Dette svar afspejler praktiske erfaringer fra det tidspunkt, det blev skrevet i september 2012. Som en bruger har påpeget, bekræfter dokumentationen ikke eksplicit denne fortolkning. Det kan også kun afspejle den særlige databasedriverimplementering, men det bør altid være sandt, at hvis $pdo->execute() returnerer true , at $pdo->errorInfo() er gyldig.
Du vil måske også indstille PDO::ERRMODE_EXCEPTION i din forbindelsessekvens. Undtagelseshåndtering gør det unødvendigt at kontrollere og forespørge om fejlen.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );