代码之家  ›  专栏  ›  技术社区  ›  Javier Parra

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

  •  1
  • Javier Parra  · 技术社区  · 14 年前

    这是我使用的代码:

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

    当$query和类型为:

    //$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 回复  |  直到 14 年前
        1
  •  3
  •   Pascal MARTIN    14 年前

    如果你 self::$DB->prepare 方法正在实际调用 PDO::prepare 确保你没有通过 $types 参数作为第二个参数 PDO::准备

    从文档中判断,第二个参数 PDO::准备 预期是一个选项数组,而不是描述每个占位符的数据类型的数组。


    您尝试执行这部分代码:

    var_dump(PDO::ATTR_STATEMENT_CLASS);
    

    您将得到这个输出:

    int 13
    


    哪种解释错误:

    • 你想传给 PDO::准备 数组作为第二个参数
    • PDO::准备 期望该数组包含选项列表
    • 你有一个带键的元素 13 在你的阵列中
    • 十三 PDO::ATTR_STATEMENT_CLASS
    • PDO::preapre 期望为 pdo::attr_语句_类 选项
      • 像一些与 array(classname, array(ctor_args)); 从你的错误信息判断
    • 你路过了 integer 而不是那个
    • 所以你会得到一个错误。


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

    如果你的 self::$DB 实际上是PDO的一个实例,我没有找到一个方法可以让您一次指定所有参数的类型——似乎您必须为每个参数指定类型,每次调用 bindParam bindValue .

        2
  •  0
  •   middus    14 年前

    如果您不太关心类型(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);
    

    请参见P定位 execute 方法。