0

我将在准备语句中使用带有 using 参数的“IN”运算符,但我不能这样做

$hotel_list = "SELECT DISTINCT h.hotel_id, h.hotel_name, h.hotel_address, h.hotel_image 
                FROM type_feture tf 
                JOIN type t ON t.type_id = tf.type_id 
                JOIN hotel h ON h.hotel_id=t.hotel_id 
                WHERE tf.feture_id IN ?  
                AND h.hotel_city_id=?
                GROUP BY tf.type_id, h.hotel_id, h.hotel_name, h.hotel_address HAVING COUNT(tf.type_id)>=?";
$result = $dbca->prepare($hotel_list);
$result->bind_param("sii", $feture,$city_ide,$cnt_type);
$feture=(string)$finish;
$city_ide = (int)$hotel_city_id;
$cnt_type=(int)$cn;
$result->execute();
$res = $result->get_result();
while ($obj = $res->fetch_object()) {
    $hotels[] = $obj;
}
4

1 回答 1

0

因为必须使用IN运算符和预处理语句是设计要求,所以需要一种将 PHP 数组(value 1, value 2, value 3, ... value n)转换为 SQL 数组的方法(value 1, value 2, value 3, ... value n)。您需要一个中间步骤,因为如果没有函数或某种循环的帮助,PHP 对象无法直接转换为 SQL。

你的思考过程应该是:这两个变量有什么共同点?答:它们都是列表,都可以用字符串表示。那么,为了解决您的问题,您希望将 PHP 列表转换为逗号分隔的字符串,转换为 SQL 数组,然后检查 SQL 查询中指定列是否在该数组中有值。

您只需对代码进行两项更改即可完成此操作:

1)创建一个变量$feature_ids_str并使其成为包含您的功能ID的任何数组的逗号分隔字符串版本(根据您对问题的评论,如果您给我们更多代码来解释其中一些变量的位置,那真的会很有帮助来自(哪里)。的值的一个例子$feature_ids_str"1,5,3,7,82,4"

2) 将您的查询修改如下:... WHERE tf.feture_id IN STRING_SPLIT(?, ',') ... [feture_id sic]当然也相应地更新$result->bind_param()函数。

另外,我认为您拼错了“功能”。

于 2018-08-14T06:06:29.860 回答