【问题标题】:Error inserting multiple values with mysqli prepared statement使用 mysqli 准备语句插入多个值时出错
【发布时间】:2017-04-10 12:40:58
【问题描述】:

当我尝试使用准备好的语句将多个值插入 mysql 数据库时出现错误。

我不断收到此错误:

警告:mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配。

我认为它将$data 视为一个值,我现在不知道该怎么办

$keys = (?, ?, ?);
$types = "iii";
$data = "1, 3, 500";
if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?),$keys")) {
    $ortype = 1;     
    $stmt2->bind_param("iii".$types, $userid, $ortype, $amount, $data);
    $stmt2->execute();
    $stmt2->close();
} 

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    试试这个逻辑,看看是否有效:)

    $data = array(array(1,3,5), array(2,4,6));
    $sql = 'INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)';
    
    if($stmt = $conn->prepare($sql)){
    
    $stmt->bind_param("iii", $usr, $type, $amt);
    
    foreach ($data as $v) {
    
    $usr = $v[0];
    $type = $v[1];
    $amt = $v[2];
    
    $stmt->execute();
    
    if($stmt->insert_id <= 0){
    trigger_error('Insert fail. Error: ' . $stmt->error);
    break;
    }
    }
    $stmt->close();
    $conn->close();
    }
    else{
    trigger_error('Prepare fail.');
    }
    

    【讨论】:

      【解决方案2】:

      我认为它将 $data 视为单个值

      是的,当然。如果它以任何方式单个值,为什么它会这样做?

      我现在不知道该怎么办

      嗯,你能做的最好的事情就是问一个问题。 不是你在这里问的那个存根,而是一个真正的问题,解释你想做什么以及为什么。由于没有这样的问题,我们只能猜测您需要进行多次插入,但需要一些特殊的方式。

      为此,请创建一个 单个 数组来保存所有数据。

      $data = [];
      $data[] = $userid;
      $data[] = $ortype;
      $data[] = $amount;
      $data[] = 1;
      $data[] = 3;
      $data[] = 500;
      $count = count($data);
      

      然后用占位符创建一个字符串

      $values = implode(',', array_fill(0,  $count, '(?, ?, ?)'));
      

      然后创建一个带类型的字符串

      $types = str_repeat("iii", $count);
      

      最后创建您的查询并执行它

      $stmt = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES $values");
      $stmt->bind_param($types, ...$data);
      $stmt->execute();
      

      【讨论】:

        【解决方案3】:

        您正在尝试绑定变量,但您手动分配它们。除此之外,您的参数数量不匹配。

        您有 3 个占位符、3 个类型定义和 4 个值。它们是一对一的关系,因此类型定义的数量(您的iii)需要与占位符的数量? 和您绑定的值的数量(按占位符的顺序)相匹配。

        // $keys = (?, ?, ?); // Removed this, syntax error and you bind it manually anyway later
        // $types = "iii"; // You bind it manually later
        $data = "1, 3, 500";
        
        // Removed ',$keys' from your query, you manually put the placeholders
        if ($stmt2 = $conn->prepare("INSERT INTO tranx (user, type, amount) VALUES (?, ?, ?)")) {
            $ortype = 1;
        
            // removed '.$types' - you bind it manually
            // Also removed $data - you have 3 values, 3 columns, not 4
            $stmt2->bind_param("iii", $userid, $ortype, $amount);
            $stmt2->execute();
            $stmt2->close();
        }
        

        是的,您的$data 是一个值,而不是参数列表。

        文档也有很好的例子。

        参考文献

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-13
          • 2014-03-16
          • 2014-03-29
          • 1970-01-01
          相关资源
          最近更新 更多