2013-10-09 91 views
2

我用一个很简单的插入语句如何使用预处理语句

INSERT INTO table (col1, col2, col3) VALUES (1,2,3), (4,5,6), (7,8,9), ... 

目前插入多行,包含要插入值查询的部分是在一个循环中构造一个单独的字符串。

如何使用预准备语句插入多行?

编辑:我找到了这段代码。但是,这会为每一行执行一个单独的查询。这不是我正在寻找的。

$stmt = $mysqli->stmt_init(); 
if ($stmt->prepare("INSERT INTO table (col1, col2, col3) VALUES (?,?,?)")){ 
    $stmt->bind_param('iii', $_val1, $_val2, $_val3); 
    foreach($insertedata as $data){ 
     $_val1 = $data['val1']; 
     $_val2 = $data['val2']; 
     $_val3 = $data['val3']; 
     $stmt->execute(); 
    } 
} 

编辑#2:我的值来自可变长度的多维数组。

$values = array(array(1,2,3), array(4,5,6), array(7,8,9), ...); 
+0

插入查询与多个值条款,就像任何其他常规查询。意味着你只需要准备和运行它。 –

+0

你如何得到值(1,2,3),(4,5,6),(7,8,9)。它是从任何循环? – Shafeeque

+0

我想要插入多个值集,如(1,2,3),(4,5,6),(7,8,9)等。这些值来自可变长度的多维数组。 – eevaa

回答

0

这通常只是当我为包含IN子句的查询编写准备语句时使用的技术。无论如何,我已经调整它以形成一个准备好的查询(而不是迭代准备的查询),并且我测试了它在我的服务器上的成功。这个过程有点复杂,我不知道是否会有速度上的优势(没有基准)。这实际上不是开发人员在生产中所反映的那种类型。

代码:

if(!$mysqli=mysqli_connect($config[0],$config[1],$config[2],$config[3])){ 
    echo "connection bonk"; 
}else{ 
    $array=[[1,2,3],[4,5,6],[7,8,9]]; // sample indexed array of indexed arrays 
    $params=[]; 
    foreach($array as $row){ 
     $parentheticals[]='('.implode(',',array_fill(0,sizeof($row),'?')).')'; // build parentheticals 
     $params=array_merge($params,$row); // flatten actual values to 1-dim array 
    } 
    $values=implode(',',$parentheticals); 
    $count=sizeof($params); // assuming you have balanced subarrays 

    if($stmt=$mysqli->prepare("INSERT INTO test (col1, col2, col3) VALUES $values")){ 
     array_unshift($params,str_repeat('i',$count)); // prepend the type values string 
     $ref=[]; // add references 
     foreach($params as $i=>$v){ 
      $ref[$i]=&$params[$i]; // pass by reference as required/advised by the manual 
     } 
     call_user_func_array([$stmt,'bind_param'],$ref);  

     if($stmt->execute()){ 
      if($affrows=$mysqli->affected_rows){ 
       echo $affrows; // how many rows were inserted 
      }else{ 
       echo "error"; 
      } 
     }else{ 
      echo "execution bonk"; 
     } 
     $stmt->close(); 
    }else{ 
     echo "prepare bonk"; 
    } 
}