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 (http://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 );