PDO未能准备超过13个占位符的声明

时间:2010-03-16 17:16:21

标签: php pdo

这是我正在使用的代码:

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

当$ 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 个答案:

答案 0 :(得分:3)

如果self::$DB->prepare方法实际上正在调用PDO::prepare,请确保您没有将$types参数作为第二个参数传递给PDO::prepare

从文档来看,PDO::prepare期望的第二个参数是一个选项数组 - 而不是描述每个占位符的数据类型的数组。


并且您尝试执行这部分代码:

var_dump(PDO::ATTR_STATEMENT_CLASS);

你会得到这个输出:

int 13


哪种解释错误:

  • 您正尝试传递给PDO::prepare和数组作为第二个参数
  • PDO::prepare期望该数组包含选项列表
  • 您的数组中有一个键13的元素
  • 13PDO::ATTR_STATEMENT_CLASS
  • PDO::preapre需要针对PDO::ATTR_STATEMENT_CLASS选项的特定内容
    • array(classname, array(ctor_args));对应的内容,从错误消息判断
  • 您正在传递integer而不是
  • 所以你得到一个错误。


不确定如何使用您正在使用的类指定每个绑定参数的类型 - 但它似乎不是prepare的第二个参数; - )

而且,如果您的self::$DB确实是PDO的一个实例,我找不到一个允许您一次指定所有参数类型的方法 - 似乎您必须指定类型每次调用bindParambindValue时的每个参数。

答案 1 :(得分:0)

如果您不太关心类型,可以执行以下操作(AFAIK,它们都是PDO :: PARAM_STR;当您不使用bindValue / bindParam时,不能指定它们):< / p>

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

请参阅PDOStatement的execute方法。