У меня есть функция, чтобы сделать простую вставку, но я пытаюсь сделать метод более надежным, передав массив. и это массив, в который я перехожу:
$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 и наткнулся на эту тему:
ссылка на нить
Может ли кто-нибудь помочь мне разобраться с этим?
большое спасибо
Попробуй это:
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(); } }