我需要为网页创建动态查询。用户可以选择他们想要搜索的类别(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时,问题就开始了。 –