【发布时间】: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 查询生成器并执行...