PHP – MySQL подготовил оператор для INSERT массива

Я редактирую скрипт, который использует MySQLi. Мне нужно использовать подготовленный оператор для вставки некоторых значений в db.

Мой массив находится в форме:

$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

Нет … это было определенно сложнее 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() первый параметр представляет собой строку, которая имеет один символ для каждого переданного параметра. И этот символ представляет тип данных параметра. В приведенном выше примере оба этих параметра являются строками, поэтому он становится 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 является болезненным, я рекомендую использовать функцию filter_var php. он выполняет такую ​​же фильтрацию, а также проверяет переменные, входы, совершенствует их. справочная страница функции