sql >> Databáze >  >> RDS >> Mysql

Můj výpis PDO nefunguje

Někdy váš kód PDO vyvolá chybu jako Call to a member function execute() nebo podobné. Nebo dokonce bez chyby, ale dotaz nefunguje stejně. Znamená to, že váš dotaz se nepodařilo provést.

Pokaždé, když dotaz selže, MySQL má chybovou zprávu, která vysvětluje důvod . Bohužel, ve výchozím nastavení se takové chyby do PHP nepřenášejí a vše, co máte, je ticho nebo záhadná chybová zpráva zmíněná výše. Proto je velmi důležité nakonfigurovat PHP a PDO, aby vám hlásily chyby MySQL. A jakmile se zobrazí chybová zpráva, nebude problém problém vyřešit.

Chcete-li získat podrobné informace o problému, vložte následující řádek do kódu hned po připojení

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

(kde $dbh je název proměnné instance vašeho PDO) nebo – lépe – přidejte tento parametr jako možnost připojení . Poté budou všechny databázové chyby převedeny do výjimek PDO, které, pokud by zůstaly samotné, fungovaly by stejně jako běžné chyby PHP.

Je velmi malá šance, že v případě nějaké konkrétní chyby nebude vyvolána výjimka. Pokud váš query() /prepare() nebo execute() volání vrátí false ale neexistuje žádná výjimka, zkontrolujte PDO::errorInfo() takhle,

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

Po obdržení chybové zprávy si ji musíte přečíst a porozumět jí. Zní to příliš jasně, ale studenti často přehlížejí význam chybové zprávy. Přesto to většinou vysvětluje problém docela přímočaře:

  • Řekněme, že pokud to říká, že konkrétní tabulka neexistuje, musíte zkontrolovat pravopis, překlepy, velká a malá písmena. Také se musíte ujistit, že váš PHP skript se připojuje ke správné databázi
  • Nebo pokud to říká, že je chyba v syntaxi SQL, musíte svůj SQL prozkoumat. A problémové místo je právě před část dotazu uvedená v chybové zprávě.

Musíte také důvěřovat chybová zpráva. Pokud říká, že počet tokenů neodpovídá počtu vázaných proměnných, pak to je tak. Totéž platí pro chybějící tabulky nebo sloupce. Vzhledem k možnosti volby, ať už je to vaše vlastní chyba nebo chybová zpráva, se vždy držte toho prvního. Opět to zní blahosklonně, ale stovky otázek na tomto webu dokazují, že tato rada je nesmírně užitečná.

Všimněte si, že abyste viděli chyby PDO, musíte být schopni vidět chyby PHP obecně. Chcete-li tak učinit, musíte nakonfigurovat PHP v závislosti na prostředí webu:

  • na vývoj serveru je velmi užitečné mít chyby přímo na obrazovce, pro které je třeba zapnout zobrazování chyb:

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • když jste živě všechny chyby musí být zaprotokolovány, ale nikdy se nezobrazují klientovi. Za tímto účelem nakonfigurujte PHP takto:

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

Všimněte si, že error_reporting by měl být nastaven na E_ALL pořád.

Všimněte si také, že navzdory běžnému bludu nemusí být pro hlášení chyb použit žádný pokusný úlovek . PHP vám již bude hlásit chyby PDO a v lepší formě. Nezachycená výjimka je velmi dobrá pro vývoj, ale pokud chcete zobrazit přizpůsobenou chybovou stránku, stále pro to nepoužívejte try catch, ale nastavte vlastní obslužný program chyb . Stručně řečeno, s chybami PDO nemusíte zacházet jako s něčím zvláštním, ale považovat je za jakoukoli jinou chybu ve vašem kódu.

P.S.
Někdy nedojde k chybě, ale také k žádnému výsledku. Pak to znamená, že neexistují žádná data, která by odpovídala vašim kritériím . Takže tuto skutečnost musíte uznat, i když můžete přísahat, že data a kritéria jsou v pořádku. Nejsou. Musíte je znovu zkontrolovat. Mám krátkou odpověď, která by vám pomohla určit problém se shodami, Mám problém s odpovídajícími řádky v databázi pomocí PDO . Postupujte podle tohoto návodu a propojeného výukového programu krok za krokem a buď vyřešte svůj problém, nebo položte zodpovědnou otázku pro Stack Overflow.




  1. Chyba syntaxe kvůli použití vyhrazeného slova jako názvu tabulky nebo sloupce v MySQL

  2. Zvyšování laťky správy MySQL, MariaDB, PostgreSQL a MongoDB

  3. Jak vytvořím tabulku Oracle s vnořenými tabulkami typů objektů?

  4. Proč používat klauzuli JOIN oproti podmínce WHERE?