2012-05-18 72 views
3

我很熟悉老的php mysql擴展。是否有可能將mysqli準備語句與多個插入?

我正在使用mysqli擴展的第一個腳本。

我將要插入大量的行到動態生成的表中。

是否可以使用預先準備的語句將多行插入到表中,而無需事先知道每次將要插入的新行數?

$stmt = $mysqli->prepare("INSERT INTO `activity` (`id`, `name`, `type`) VALUES ?, ?, ?;"); 

如果這是不可能的,這將是更有效的:

  1. 事先準備好的聲明,同時
  2. 非事先準備好的聲明一行,約50行同時

    // prepared statement 
    
    $stmt = $mysqli->prepare("INSERT INTO `activity` (`id`, `name`, `type`) VALUES (?, ?, ?)"); 
    
    for($i=0;$i<$limit;$i++) 
    
    { 
    
        $stmt->bind_param('iss', $id[$i], $name[$i], $type[$i]); 
    
        $stmt->execute(); 
    
    } 
    
    
    // non-prepared statement 
    
    $query = "INSERT INTO `activity` (`id`, `name`, `type`) VALUES "; 
    
    for($i=0;$i<$limit;$i++) 
    
    { 
    
        $query .= "\n(".$mysqli->real_escape_string($id[$i]), $mysqli->real_escape_string($name[$i]), $mysqli->real_escape_string($type[$i])."),"; 
    
    } 
    
    $query = substr($query, 0, -1).';'; 
    

PHP v.5.3.8

MySQL的訴5.1.60

+0

+1切換到mysqli ...你寫的第一個選項不會工作...至於速度,你可以在本地測試它並找出:D我有興趣知道 –

+0

你解答了你的問題你自己。對於每對值,綁定值並執行語句。 Idk爲什麼你首先要問。 –

回答

2
$stmt = $mysqli->stmt_init(); 

if($stmt->prepare("INSERT INTO `activity` (`id`, `name`, `type`) VALUES (?, ?, ?)")) 
{ 
    $stmt->bind_param('iss', $_id, $_name, $_type); 
    for($i=0;$i<$limit;$i++) 
    { 
     $_id = $id[$i]; 
     $_name = $name[$i]; 
     $_type = $type[$i]; 
     $stmt->execute(); 
    } 

} 

應該爲你做吧!

+0

我的問題不是我需要做多個插入,而是我需要一個可變數量的參數用於一個語句。例如,一次運行陳述我會有三個值字段,下一次運行我會有五個值字段。 – Patrick

+0

對不起,我剛剛重讀我的問題,我意識到你確實回答了我問的問題,而不是我想過的問題:-) – Patrick

+0

他的問題是關於一個構造語句與所有插入語之間的性能差異和一個執行準備好的語句的循環。 – Barmar