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

最佳答案

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

关于php - PDO Mysql SQLSTATE [42000],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6779394/

10-11 07:43