PDO Mysql SQLSTATE [42000] - PullRequest
       5

PDO Mysql SQLSTATE [42000]

0 голосов
/ 21 июля 2011

Я построил функцию, которая подготовит оператор SQL и выполнит его с заданными параметрами.Итак, вот как это выглядит:

function go($statement) {
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

    for($i = 1; $i < func_num_args(); $i++) {
        $arg_to_pass = func_get_arg($i);
        $q->bindParam($i, $arg_to_pass, PDO::PARAM_INT);
    }
    $q->execute();
}

Но когда я вызываю его, выдается следующая ошибка:

Неустранимая ошибка: необработанное исключение 'PDOException' с сообщением 'SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка;

Однако , эти два варианта работают отлично:

function go($statement) {
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

    for($i = 1; $i < func_num_args(); $i++) {
        $q->bindValue($i, func_get_arg($i), PDO::PARAM_INT);
    }
    $q->execute();
}

(Это глупо, но только для теста)

function go($statement) {
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

    $arg_to_pass = func_get_arg(1);
    $q->bindParam(1, $arg_to_pass, PDO::PARAM_INT);

    $arg_to_pass2 = func_get_arg(2);
    $q->bindParam(2, $arg_to_pass2, PDO::PARAM_INT);

    $q->execute();
}

Так почему же bindParam не работает внутри цикла?

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Я предполагаю, что это потому, что вы нарушаете привязку - вы извлекаете аргумент в $arg_to_pass, а затем связываете его.На следующей итерации вы извлекаете другой аргумент в ту же переменную (которая теперь связана как параметр # 1) и пытаетесь повторно связать его как параметр # 2.Все остальные версии используют уникальные имена аргументов (прямое возвращаемое значение из func_get_args, разные имена переменных и т. Д.).

0 голосов
/ 21 июля 2011

Я не уверен, почему вы получаете это сообщение, но я бы сказал, что проблема в том, что вы пытаетесь использовать PDOStatement :: bindParam (), который связывается как ссылка и получает только значение переменной однако при вызове PDOStatement :: execute () к этому времени исходная переменная была перезаписана новым значением.

Либо используйте PDOStatement :: bindValue (), чтобы значение копировалось в цикл, либо используйте уникальные ссылки на переменные с помощью bindParam.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...