PDO не может подготовить заявление с более чем 13 заполнителями - PullRequest
1 голос
/ 16 марта 2010

это код, который я использую:

self::$DB->prepare($query, $types);

когда $ запрос и типы:

//$query
UPDATE Permisos
    SET                 
        empleado_id = ?,
        agregar_mensaje = ?,
        borrar_mensaje = ?,
        agregar_noticia = ?,
        borrar_noticia = ?,
        agregar_documento = ?,
        borrar_documento = ?,
        agregar_usuario = ?,
        borrar_usuario = ?,
        agregar_empresa = ?,
        borrar_empresa = ?,
        agregar_tarea = ?
    WHERE
        id = ?
//$types
Array(
    [0] => integer
    [1] => boolean
    [2] => boolean
    [3] => boolean
    [4] => boolean
    [5] => boolean
    [6] => boolean
    [7] => boolean
    [8] => boolean
    [9] => boolean
    [10] => boolean
    [11] => boolean
    [12] => integer
)

Все отлично работает, но когда они есть:

//$query
UPDATE Permisos SET                         
         empleado_id = ?,
         agregar_mensaje = ?,
         borrar_mensaje = ?,
         agregar_noticia = ?,
         borrar_noticia = ?,
         agregar_documento = ?,
         borrar_documento = ?,
         agregar_usuario = ?,
         borrar_usuario = ?,
         agregar_empresa = ?,
         borrar_empresa = ?,
         agregar_tarea = ?,
         borrar_tarea = ?
    WHERE
id = ?
//$types
Array(
        [0] => integer
        [1] => boolean
        [2] => boolean
        [3] => boolean
        [4] => boolean
        [5] => boolean
        [6] => boolean
        [7] => boolean
        [8] => boolean
        [9] => boolean
        [10] => boolean
        [11] => boolean
        [12] => boolean
        [13] => integer
    )

Сбой со следующим сообщением:

<b>Warning</b>:  PDO::prepare() [<a href='pdo.prepare'>pdo.prepare</a>]: SQLSTATE[HY000]: General error: PDO::ATTR_STATEMENT_CLASS requires format array(classname, array(ctor_args)); the classname must be a string specifying an existing class in <b>C:\wamp\www\intratin\JP\includes\empleado\mapper\Permiso.php</b> on line <b>137</b><br />


Неважно, какое поле я добавляю или удаляю, каждый раз происходит сбой с более чем 13 заполнителями.

Ответы [ 2 ]

3 голосов
/ 16 марта 2010

Если ваш self::$DB->prepare метод фактически вызывает PDO::prepare, убедитесь, что вы не передаете этот аргумент $types в качестве второго параметра PDO::prepare

Судя по документации, второй параметр, который PDO::prepare ожидает, - это массив параметров, а не массив, описывающий тип данных для каждого заполнителя.


И вы пытаетесь выполнить эту часть кода:

var_dump(PDO::ATTR_STATEMENT_CLASS);

Вы получите этот вывод:

int 13


Какой вид объясняет ошибку:

  • Вы пытаетесь передать PDO::prepare и массив в качестве второго параметра
  • PDO::prepare ожидает, что этот массив будет содержать список опций
  • В вашем массиве есть элемент с ключом 13
  • 13 is PDO::ATTR_STATEMENT_CLASS
  • PDO::preapre ожидает что-то конкретное для опции PDO::ATTR_STATEMENT_CLASS
    • как что-то, соответствующее array(classname, array(ctor_args));, судя по вашему сообщению об ошибке
  • Вы передаете integer вместо этого
  • Итак, вы получите ошибку.


Не уверен, как вы можете указать типы каждого связанного параметра с классом, который вы используете - но похоже, что это не второй параметр для prepare; -)

И, если ваш self::$DB действительно является экземпляром PDO, я не нахожу метод, который позволял бы вам указывать типы всех параметров одновременно - кажется, что вы должны указать тип для каждого параметра каждый раз, когда вы звоните, либо bindParam или bindValue.

0 голосов
/ 16 марта 2010

Вы можете сделать следующее, если вам не слишком важны типы (AFAIK, все они будут PDO :: PARAM_STR; вы не можете указать их, если не используете bindValue / bindParam):

$params = array('your', 'params', 'here', '...'); // just the params, not the type
$stmnt = self::$DB->prepare($query);
$stmnt->execute($params);

См. Метод PDOState execute .

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