3 回答

TA貢獻1817條經驗 獲得超14個贊
您不能將兩個變量綁定為一個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_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。
尋找mysqli-stmt.bind-param的解決方案nick9v

TA貢獻1829條經驗 獲得超6個贊
像這樣使用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;

TA貢獻1784條經驗 獲得超7個贊
通常情況下,這個問題太老了,無法提供遠程可靠的解決方案,但Google仍將訪客發(fā)送到這里。所以這是2019年及以后的答案。
我將從Mysqli準備的語句中為IN子句添加多個值的方式進行解釋:
首先,我們需要創(chuàng)建一個字符串,該字符串的?標記與數組中元素的數量一樣多。為此,我們將使用str_repeat()為此目的非常方便的功能。
然后,必須將帶有逗號分隔的問號的字符串添加到查詢中。盡管它是一個變量,但在這種情況下它是安全的,因為它僅包含常量值
那么該查詢必須像其他任何查詢一樣準備
那么我們將需要創(chuàng)建一個字符串,其類型將與bind_param()一起使用。注意,通常沒有理由對綁定變量使用不同的類型-mysql會很樂意接受它們全部作為字符串。有邊際案例,但極為罕見。對于日常使用,您可以始終保持簡單,并在所有內容中使用“ s”。str_repeat()再次救援。
那么我們需要將數組值綁定到該語句。不幸的是,您不能僅將其寫為單個變量,像這樣$stmt->bind_param("s", $array),只能使用標量變量bind_param()。幸運的是,有一個參數解包運算符可以完全滿足我們的需要-將值數組發(fā)送到函數中,就好像它是一組不同的變量一樣!
其余的與往常一樣-執(zhí)行查詢,獲取結果并獲取數據!
所以正確的示例代碼是
$array = ['Nashville','Knoxville']; // our array
$in = str_repeat('?,', count($array) - 1) . '?'; // placeholders
$sql = "SELECT name FROM table WHERE city IN ($in)";
$stmt = $mysqli->prepare($sql);
$types = str_repeat('s', count($array));
$stmt->bind_param($types, ...$array); // bind array at once
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$data = $result->fetch_all(MYSQLI_ASSOC); // fetch the data
盡管此代碼很大,但與迄今為止在本主題中提供的任何其他合理的解決方案相比,它是無與倫比的。
添加回答
舉報