2013-10-29 75 views
2

我正在編輯使用MySQLi的腳本。我需要使用準備好的語句將一些值插入到數據庫中。PHP - MySQL準備好的語句來插入數組

我的陣列的形式:

$insert = array('column1' => 'value1', 'column2' => 'value2', 'column3' => 'value3') 

我有這到目前爲止,但我需要與bind_param部分幫助。我在這裏看到了使用call_user_func_array的文檔,但我不確定如何實現這一點。

$cols = array_keys($insert); 
$query = "INSERT IGNORE INTO results (". implode(", ", $cols) .") VALUES (". implode(', ', array_fill(0, count($insert), '?')) .")"; 
$stmt = $mysqli->prepare($query); 
$param = array_merge(array(str_repeat('s', count($insert))), array_values($insert)); 
call_user_func_array(array($stmt, 'bind_param'), $param); 
$stmt->execute(); 

PHP 5.4.17

+2

PHP.net文檔做了很好的解釋功能:http://php.net/manual/en/mysqli-stmt.bind-param.php – SamA

+0

謝謝,但那是我的第一個目的地。我一直無法完全弄清楚。 – atb

+0

@allanb,在SamA的鏈接中查看帶有ReflectionClass(上面的評論)例子的評論。 – Arantir

回答

6

不......這肯定是難度比PDO與因爲如何mysqli_stmt_bind_param()工程的任何陣列...這可以通過更改$array來移除/添加其他列的數據。

$mysqli = new mysqli('localhost', 'root', 'password', 'test'); 

$array = array("name"=>"pineapple", "color"=>"purple"); 

$table_name = "fruit"; 



insert_data($mysqli, $array, $table_name); 



function insert_data($mysqli, $array, $table_name) 
{ 
    $placeholders = array_fill(0, count($array), '?'); 

    $keys = array(); 
    $values = array(); 
    foreach($array as $k => $v) { 
     $keys[] = $k; 
     $values[] = !empty($v) ? $v : null; 
    } 

    $query = "insert into $table_name ". 
      '('.implode(', ', $keys).') values '. 
      '('.implode(', ', $placeholders).'); '; 
    // insert into fruit (name, color) values (?, ?);  

    $stmt = $mysqli->prepare($query); 

    // create a by reference array... 
    $params = array(); 
    foreach ($array as &$value) { 
     $params[] = &$value; 
    } 
    $types = array(str_repeat('s', count($params))); 
    $values = array_merge($types, $params); 

    /*   
    $values = Array 
     (
      [0] => ss 
      [1] => pineapple 
      [2] => purple 
    ) 
    */ 

    call_user_func_array(array($stmt, 'bind_param'), $values); 

    $success = $stmt->execute(); 

    if ($success) { print "it worked..."; } 
      else { print "it did not work..."; } 
} 

我從這些職位SO一些幫助:
- https://stackoverflow.com/a/15933696/623952
- https://stackoverflow.com/a/6179049/623952


所以......在$stmt->bind_param()的第一個參數是有一個字符爲每個參數字符串傳入。並且該char代表參數數據類型。在上面的例子中,兩個參數都是字符串,所以它變成了ss。在上面的例子中總是假定一個字符串。

我發現這個圖的bind_param()文檔中:

類型
,它包含可指定該類型對應的綁定變量的一個或多個字符的字符串:

Type specification chars 

Character Description 
i   corresponding variable has type integer 
d   corresponding variable has type double 
s   corresponding variable has type string 
b   corresponding variable is a blob and will be sent in packets 
+0

這是PDO,而問題是關於mysqli。 – eggyal

+0

哦!這對我來說幾乎更容易......我只是做了很多工作而已。大聲笑...持有 –

+0

Thx。但'警告:call_user_func_array()期望參數1是有效的回調函數,第一個數組成員不是有效的類名或對象,這是我嘗試這樣做時得到的。 – atb

0

我認爲這是你在找什麼:

cols = array_keys($insert); 
$query = "INSERT INTO results (". implode(", ", $cols) .") VALUES (". str_repeat('?', count($insert)) .")"; 
$stmt = $mysqli->prepare($query); 

call_user_func_array('mysqli_stmt_bind_param', array_merge (array($stmt, str_repeat('s', count($insert))), $insert); 
+1

請小心使用逗號分隔'?'佔位符。 – eggyal

0

插入陣列與bind_param很痛苦,我推薦使用php的filter_var函數。它執行相同的過濾,並驗證變量,輸入,它的完美。 function manual page