Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 准备好的语句不能使用整数值执行多次_Php_Sql Server_Pdo_Odbc_Prepared Statement - Fatal编程技术网

Php 准备好的语句不能使用整数值执行多次

Php 准备好的语句不能使用整数值执行多次,php,sql-server,pdo,odbc,prepared-statement,Php,Sql Server,Pdo,Odbc,Prepared Statement,如何使用不同的整数值正确地重新执行准备好的语句 在重用ODBC准备的语句时,显式和隐式绑定PDO::PARAM_INT存在致命错误 创建表mytab( 上校, 瓦查尔(20) ); 作品:多个字符串 作品:单整数 不工作:多个整数 它实际上成功地插入了第一条记录1,但在下一次执行时尝试重用该语句时失败 PHP致命错误:未捕获PDOException:SQLSTATE[22018]:强制转换规范的无效字符值:206[Microsoft][ODBC Driver 13 for SQL Server

如何使用不同的整数值正确地重新执行准备好的语句

在重用ODBC准备的语句时,显式和隐式绑定
PDO::PARAM_INT
存在致命错误

创建表mytab(
上校,
瓦查尔(20)
);
作品:多个字符串 作品:单整数 不工作:多个整数 它实际上成功地插入了第一条记录
1
,但在下一次执行时尝试重用该语句时失败

PHP致命错误:未捕获PDOException:SQLSTATE[22018]:强制转换规范的无效字符值:206[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]操作数类型冲突:文本与int不兼容(SQLExecute[206]at/build/php7.0-lPMnpS/php7.0-7.0.8/ext/pdo_ODBC/ODBC_stmt.c:260)

我正在使用


我已经试着把整件事都包装起来

我也尝试过使用,但它抛出了完全相同的错误

作品 不起作用 我认为有趣的是,我在使用PHP5.6.9时得到了与此完全相同的错误。然而,他们甚至不能执行一条语句,所以我想知道,考虑到抛出错误的确切行已从移动到,是否存在部分补丁

变通办法 如果我在循环中准备语句,那么它工作得很好。但是我读到这是非常低效的,我应该能够重用该语句。我特别担心将其用于海量数据集。这样行吗?我能做些更好的事吗

$values = [1,3,5,7,9,11];
$sql = "INSERT INTO mytab (col) VALUES (:col)";
foreach ($values as $value){
  $stmt = $pdoDB->prepare($sql);
  $stmt->execute(['col'=>$value]);
}

对于准备好的语句,通常必须在循环外使用
bindParam

  • bindParam
    是一个单独的步骤
  • 设置绑定变量是一个可重复的步骤(循环)
  • 每次重复都必须运行
    execute
  • 我想,像这样的东西会有用的:

    $stmt = $pdoDB->prepare("INSERT INTO mytab (col, key) VALUES (:col, :key)");
    
    // bind params (by reference)
    $stmt->bindParams(":col", $col, PDO::PARAM_STR); //bind variable $col
    $stmt->bindParams(":key", $key, PDO::PARAM_INT); //bind variable $key
    
    $values = ['here','are','some','values'];
    foreach ($values as $i => $value) {
        $col = $value; //set col
        $key = $i; //set key
        $stmt->execute();
    }
    

    不知道这是否有帮助,但如果表只有一个int列,它是否可以工作?DavidG nope,我也明确地测试了它。如果在循环外绑定到某个var,它可以工作吗,然后在循环内部只更新该var的值并调用execute only?如果使用
    $stmt->execute(['col'=>intval($value]),它是否有效
    $values = [1,3,5,7,11];
    $sql = "INSERT INTO mytab (col) VALUES (:col)";
    $stmt = $pdoDB->prepare($sql);
    foreach ($values as $value)
      $stmt->execute(['col'=>$value]);
    
    $values = [1];
    $sql = "INSERT INTO mytab (col) VALUES (:col)";
    $stmt = $pdoDB->prepare($sql);
    foreach ($values as $value){
      $stmt->bindParam('col', $value, PDO::PARAM_INT);
      $stmt->execute();
    }
    
    $values = [1,2];
    $sql = "INSERT INTO mytab (col) VALUES (:col)";
    $stmt = $pdoDB->prepare($sql);
    foreach ($values as $value){
      $stmt->bindParam('col', $value, PDO::PARAM_INT);
      $stmt->execute();
    }
    
    $values = [1,3,5,7,9,11];
    $sql = "INSERT INTO mytab (col) VALUES (:col)";
    foreach ($values as $value){
      $stmt = $pdoDB->prepare($sql);
      $stmt->execute(['col'=>$value]);
    }
    
    $stmt = $pdoDB->prepare("INSERT INTO mytab (col, key) VALUES (:col, :key)");
    
    // bind params (by reference)
    $stmt->bindParams(":col", $col, PDO::PARAM_STR); //bind variable $col
    $stmt->bindParams(":key", $key, PDO::PARAM_INT); //bind variable $key
    
    $values = ['here','are','some','values'];
    foreach ($values as $i => $value) {
        $col = $value; //set col
        $key = $i; //set key
        $stmt->execute();
    }