2016-03-04 88 views
1

所以,我下面的PHP查询:MySQL查询搜索以“如果”语句

for($i = 0; $i < sizeof($cat_result) ; ++$i) {   
    $query_p = "SELECT * FROM $table WHERE id = %d"; 
    $results[] = $wpdb->get_row($wpdb->prepare($query_p, $cat_result[$i]));    
} 

搜索依赖于$cat_result其中包含大量的数字。

例如,让我们说$cat_result包含以下号码:“1,3,5,21,35`

使用这些5个号码,查询将查找数据库信息。

但是,有些情况下db中不存在一些数字(例如“21”)。

然后,我得到PHP NOTICE: trying to get property of non-object

如何编写“if”语句,以便如果id(本例中为“21”)不存在,那么它只是忽略查询? (很难解释我的意思是“忽略”,我仍然希望查询执行搜索,但是如果它没有找到它正在查找的内容,那么只需忽略该错误)。

+2

为什么不直接说:'SELECT * FROM $ table WHERE id in($ cat_result);' – Fallenreaper

+1

@Matt'IFNULL'没有帮助,如果没有行匹配。 – Barmar

+0

@Barmar Ahh,那时可能是错误的。 – Matt

回答

1

试试这个:

for($i = 0; $i < sizeof($cat_result) ; ++$i) {   
    $query_p = "SELECT * FROM $table WHERE id = %d"; 
    $row = $wpdb->get_row($wpdb->prepare($query_p, $cat_result[$i])); 
    if ($row) { 
     $results[] = $row; 
    }  
} 

我不知道WordPress的,但我怀疑get_row返回false当有结果没有更多的行。当发生这种情况时,您的代码将false置入$results,随后代码尝试将其用作对象。

3

我认为你应该重组你的查询。这样一来,只要你的数据消毒(以防止注射作为即时通讯不知道,如果它来自用户或没有),你可以做到以下几点:

$cat_result = implode(",", $cat_result); 
$query_p = "SELECT * FROM $table WHERE id in ($cat_result)"; 
$rslt  = $wpdb->get_results($query_p); 
// loop result 

这样的话,它会读取你的所有在那个列表中。

+0

'$ cat_result'是一个数组,而不是一个字符串。 – Barmar

+0

您需要使用'implode(',',$ cat_result)'。 – Barmar

+1

使用'$ cat_result = implode(“,”,$ cat_result); ' – Matt