Как показать ошибки 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();
}
Другие вопросы по тегам