sql >> Databasteknik >  >> RDS >> Mysql

Mitt PDO-uttalande fungerar inte

Ibland ger din PDO-kod ett fel som Call to a member function execute() eller liknande. Eller till och med utan något fel, men frågan fungerar inte på samma sätt. Det betyder att din fråga inte kunde köras.

Varje gång en fråga misslyckas har MySQL ett felmeddelande som förklarar orsaken . Tyvärr överförs inte sådana fel som standard till PHP, och allt du har är en tystnad eller ett kryptiskt felmeddelande som nämns ovan. Därför är det mycket viktigt att konfigurera PHP och PDO för att rapportera MySQL-fel. Och när du väl får felmeddelandet är det enkelt att lösa problemet.

För att få detaljerad information om problemet, lägg antingen följande rad i koden direkt efter anslutningen

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

(där $dbh är namnet på din PDO-instansvariabel) eller - bättre - lägg till den här parametern som ett anslutningsalternativ . Efter det kommer alla databasfel att översättas till PDO-undantag som, om de lämnas ifred, skulle fungera precis som vanliga PHP-fel.

Det finns en mycket liten chans att i händelse av något specifikt fel ett undantag inte kommer att kastas. Om din query() /prepare() eller execute() anrop returnerar false men det finns inget undantag, kontrollera PDO::errorInfo() så här,

 trigger_error("PDO errorInfo: ".$dbh->errorInfo());

Efter att ha fått felmeddelandet måste du läsa och förstå det. Det låter för uppenbart, men eleverna förbiser ofta meningen av felmeddelandet. Men oftast förklarar det problemet ganska enkelt:

  • Säg att om det står att en viss tabell inte existerar måste du kontrollera stavning, stavfel, skiftläge. Du måste också se till att ditt PHP-skript ansluter till en korrekt databas
  • Eller, om det står att det finns ett fel i SQL-syntaxen, måste du undersöka din SQL. Och problemplatsen är precis före frågedelen som citeras i felmeddelandet.

Du måste också lita på felmeddelandet. Om det står att antalet tokens inte matchar antalet bundna variabler är det är så. Detsamma gäller frånvarande tabeller eller kolumner. Med tanke på valet, oavsett om det är ditt eget misstag eller felmeddelandet är fel, håll dig alltid till det förra. Återigen låter det nedlåtande, men hundratals frågor på just den här webbplatsen visar detta råd extremt användbart.

Observera att för att se PDO-fel måste du kunna se PHP-fel i allmänhet. För att göra det måste du konfigurera PHP beroende på webbplatsens miljö:

  • på en utveckling server det är väldigt praktiskt att ha fel direkt på skärmen, för vilka visningsfel måste vara aktiverat:

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • medan du är live webbplats måste alla fel loggas men aldrig visas till klienten. För detta, konfigurera PHP på detta sätt:

    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    

Observera att error_reporting bör ställas in på E_ALL hela tiden.

Observera även att trots den vanliga vanföreställningen behöver ingen try-catch användas för felrapporteringen . PHP kommer att rapportera PDO-fel redan, och på ett bättre sätt. Ett ouppfångat undantag är mycket bra för utveckling, men om du vill visa en anpassad felsida, använd ändå inte try catch för detta, utan ställ bara in en anpassad felhanterare . I ett nötskal, du behöver inte behandla PDO-fel som något speciellt utan betrakta dem som alla andra fel i din kod.

P.S.
Ibland är det inget fel men inga resultat heller. Då betyder det att det inte finns någon data som matchar dina kriterier . Så du måste erkänna detta faktum, även om du kan svära uppgifterna och kriterierna är okej. De är inte. Du måste kontrollera dem igen. Jag har ett kort svar som skulle hjälpa dig att lokalisera matchningsproblemet, Har problem med matchande rader i databasen använder SUB . Följ bara den här instruktionen och den länkade handledningen steg för steg och låt antingen ditt problem lösa eller ha en besvarbar fråga för Stack Overflow.




  1. Oracle Database 21c för Linux-plattformar

  2. Typkonvertering. Vad gör jag med ett PostgreSQL OID-värde i libpq i C?

  3. Hur DB_NAME() fungerar i SQL Server

  4. Massinlägg eller uppdatering för tabeller med bifogade fält