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做什么? 如果你非常感谢你。
答案 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才能跳过它?
您有两种选择:
不要在你的三元运算符中使用false
,而是使用空数组array()
,因为它是空的,该值将不存在,并且条件将按预期跳过,它将是正确的数据类型。
如果你真的必须在该变量中使用false,你需要首先检查它是否为false,如下所示:
} elseif(false !== $allowedDates && in_array ($value, $allowedDates)) {