PDO Mysql SQLSTATE [42000]

时间:2011-07-21 16:22:45

标签: php mysql pdo

我已经构建了一个函数,它将准备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在循环中不起作用?

2 个答案:

答案 0 :(得分:1)

我猜这是因为你打破了绑定 - 你将一个参数提取到$arg_to_pass,然后绑定它。在下一次迭代中,您将另一个arg提取到同一个变量(现在绑定为参数#1)并尝试将其重新绑定为参数#2。其他版本都使用唯一的参数名称(来自func_get_args的直接返回值,不同的var名称等等)。

答案 1 :(得分:0)

我不确定你为什么要收到这条消息,但我会说问题是你正在尝试使用PDOStatement :: bindParam(),它绑定为引用并只获取变量的值当你调用PDOStatement :: execute()时,那时原始变量已被新值覆盖。

使用PDOStatement :: bindValue(),因此该值在循环中复制,或者使用带有bindParam的唯一变量引用。