Det beror på att $pdo->errorInfo() hänvisar till det senaste uttalandet som kördes framgångsrikt. Sedan $sql->execute() returnerar false, då kan den inte referera till det påståendet (antingen till ingenting eller till frågan innan).
Om varför $sql->execute() returnerar false, jag vet inte... antingen finns det ett problem med dina $params array eller med din databasanslutning.
Obs:PHP-manualen (https://php.net/manual/en/pdo .errorinfo.php
) definierar inte exakt vad "senaste operationen på databashandtaget" betyder, men om det fanns ett problem med bindningsparametrar skulle det felet ha inträffat i PDO och utan någon interaktion med databasen. Det är säkert att säga att om $pdo->execute() returnerar true , att $pdo->errorInfo() är giltig. Om $pdo->execute() returnerar false , beteendet hos $pdo->errorInfo() framgår inte uttryckligen av dokumentationen. Om jag minns rätt från min erfarenhet returnerar exekvera true , även om MySQL returnerade ett fel, returnerar false om ingen operation gjordes. Eftersom dokumentationen inte är specifik kan den vara db-drivrutinspecifik.
Detta svar återspeglar praktiska erfarenheter när det skrevs i september 2012. Som en användare har påpekat bekräftar inte dokumentationen uttryckligen denna tolkning. Det kan också bara återspegla den specifika databasdrivrutinimplementeringen, men det bör alltid vara sant att om $pdo->execute() returnerar true , att $pdo->errorInfo() är giltigt.
Du kanske också vill ställa in PDO::ERRMODE_EXCEPTION i din anslutningssekvens. Undantagshantering gör det onödigt att kontrollera och fråga efter felet.
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );