Я не могу заставить это работать. Сейчас я потратил много часов на это.
Это работает:
$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); }