如何在php中的预备语句中使用“ IN”运算符

时间:2018-08-14 05:22:45

标签: php in-operator

我将在prepare语句中使用带有参数的“ 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;
}

1 个答案:

答案 0 :(得分:0)

由于这是一项设计要求,因此必须使用IN运算符和准备好的语句,因此需要一种将(value 1, value 2, value 3, ... value n)的PHP数组转换为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()函数。

此外,我认为您在拼写“功能”。