#php #mysql #pdo
#php #mysql #pdo
Вопрос:
Я использую WAMP в качестве своей платформы. Запускаем следующий код (pdodb — это фреймворк для работы с PDO):
<?PHP
$mysql = pdodb::getInstance();
$query = " SELECT PhysicalID FROM PhysicalInfo
WHERE barcode=0";
$mysql->Prepare($query);
$res = $mysql->Execute($query);
?>
PHP останавливается при «Execute()», например, следующие строки не выполняются! Я использовал try/catch
для catch (Exception e)
, но даже сообщение об ошибке в catch
не отображается! излишне говорить, что нет смысла вставлять $res->errorInfo()
после execute()
, потому что он тоже не будет запущен. Хотя, если я установлю базу данных в своем коде:
$query = " SELECT PhysicalID FROM **carinfo.**PhysicalInfo
WHERE barcode=0";
Код выполняется идеально. Используя phpMyAdmin, я получаю следующую ошибку при первом запросе:
#1046 - No database selected
Проблема в том:
- Почему PHP останавливается на этом, а остальная часть программы после
$mysql->Execute($query);
не запускается. - Как я мог бы получить сообщение об ошибке, чтобы проверить его наличие в моей программе (довольно некрасиво, когда ваш код останавливается без какого-либо предупреждения).
Комментарии:
1. Остановка выполнения PHP происходит из-за неустранимой ошибки. Убедитесь, что у вас есть сообщение об ошибках, включенное и отображаемое на экране, всегда при разработке кода.
error_reporting(E_ALL); ini_set('display_errors', 1);
2. По умолчанию PDO выдает ошибки без предупреждения. Убедитесь, что ваш объект PDO, возвращаемый
pdodb::getInstance()
, настроен на выдачу исключений, иначе вашtry/catch
ничего не сделает.$mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
3. О, я вижу проблему — вы не должны переходить
$query
вPDO::execute()
. это ваша строка SQL, которую вы подготовили. Единственными параметрами дляexecute()
был бы массив связанных параметров (у вас нет ни одного из них в этом операторе). Поскольку у вас нет пользовательского ввода, вы можете безопасно просто вызвать$res = $mysql->query($query);
вместо этого, чтобы избежать накладных расходовprepare()/execute()
.4. @Michael Berkowski: Спасибо, Майкл,
$mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
дает мнеCall to undefined method pdodb::setAttribute()
. Я думаю, это может быть потому, что pdodb пропускает некоторые функции PDO?5. @Michael Berkowski: Я использовал
$mysql->Execute($query);
раньше, и это работает просто отлично. А также нетquery()
функции для экземпляра pdodb 🙁