2013-10-09 93 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"; 
    } 
}