Как показать ошибки MySQL из неработающего объекта запроса Modx/xPDO?
Как я показываю ошибку, которую выдает mysql, когда я пытаюсь вставить данные в пользовательскую таблицу, и вставка завершается неудачно?
Например, ниже немного кода, который должен (будет) завершиться с ошибкой SQL.
$insert = "some insert sql statement that will fail";
$myquery = $modx->query($insert);
if(!$myquery){
echo 'error occurred! <br>';
}
Как мне вернуть то, чем на самом деле была ошибка [т.е. несоответствие столбца, существует уникальный идентификатор и т. Д.]?
2 ответа
Основываясь на примерах из руководства по началу работы с xPDO, $modx
в этом контексте представляется класс, расширяющий PDO
и объект ресурса результата $myquery
скорее всего PDOStatement
объект.
Поэтому вы можете установить режим ошибки исключения на $modx
как и в случае с обычным объектом PDO.
$modx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
заставить его выбросить ошибки при неудаче. По умолчанию PDO выдает ошибки молча; его режимы ошибок описаны здесь.
Исправление: если смотреть на источник xPDO, он не расширяется PDO
, а скорее содержит PDO
Объект как свойство и реализовать методы PDO, передавая их через его свойство подключения. Итак setAttribute()
вызов будет передан в базовый PDO
объект и должен работать соответственно.
Конструктор xPDO немного расширяет функциональность обычного конструктора PDO и принимает массив опций в 5-м параметре, где вы можете установить режим ошибки, а не устанавливать его позже через setAttribute()
:
$xpdo = new xPDO($dsn, $user, $password, [], [PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION]);
Какой бы метод вы ни выбрали для установки, вы можете заключить код в try/catch
блок для отлова исключений типа PDOException
по ошибке:
try {
$insert = "some insert sql statement that will fail";
$myquery = $modx->query($insert);
}
catch (PDOException $e) {
echo 'error occurred! ' . $e->getMessage() . '<br>';
}
Вы также можете проще установить errormode в PDO::ERRMODE_WARNING
и PHP вместо этого будет просто излучать E_WARNING
сообщения, которые, в отличие от исключений, не являются фатальными.
Я смог проверить все это, как и ожидалось, настроив быстрый тест с xPDO.
Есть немного более простой способ отследить ваш пользовательский запрос xpdo.
$c = $modx->newQuery('modResource');
$c->where(array(
'id1' => 1
));
// print request for control
print_r($c->toSQL());
$s = $c->prepare();
$s->execute();
print_r($s->errorInfo());
После выполнения мы можем поймать ошибку:
Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'modResource.id1' in 'where clause' )
Это все потому, что xpdo использует pdo и контролирует выполнение с его помощью. Некоторый код из источника xpdo:
/**
* @see http://php.net/manual/en/function.pdo-errorinfo.php
*/
public function errorInfo() {
if (!$this->connect()) {
return false;
}
return $this->pdo->errorInfo();
}