【问题标题】:How can I use multiple WHERE statements when using IN with array将 IN 与数组一起使用时如何使用多个 WHERE 语句
【发布时间】:2013-09-26 10:24:55
【问题描述】:

我有以下代码:

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 子句合并。

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

SELECT * FROM wp_connections WHEREcontact_first_nameIN (%s, %s) ORcontact_last_nameIN (%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 会终止查询。

EDIT 4 原来这是解决方案:

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

我错过了第二个 $search 变量... *还在挠头

【问题讨论】:

  • 只是回显implode(', ', array_fill(0, count($search), '%s')) 是你得到正确的话...????
  • 打印%s, %s, %s
  • 那么它是如何正确搜索的......
  • 尝试将该查询放入 mysql 查询生成器并执行...

标签: php mysql wordpress


【解决方案1】:

试试这个

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

更新

这个问题的正确答案是查询是正确的,是动态参数错误导致查询语法错误。它实际上是在这个答案下面的cmets部分,所以将它与接受的答案合并!

【讨论】:

  • 查询正确,可能是动态参数错误导致查询语法错误。
  • Idk,我很难过。 var_dump(array_merge(array($sql), $search)); 给:array(4) { [0]=> string(150) " SELECT * FROM wp_connections WHERE contact_first_name IN (%s, %s, %s) OR contact_last_name IN (%s, %s, %s) " [1]=> string(4) "mina" [2]=> string(4) "john" [3]=> string(5) "morse" }
  • 您能否打印 $sql 并查看正在触发的实际查询是什么?
  • 就在上面。 %s 被替换为“mina”、“john”等。
  • 我接受你的回答@Gurminder Singh,因为你上面的评论实际上是正确的。毕竟是参数问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2016-08-11
  • 2014-11-20
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
相关资源
最近更新 更多