Подготовленные операторы php с массивом

У меня есть функция, чтобы сделать простую вставку, но я пытаюсь сделать метод более надежным, передав массив. и это массив, в который я перехожу:

$form_data = array( "sort_order"=>$_POST['sort_order'], "name"=>$_POST['page_name'], "text"=>$_POST['page_text'], "image"=>$_POST['page_image'], "meta_desc"=>$_POST['meta_desc'], "meta_kw"=>$_POST['meta_kw'], "meta_author"=>$_POST['meta_author'], "image_thumb"=>"NULL", ); 

вот код функции:

 public function insert_data($array){ $keys = array(); $values = array(); foreach($array as $k => $v){ $keys[] = $k; if(!empty($v)){ $values[] = $v; } else { $values[] = "NULL"; } } $stmt = self::$mysqli->stmt_init(); $query = "INSERT INTO `".DB_TABLE_PAGES."` (".implode(",",$keys).") VALUES (?,?,?,?,?,?,?,?)"; $stmt->prepare($query); $stmt->bind_param('ssssssss',implode(",",$values)); //$stmt->execute(); } 

но я получаю эту ошибку: Количество элементов в строке определения типа не соответствует числу переменных связывания.

Я знаю, в чем проблема, но я не понимаю, как я могу это достичь.

у меня есть googled и наткнулся на эту тему:

ссылка на нить

Может ли кто-нибудь помочь мне разобраться с этим?

большое спасибо

Solutions Collecting From Web of "Подготовленные операторы php с массивом"

Попробуй это:

 public function insert_data($array){ $placeholders = array_fill(0, count($array), '?'); $keys = $values = array(); foreach($array as $k => $v) { $keys[] = $k; $values[] = !empty($v) ? $v : null; } $stmt = self::$mysqli->stmt_init(); $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. '('.implode(',', $keys).') VALUES '. '('.implode(',', $placeholders).')'; $stmt->prepare($query); call_user_func_array( array($stmt, 'bind_param'), array_merge( array(str_repeat('s', count($values))), $values ) ); $stmt->execute(); } 

Или еще лучше использовать PDO:

 public function insert_data($array){ $placeholders = array_fill(0, count($array), '?'); $keys = $values = array(); foreach($array as $k => $v){ $keys[] = $k; $values[] = !empty($v) ? $v : null; } // assuming the PDO instance is $pdo $query = 'INSERT INTO `'.DB_TABLE_PAGES.'` '. '('.implode(',', $keys).') VALUES '. '('.implode(',', $placeholders).')'; $stmt = $pdo->prepare($query); $stmt->execute($values); } 

Примечание. Я использовал null константу, потому что строка "NULL" будет экранирована как строка (а не как нулевое значение).

Вместо bind_param (который, на мой взгляд, все время запутывает), просто выполните:

 $stmt->execute($values); 

Вы также можете избавиться от своего цикла, используя array_keys () и array_values ​​()

Хотя это старый вопрос, который он обнаружил в нескольких моих поисках, чтобы найти красноречивый ответ на ту же проблему. После долгих поисков и реализации решения, предоставленного @netcoder, я нашел что-то более кратким.

Отказ от ответственности, это для php 5.6 с использованием оператора распаковки (splat):

 public function genericQueryWithParams($query, $params, $types) { $db = new mysqli('localhost','username','password','schema'); if($sql = $db->prepare($query)) { $sql->bind_param($types, ...$params); $sql->execute(); return $sql->get_result(); } }