我必须使用IN
运算符从数据库中选择一些行。我想用准备好的声明来做。这是我的代码:
<?php
$lastnames = array('braun', 'piorkowski', 'mason', 'nash');
$in_statement = '"' . implode('", "', $lastnames) . '"'; //"braun", "piorkowski", "mason", "nash"
$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN (?)');
$data_res->bind_param('s', $in_statement);
$data_res->execute();
$result = $data_res->get_result();
while ($data = $result->fetch_array(MYSQLI_ASSOC)) {
...
}
?>
但是,尽管数据库中存在所有数据,但不返回任何内容。
还有一个:如果我直接通过$in_statement
查询并执行它,将返回数据。所以问题出现在准备工作上。
我在谷歌寻找这个问题,但并没有“成功”。我的代码出了什么问题?
感谢您的帮助!
答案 0 :(得分:5)
我最近为我的问题找到了解决方案。也许这不是最好的方法,但它很好用!证明我错了:)
<?php
$lastnames = array('braun', 'piorkowski', 'mason', 'nash');
$arParams = array();
foreach($lastnames as $key => $value) //recreate an array with parameters explicitly passing every parameter by reference
$arParams[] = &$lastnames[$key];
$count_params = count($arParams);
$int = str_repeat('i',$count_params); //add type for each variable (i,d,s,b); you can also determine type of the variable automatically (is_int, is_float, is_string) in loop, but i don't need it
array_unshift($arParams,$int);
$q = array_fill(0,$count_params,'?'); //form string of question marks for statement
$params = implode(',',$q);
$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN ('.$params.')');
call_user_func_array(array($data_res, 'bind_param'), $arParams);
$data_res->execute();
$result = $data_res->get_result();
while ($data = $result->fetch_array(MYSQLI_ASSOC)) {
...
}
$result->free();
$data_res->close();
?>
答案 1 :(得分:2)
准备好的陈述旨在完全避免你想要做的事情:)
要实现此目的,您必须应用此步骤:
$escaped_lastnames = join(',', array_map(array($_DB, 'real_escape_string'), $lastnames));
它为$lastnames
的每个项目映射数据库的正确字符串转义函数。完成后,将此值直接插入查询中,即不使用绑定参数。