在php页面中,我有一个数组,类似于:
$category = array(16, 22, 23);
然后我用准备好的语句进行数据库查询。我想获取字段category
包含$category
数组中的一个值且price
低于存储在变量$price
中的值的所有行。
除其他外,我阅读了this问题的答案,并尝试使用find_in_set()
,如此处所述(以及其他许多地方),但不知何故,我无法在准备中使其工作声明。我试过这个:
/* database connection "$db" is established beforehand and works */
if($ps = $db->prepare("
SELECT id, product, category, price
FROM products
WHERE price <= ? and find_in_set(?, category)
ORDER BY id") {
$ps->bind_param("ds", $price, $category);
$ps->execute();
$ps->bind_result($id, $name, $cat, $pr);
while($ps->fetch()) {
/* ... echo the results ..... */
}
$ps->free_result();
$ps->close();
}
但我得到一个空洞的结果。
如果我尝试在bind_param()
行中使用“dd”或“di”而不是“ds”,我会得到结果,但错误的结果 - 我得到的所有行都包含 1 < / em>的
我还尝试使用category IN ?
代替find_in_set(?, category)
,但这也无效。
我能做些什么来完成这项工作?任何帮助表示赞赏!
答案 0 :(得分:2)
两个问题:
该列表应作为第二个参数传递给find_in_set
,因此应该是:
find_in_set(category, ?)
该参数应为string类型(逗号分隔值)。因此,首先使用implode
将数组转换为这样的字符串:
$csv = implode(",", $category);
代码:
if($ps = $db->prepare("
SELECT id, product, category, price
FROM products
WHERE price <= ? and find_in_set(category, ?)
ORDER BY id") {
$csv = implode(",", $category);
$ps->bind_param("ds", $price, $csv);
$ps->execute();
$ps->bind_result($id, $name, $cat, $pr);
while($ps->fetch()) {
/* ... echo the results ..... */
}
$ps->free_result();
$ps->close();
}
答案 1 :(得分:1)
如果要查找$ category属于某个集合的值,请尝试使用IN。只是注意你不能像上面那样将数组传递给字符串。
另外,请不要忘记使用implode
将数组转换为CSV字符串$category = array(16, 22, 23);
$cat_str = implode(",",$category); //16,22,23
$ps = $db->prepare("
SELECT id, product, category, price
FROM products
WHERE price <= ? and category IN (?)
ORDER BY id") {
$ps->bind_param("ds", $price, $cat_str);
答案 2 :(得分:0)
如果我尝试相同的情况,那么我可能会像这样做
SELECT id, product, category, price
FROM products
WHERE category = '16' || category = '22' || category = '23' and price < $price`
我假设你的$category
数组变量是固定的,它不是动态附加值。
我只回答了你的查询部分。我希望你有PHP编码约定的想法,而不是把整个语句放在if
语句中。
如果仍有任何问题,请继续