![](/img/trans.png)
[英]How to insert an array into a single MySQL Prepared statement w/ PHP and PDO
[英]PHP - MySQL prepared statement to INSERT an array
我正在編輯使用MySQLi的腳本。 我需要使用准備好的語句將一些值插入數據庫。
我的數組形式為:
$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
不...由於使用mysqli_stmt_bind_param()的工作原理,這絕對比使用任何數組的PDO難。。。通過將$array
更改$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。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
我認為這是您要尋找的:
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);
用bind_param插入數組很痛苦,我建議使用php的filter_var函數。 它執行相同的過濾,並驗證變量,輸入及其完善。 功能手冊頁
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.