这是我正在使用的代码:
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个占位符都会失败。
答案 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
的元素13
是PDO::ATTR_STATEMENT_CLASS
PDO::preapre
需要针对PDO::ATTR_STATEMENT_CLASS
选项的特定内容
array(classname, array(ctor_args));
对应的内容,从错误消息判断integer
而不是
不确定如何使用您正在使用的类指定每个绑定参数的类型 - 但它似乎不是prepare
的第二个参数; - )
而且,如果您的self::$DB
确实是PDO的一个实例,我找不到一个允许您一次指定所有参数类型的方法 - 似乎您必须指定类型每次调用bindParam
或bindValue
时的每个参数。
答案 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方法。