Понякога вашият PDO код произвежда грешка като Call to a member function execute()
или подобен. Или дори без грешка, но заявката не работи все едно. Това означава, че вашата заявка не е била изпълнена.
Всеки път, когато заявка е неуспешна, MySQL има съобщение за грешка, което обяснява причината . За съжаление по подразбиране такива грешки не се прехвърлят в PHP и всичко, което имате, е мълчание или загадъчно съобщение за грешка, споменато по-горе. Следователно е много важно да конфигурирате PHP и PDO, за да ви съобщават грешки в MySQL. И след като получите съобщението за грешка, ще бъде лесно да отстраните проблема.
За да получите подробна информация за проблема, или поставете следния ред в кода си веднага след свързване
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
(където $dbh
е името на вашата променлива на PDO екземпляр) или - по-добре - добавете този параметър като опция за свързване . След това всички грешки в базата данни ще бъдат преведени в PDO изключения, които, ако бъдат оставени сами, ще действат точно като обикновени PHP грешки.
Има много малък шанс в случай на някаква конкретна грешка да не бъде изведено изключение. Ако вашият query()
/prepare()
или execute()
повикването връща false
но няма изключение, проверете PDO::errorInfo()
така,
trigger_error("PDO errorInfo: ".$dbh->errorInfo());
След като получите съобщението за грешка, трябва да го прочетете и разберете. Звучи твърде очевидно, но учащите често пренебрегват значението на съобщението за грешка. И все пак през повечето време това обяснява проблема доста просто:
- Да речем, ако пише, че конкретна таблица не съществува, трябва да проверите правописа, печатните грешки, главния и главния букви. Също така трябва да се уверите, че вашият PHP скрипт се свързва с правилна база данни
- Или, ако пише, че има грешка в синтаксиса на SQL, тогава трябва да проверите своя SQL. И проблемното място е точнопреди частта от заявката, цитирана в съобщението за грешка.
Вие също трябва да се доверявате съобщението за грешка. Ако пише, че броят на жетоните не съвпада с броя на свързаните променливи, значи е така. Същото важи и за отсъстващи таблици или колони. Предвид избора, независимо дали това е ваша собствена грешка или съобщението за грешка е грешно, винаги се придържайте към първото. Отново звучи снизходително, но стотици въпроси на този сайт доказват, че този съвет е изключително полезен.
Имайте предвид, че за да видите PDO грешки, трябва да можете да виждате PHP грешки като цяло. За да направите това, трябва да конфигурирате PHP в зависимост от средата на сайта:
-
на вразработката сървър е много удобно да имате грешки направо на екрана, за които трябва да е включено показването на грешки:
error_reporting(E_ALL); ini_set('display_errors',1);
-
докато сте вживо сайт, всички грешки трябва да се регистрират, но никога да не се показват на клиента. За това конфигурирайте PHP по следния начин:
error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('log_errors', 1);
Имайте предвид, че error_reporting
трябва да бъде настроен на E_ALL
през цялото време.
Също така имайте предвид, че въпреки често срещаната заблуда, не трябва да се използва за отчитане на грешки . PHP вече ще ви докладва за PDO грешки и в известен смисъл по-добра форма. Неуловено изключение е много добро за разработка, но ако искате да покажете персонализирана страница за грешка, все пак не използвайте try catch за това, а просто задайте персонализиран манипулатор на грешки . Накратко, не е нужно да третирате PDO грешките като нещо специално, а да ги разглеждате като всяка друга грешка в кода си.
P.S.
Понякога няма грешка, но и резултати. Тогава това означава, че няма данни, които да отговарят на вашите критерии . Така че трябва да признаете този факт, дори ако можете да се закълнете, че данните и критериите са наред. Те не са. Трябва да ги проверите отново. Имам кратък отговор, който би ви помогнал да определите проблема със съвпадение, Имате проблем със съвпадащи редове в базата данни използвайки ЗНП
. Просто следвайте тази инструкция и свързания урок стъпка по стъпка и или решите проблема си, или имайте отговорен въпрос за Stack Overflow.