繁体   English   中英

在数组中使用IN时如何使用多个WHERE语句

[英]How can I use multiple WHERE statements when using IN with array

我有以下代码:

function av_connections_search($string){
    global $wpdb;
    // remove url parameter from string
    $string = trim($string,'s=');
    $search = explode('%20',$string);
    // query the wp_connections database table according to search entry
    $sql = "
        SELECT *
        FROM {$wpdb->prefix}connections
        WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
      ";
    // prepare() to prevent sql injection
    $query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));
    // get query results
    //var_dump($query);
    $results = $wpdb->get_results($query);
    // return if no results
    if(empty($results)){
        return false;
    }
    // flush $wpdb cache
    $wpdb->flush();
    // return data to search.php
    return $results;
}

传递给函数时,其中$string看起来像?s = search + these + terms

我的问题是,如何使用多个WHERE语句? 我已经尝试了简单:

WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).")
OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")

但是它完全失败了。 当我做:

WHERE contact_first_name OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")

它仅返回contact_last_name 我想念什么?

编辑:好的,所以我很确定问题在于此:

$query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $search));

但是,由于睡眠不足,我无法确定为什么它不将数组与两个WHERE子句合并。

编辑2这应该行不通吗? 如果使用单个WHERE子句,效果很好,但是当我使用OR和另一个子句时,它什么也不返回,这没有意义,因为这是查询:

SELECT * FROM wp_connections WHERE contact_first_name IN (%s, %s) OR contact_last_name IN (%s, %s) " [1]=> string(4) "Mina" [2]=> string(5) "Morse"

编辑3我不认为prepare()是问题。 考虑一下(无效):

global $wpdb;
$string = trim($string,'s=');
$search = explode('%20',$string);
$how_many = count($search);
$placeholders = array_fill(0, $how_many, '%s');

$format = implode(', ', $placeholders);

$query = "SELECT * FROM wp_connections WHERE contact_first_name IN($format) OR contact_last_name IN($format)";

$results = $wpdb->query($query, $search);
return $results;

即使完全删除准备,同样的结果。 我想念什么? 如果删除OR条件并仅检查一个值,则可以正常工作,但OR会杀死查询。

编辑4原来这是解决方案:

$results = $wpdb->query($query, $search, $search);

我错过了第二个$ search变量...

尝试这个

WHERE contact_first_name IN (".implode(', ', array_fill(0, count($search), '%s')).") OR contact_last_name IN (".implode(', ', array_fill(0, count($search), '%s')).")

更新

这个问题的正确答案是:查询正确,是动态参数错误导致查询语法错误。 它实际上在此答案下方的评论部分,因此将其与接受的答案合并!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM