我需要爲網頁創建動態查詢。用戶可以選擇他們想要搜索的類別(SQL數據庫中的列名)以及他們正在查找的值。我運行了一些類似的帖子在stackoverflow和其他網站,但我無法找到解決方案。我使用下面的代碼(它用於測試,所以我在類別名稱和值中寫入的類別)。如果我不嘗試動態綁定參數,查詢效果很好,我可以打印$ tester數組的值。這個問題可以解決什麼問題?我想問題是'call_user_func_array ...'部分。PHP,mysqli:動態預處理語句不起作用
$stmt = mysqli_stmt_init($conn);
//The category names and variable names
$cat1 = "LCVAR";
$cat2 = "APOLG";
$LCVAR = "KALOCSA";
$APOLG = "magyar";
//creating the statement
$statement = "SELECT VNEV,KNEV FROM TORZS WHERE ";
$statement = $statement . " " . $cat1 . " ". "=?". " ". "AND" . " ";
$statement = $statement . " " . $cat2 . " ". "=?";
//SELECT VNEV,KNEV FROM TORZS WHERE LCVAR =? AND APOLG =?
mysqli_stmt_prepare($stmt,$statement);
$a_params = array();
$a_param_type = array("s","s");
$a_bind_params = array($cat1 => $LCVAR,$cat2 => $APOLG);
$param_type = '';
// creating array for call_user_function_array
$n = count($a_param_type);
for($i = 0; $i < $n; $i++) {
$param_type .= $a_param_type[$i];
}
$a_params[] = &$param_type;
for($i = 0; $i < $n; $i++) {
$a_params[] = &$a_bind_params[$i];
}
call_user_func_array(array($stmt,'mysqli_stmt_bind_param'),$a_bind_params);
mysqli_stmt_execute($stmt);
$result = array();
mysqli_stmt_bind_result($stmt, $result['VNEV'], $result['KNEV']);
$tester = array();
while(mysqli_stmt_fetch($stmt)){
$tester[] = array($result['VNEV'],$result['KNEV']) ;
}
EDIT 1:
print_r($stmt)
的結果:
print_r($a_bind_params)
mysqli_stmt Object
([affected_rows] => 0
[insert_id] => 0
[num_rows] => 0
[param_count] => 2
[field_count] => 2
[errno] => 0
[error] =>
[error_list] => Array ()
[sqlstate] => 00000
[id] => 1)
:
Array ([LCVAR] => KALOCSA
[APOLG] => magyar)
什麼問題? 「不工作」非常模糊。你做了什麼來調試它?在將它們傳遞給'mysqli_stmt_prepare'以查看它們是否正確之前,您是否查看了生成的查詢? – Quentin
是的,我查了查詢。如果我不動態地嘗試綁定參數,並且我在「靜態」語句中給出參數,則一切正常。我想這個問題可能是'call_user_func_array(array($ stmt,'mysqli_stmt_bind_param'),$ a_bind_params)'部分。 –
我之前寫過,查詢本身在這種狀態下正常工作。當我想使用動態參數綁定並使用call_user_func_array時,問題就開始了。 –