值在数组中的准备语句
prepared statement where value is in array
在 php 页面中,我有一个数组,类似于:
$category = array(16, 22, 23);
然后我用准备好的语句进行数据库查询。我想获取字段 category
包含来自 $category
数组的值之一且 price
低于变量 $price
中存储的值的所有行。
除其他外,我阅读了 问题的答案,并尝试按照那里(以及许多其他地方)的描述使用 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.
的行
我也试过用category IN ?
代替find_in_set(?, category)
,但那也不行。
我该怎么做才能让它发挥作用?任何帮助表示赞赏!
两期:
列表应该作为 second 参数传递给 find_in_set
,所以它应该是:
find_in_set(category, ?)
该参数应为字符串类型(逗号分隔值)。因此,首先将您的数组转换为 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();
}
如果您想查找 $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);
如果我尝试同样的情况,那么我可能会这样做
SELECT id, product, category, price
FROM products
WHERE category = '16' || category = '22' || category = '23' and price < $price`
我假设您的 $category
数组变量是固定的,它不是动态附加值。
我只回答了你的查询部分。我希望您有 php 编码约定的想法,而不是将整个语句放在 if
语句中。
如果还有什么要问的,请继续
在 php 页面中,我有一个数组,类似于:
$category = array(16, 22, 23);
然后我用准备好的语句进行数据库查询。我想获取字段 category
包含来自 $category
数组的值之一且 price
低于变量 $price
中存储的值的所有行。
除其他外,我阅读了 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.
我也试过用category IN ?
代替find_in_set(?, category)
,但那也不行。
我该怎么做才能让它发挥作用?任何帮助表示赞赏!
两期:
列表应该作为 second 参数传递给
find_in_set
,所以它应该是:find_in_set(category, ?)
该参数应为字符串类型(逗号分隔值)。因此,首先将您的数组转换为
这样的字符串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();
}
如果您想查找 $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);
如果我尝试同样的情况,那么我可能会这样做
SELECT id, product, category, price
FROM products
WHERE category = '16' || category = '22' || category = '23' and price < $price`
我假设您的 $category
数组变量是固定的,它不是动态附加值。
我只回答了你的查询部分。我希望您有 php 编码约定的想法,而不是将整个语句放在 if
语句中。
如果还有什么要问的,请继续