我已经构建了一个函数,它将准备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在循环中不起作用?
答案 0 :(得分:1)
我猜这是因为你打破了绑定 - 你将一个参数提取到$arg_to_pass
,然后绑定它。在下一次迭代中,您将另一个arg提取到同一个变量(现在绑定为参数#1)并尝试将其重新绑定为参数#2。其他版本都使用唯一的参数名称(来自func_get_args的直接返回值,不同的var名称等等)。
答案 1 :(得分:0)
我不确定你为什么要收到这条消息,但我会说问题是你正在尝试使用PDOStatement :: bindParam(),它绑定为引用并只获取变量的值当你调用PDOStatement :: execute()时,那时原始变量已被新值覆盖。
使用PDOStatement :: bindValue(),因此该值在循环中复制,或者使用带有bindParam的唯一变量引用。