【发布时间】:2016-09-03 19:54:06
【问题描述】:
我需要为网页创建动态查询。用户可以选择他们想要搜索的类别(SQL 数据库中的列名)以及他们要查找的值是什么。我在 stackoverflow 和其他网站上浏览了一些类似的帖子,但我找不到解决方案。我使用下面的代码(它是为了测试,所以我在类别名称和值中写了类别)。如果我不尝试动态绑定参数查询效果很好,我可以打印 $tester 数组的值。这个问题的解决方案是什么?我想问题出在“call_user_func_array ...”部分。
$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']) ;
}
编辑 1:
print_r($stmt) 的结果:
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 )
print_r($a_bind_params) 的结果:
Array ( [LCVAR] => KALOCSA
[APOLG] => magyar )
【问题讨论】:
-
有什么问题? “不起作用”非常模糊。你做了什么来调试它?在将生成的查询传递给
mysqli_stmt_prepare之前,您是否查看过它们是否正确? -
是的,我检查了查询。如果我不尝试动态绑定参数并且在“静态”语句中给出参数,那么一切正常。我想问题可能出在 'call_user_func_array(array($stmt,'mysqli_stmt_bind_param'),$a_bind_params)' 部分。
-
我之前写过,查询本身在这种状态下工作正常。当我想使用动态参数绑定并且我使用 call_user_func_array 时,问题就开始了。
标签: php mysql mysqli prepared-statement