2014-12-25 2 views
3

Как показать ошибку mysql throws при попытке вставить данные в пользовательскую таблицу, а вставка не удалась?Как показать ошибки MySQL из отказавшего объекта запроса Modx/xPDO?

Например, ниже бит кода, который должен (будет) терпеть неудачу с ошибкой SQL.

$insert = "some insert sql statement that will fail"; 

$myquery = $modx->query($insert); 

    if(!$myquery){ 

     echo 'error occurred! <br>'; 

    } 

Как вернуть то, что на самом деле было ошибкой [т. несоответствие столбцов, уникальный идентификатор и т. д.]?

+0

Я не уверен, в MODx документы, они, как правило, документировать функции xpdo как: $ xpdo-> запрос() вместо $ modx-> запрос() .. HTTP : //rtfm.modx.com/xpdo/2.x/getting-started/creating-a-model-with-xpdo/defining-a-schema/defining-relationships –

+0

Из 'modx.class.php':' class modX расширяет xPDO {...} ' – proxyfabio

ответ

2

На основании примеров в xPDO Getting Started guide, $modx в этом контексте, как представляется, класс расширение PDO и результат объекта ресурс $myquery, вероятно, является объектом PDOStatement.

Таким образом, вы можете установить режим ошибки исключения на $modx, как и с обычным объектом PDO.

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

, чтобы заставить его выбросить ошибки при сбое. По умолчанию ошибки PDO молчат; его режимы ошибки are documented here.

Исправление:Looking into the xPDO source не расширитьPDO, а содержит PDO объекта в качестве свойства и методы реализации PDO, передавая их через его свойство соединения. Таким образом, вызов setAttribute() будет передан в базовый объект PDO и должен работать соответствующим образом.

The xPDO constructor расширяет функциональность от нормального 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.

+0

отлично! Благодарю. –

2

Существует несколько более легкий способ отслеживания вашего пользовательского запроса 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(); 
} 
+0

Согласовано - это способ MODX для этого. – okyanet