Общая ошибка PDO при использовании Doctrine DBAL в PPI Framework - PullRequest
1 голос
/ 02 января 2012

Я получаю «Общую ошибку HY000» при выполнении подготовленного оператора для ОБНОВЛЕНИЯ строки таблицы.Кажется, что запрос выполняется, и строка успешно обновлена.Мой код и возвращенная ошибка подробно описаны ниже.Если кто-то может указать мне правильное решение этой проблемы, я был бы очень признателен.

Пример кода:

$query = 'UPDATE users SET active = 1 WHERE email = ? AND activationCode = ?';

$stmt = $this->ds->prepare($query);
$stmt->bindValue(1, $email);
$stmt->bindValue(2, $code);
$stmt->execute();

$row = $stmt->fetch();

Детали ошибки:

File: C:\apache2\htdocs\ppi-framework\Vendor\Doctrine\Doctrine\DBAL\Statement.php
Line: 189
Message: SQLSTATE[HY000]: General error
Code: HY000

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Да, fetch () ожидает результата от SELECT, а это не то, что выполняет ваш запрос.

Я рекомендую вместо непосредственного взаимодействия с PDO через компонент DataSource PPI, который вы используетеКомпонент PPI ​​\ DataSource \ ActiveQuery.Это выполняет соответствующий код PDO под капотом, что, конечно, выполняется Doctrine DBAL (который PPI Framework абстрагирует).

Ниже приведен пример использования класса ActiveQuery PPI.

<?php
namespace App\Model;
class User extends \PPI\DataSource\ActiveQuery {

    protected $_meta = array(
        'table'   => 'users',
        'primary' => 'id',
        'conn'    => 'main' // See your connections.php configuration
    );
}

Это все, что вам нужно, теперь PPI может сделать все остальное за вас.Чтобы обновить запрос, вы можете сделать:

<?php
$model  = new \App\Model\User();
$data   = array('active' => 1);
$where  = array('email' => 'x', 'activationCode' => 'x');
$result = $model->update($data, $where);

Чтобы увидеть, что происходит с ActiveQuery-> update (), вы можете начать трассировку здесь: https://github.com/ppi/framework/blob/master/PPI/DataSource/PDO/ActiveQuery.php#L127

Удачи.

Пол Драгунис.

0 голосов
/ 02 января 2012

Вы выполняете оператор обновления, а затем пытаетесь извлечь строку из набора результатов (который является пустым). Вот где вы получите исключение.

Удалите выборку, и все готово.

...