警告:in_array()期望参数2是数组,在第1253行的[...]中给出布尔值

时间:2014-07-01 22:13:20

标签: php

    function getFeed($start, $value) {
    $this->subscriptions = $this->getSubscriptionsList();

    // Allowed types (if it's empty, return false to cancel the query)
    $allowedType = $this->listTypes(($this->subscriptions) ? $this->subscriptions : false);
    $allowedDates = $this->listDates(($this->subscriptions) ? $this->subscriptions : false);

    // If the $start value is 0, empty the query;
    if($start == 0) {
        $start = '';
    } else {
        // Else, build up the query
        $start = 'AND messages.id < \''.$this->db->real_escape_string($start).'\'';
    }

    if(in_array($value, $allowedType)) {
        $query = sprintf("SELECT * FROM messages, users WHERE messages.uid IN (%s) AND messages.type = '%s' AND messages.public = '1' AND messages.uid = users.idu %s ORDER BY messages.id DESC LIMIT %s", $this->id.','.$this->subscriptions, $this->db->real_escape_string($value), $start, ($this->per_page + 1));
        $value = '\''.$value.'\'';
    } elseif(in_array ($value, $allowedDates)) {
        $query = sprintf("SELECT * FROM messages, users WHERE messages.uid IN (%s) AND extract(YEAR_MONTH from `time`) = '%s' AND messages.public = '1' AND messages.uid = users.idu %s ORDER BY messages.id DESC LIMIT %s", $this->id.','.$this->subscriptions, $this->db->real_escape_string($value), $start, ($this->per_page + 1));
        $value = '\''.$value.'\'';
    } else {
        // The query to select the subscribed users
        $query = sprintf("SELECT * FROM messages, users WHERE messages.uid IN (%s) AND messages.public = '1' AND messages.uid = users.idu %s ORDER BY messages.id DESC LIMIT %s", $this->id.','.$this->subscriptions, $start, ($this->per_page + 1));
        $value = '\'\'';
    }

    // If the user subscribed to other users get the messages (prevents fatal error because of empty IN () query)
    if(!empty($this->subscriptions)) {
        return $this->getMessages($query, 'loadFeed', $value);
    } else {
        return $this->showError('welcome_feed');
    }
}

这里的问题

elseif(in_array ($value, $allowedDates)) {
        $query = sprintf("SELECT * FROM messages, users WHERE messages.uid IN (%s) AND extract(YEAR_MONTH from `time`) = '%s' AND messages.public = '1' AND messages.uid = users.idu %s ORDER BY messages.id DESC LIMIT %s", $this->id.','.$this->subscriptions, $this->db->real_escape_string($value), $start, ($this->per_page + 1));
        $value = '\''.$value.'\'';
    } 

在那些行之间,但我无法解决此错误。 逻辑错误,但我在用PHP做什么? 如果你非常感谢你。

3 个答案:

答案 0 :(得分:3)

您无法确定$ allowedDates是否为

数组
$allowedDates = $this->listDates(($this->subscriptions) ? $this->subscriptions : false);

声明它是一个布尔值(参见&#34; ternary operators&#34;)

$this->subscriptions

是FALSE,NULL,0或者其他什么,在任何情况下都不是。

所以你需要确定以后,你实际上正在处理一个数组。像

elseif(is_array($allowedDates) && in_array ($value, $allowedDates)) {
    [...]
}

例如。

当您期待某种类型时,检查类型总是很好的做法。 另外,相应地命名变量会有很大帮助。

正如脚本现在所示,您可能想要命名var&#34; $ mixAllowedDates&#34;。 如果您选择确保三元运算符在任何情况下都返回一个数组,那么您可以命名变量&#34; $ arrAllowedDates&#34;。

这样你总能知道你在做什么。

答案 1 :(得分:0)

的结果
$allowedType = $this->listTypes(($this->subscriptions) ? $this->subscriptions : false);

返回一个布尔值而不是一个数组。

你的意思是:

$allowedType = ($this->subscriptions) ? $this->listTypes($this->subscriptions) : array();

否则检查方法listTypes()是否总是返回一个数组。它返回一个布尔值,导致你得到的错误。

答案 2 :(得分:0)

这很简单,错误告诉你问题是什么。

在您的代码段的顶部,您有:

$allowedDates = $this->listDates(($this->subscriptions) ? $this->subscriptions : false);

在您的评论上方,您说您要将变量设置为false,以取消查询&#34; (这解释为使IF语句在这里被删除的含义:

} elseif(in_array ($value, $allowedDates)) {

但是,正如错误消息所示,您无法将布尔值(而不是数组)传递给in_array,但是您将值设置为false才能跳过它?

您有两种选择:

  1. 不要在你的三元运算符中使用false,而是使用空数组array(),因为它是空的,该值将不存在,并且条件将按预期跳过,它将是正确的数据类型。

  2. 如果你真的必须在该变量中使用false,你需要首先检查它是否为false,如下所示:

    } elseif(false !== $allowedDates && in_array ($value, $allowedDates)) {