我需要为网页创建动态查询。用户可以选择要搜索的类别(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 )
答案 0 :(得分:0)
来自PHP Manual page for bind_param
:
注意:
将mysqli_stmt_bind_param()与call_user_func_array()结合使用时必须小心。注意 mysqli_stmt_bind_param()需要传递参数 引用,而call_user_func_array()可以接受作为参数a 可以表示引用或值的变量列表。
除此之外,没有人可以为您提供更清晰的解决方案,因为您需要准确地告诉我们问题是什么,PHP error log告诉您的内容以及MySQLi stmt error所说的内容。
如果您可以输出您的SQL查询实际上是什么(print_r($stmt)
)以及您的绑定参数实际是什么(print_r($a_bind_params)
),那么对您自己和我们也可能有所帮助。
编辑您的问题并添加这些详细信息,我确信解决方案将是显而易见的。
P.s由Fred-ii引用,您可以使用:
简化$statement
$statement = $statement . " " . $cat1 . " ". "=?". " ". "AND" . " ";
成为:
$statement .= " " . $cat1 . " ". "=?". " ". "AND" . " ";
每次应用这个(我可以看到两次),你声明变量值包含值前面的变量,这就是.=
语法为你做的。