mysqli bind_param для массива строк

Я не могу заставить это работать. Сейчас я потратил много часов на это.

Это работает:

$mysqli = new mysqli("localhost", "root", "root", "db"); if(!$mysqli || $mysqli->connect_errno) { return; } $query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')"; if($query_prepared && $query_prepared->prepare($query_str)) { $query_prepared->execute(); 

Но я не могу заставить его работать с bind_param следующим образом:

 $query_str= "SELECT name FROM table WHERE city IN (?)"; $query_prepared = $mysqli->stmt_init(); if($query_prepared && $query_prepared->prepare($query_str)) { $cities= explode(",", $_GET['cities']); $str_get_cities= "'".implode("','", $get_cities)."'"; // This equals 'Nashville','Knoxville' $query_prepared->bind_param("s", $cities); $query_prepared->execute(); 

Что я делаю не так?

Я также попробовал call_user_func_array , но, похоже, не верю , что синтаксис правильный. Любая помощь будет принята с благодарностью!

EDIT: Я тщательно пробовал предложения moskito-x и множество примеров, перечисленных здесь, а также где на SO и случайных веб-сайтах, и ничего не работает. Я думаю, что проблема может быть PHP 5.4, и это то, что мой MAMP установлен прямо сейчас.

Вы не можете связать две переменные с одним question mark !

Для каждой переменной, которую вы связываете, вам нужен один question mark

«bind_param» проверяет каждую переменную, соответствует ли она требованиям. после этого строковое значение помещается между кавычками.

Это не будет работать.

 "SELECT name FROM table WHERE city IN (?)"; ( becomes too ) $q_prepared->bind_param("s", $cities); "SELECT name FROM table WHERE city IN ('city1,city2,city3,city4')"; 

должно быть.

 "SELECT name FROM table WHERE city IN (?,?,?,?)"; ( becomes too ) $q_prepared->bind_param("ssss", $city1,$city2,$city3,$city4); "SELECT name FROM table WHERE city IN ('city1','city2','city3','city4')"; 

$query_prepared->bind_param кавычки строковых параметров $query_prepared->bind_param .
И число переменных и длина строковых типов должны соответствовать параметрам в инструкции.

 $query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')"; 

станет

 $query_str= "SELECT name FROM table WHERE city IN (?,?)"; 

теперь bind_param должен быть

 bind_param("ss",$arg1,$arg2) 

с этим

 $query_str= "SELECT name FROM table WHERE city IN (?)"; 

и bind_param с

 bind_param("s",$cities) 

Вы получаете

 $query_str= "SELECT name FROM table WHERE city IN ('Nashville,Knoxville')"; 

Вот почему массив не работает.
Единственным решением для этого факта является call_user_func_array

если вы инициируете заявление, следующее не нужно

 $query_prepared = $mysqli->stmt_init(); if($query_prepared && $query_prepared->prepare($query_str)) { 

Это верно

 $query_prepared = $mysqli->stmt_init(); if($query_prepared->prepare($query_str)) { 

если вы не хотите использовать call_user_func_array
и у вас есть только небольшое количество аргументов
вы можете сделать это со следующим кодом.

 [...] $cities= explode(",", $_GET['cities']); if (count($cities)>3) { echo "too many arguments"; } else { $count = count($cities); $SetIn = "("; for($i = 0; $i < $count; ++$i) { $code.='s'; if ($i>0) {$SetIn.=",?";} else {$SetIn.="?";} } $SetIn.=")"; $query_str= "SELECT name FROM table WHERE city IN ".$SetIn; // with 2 arguments $query_str will look like // SELECT name FROM table WHERE city IN (?,?) $query_prepared = $mysqli->stmt_init(); if($query_prepared->prepare($query_str)) { if ($count==1) { $query_prepared->bind_param($code, $cities[0]);} if ($count==2) { $query_prepared->bind_param($code, $cities[0],$cities[1]);} if ($count==3) { $query_prepared->bind_param($code, $cities[0],$cities[1],$cities[2]); // with 2 arguments $query_prepared->bind_param() will look like // $query_prepared->bind_param("ss",$cities[0],$cities[1]) } $query_prepared->execute(); } [...] } 

Я предлагаю вам попробовать его с помощью call_user_func_array .

искать решение nick9v
MySQLi-stmt.bind-пары

используйте call_user_func_array следующим образом:

 $stmt = $mysqli->prepare("INSERT INTO t_file_result VALUES(?,?,?,?)"); $id = '1111'; $type = 2; $result = 1; $path = '/root'; $param = array('siis', &$id, &$type, &$result, &$path); call_user_func_array(array($stmt, 'bind_param'), $param); $stmt->execute(); printf("%d row inserted. \n", $stmt->effected_rows); $stmt->close; 

У меня тоже были проблемы с этим, и он работал с eval прежде чем узнал, что большинство людей используют call_user_func_array

 $fields = array('model','title','price'); // fields in WHERE clause $values = array( // type and value for each field array('s','ABCD-1001'), array('s','[CD] Test Title'), array('d','16.00') ); $sql = "SELECT * FROM products_info WHERE "; // start of query foreach ($fields as $current){ // build where clause from fields $sql .= '`' . $current . '` = ? AND '; } $sql = rtrim($sql,'AND '); // remove last AND $stmt = $db->prepare($sql); $types = ''; $vals = ''; foreach ($values as $index => $current_val){ // build type string and parameters $types .= $current_val[0]; $vals .= '$values[' . $index . '][1],'; } $vals = rtrim($vals,','); // remove last comma $sql_stmt = '$stmt->bind_param("' . $types . '",' . $vals . ');'; // put bind_param line together eval($sql_stmt); // execute bind_param $stmt->execute(); $stmt->bind_result($col1,$col2,$col3,$col4,$col5,$col6); // this could probably also be done dynamically in the same way while ($stmt->fetch()){ printf("%s %s %s %s %s %s\n", $col1,$col2,$col3,$col4,$col5,$col6); }