我正在尝试将获取的数据数组存储到会话中,使用下面的代码,但是当我尝试执行它时,执行时间超过30秒并且失败。 我似乎无法发现错误,所以我希望能有所帮助。
public function stat_query($user_id = null)
{
$query = $this->core->conn->query("SELECT user_stats.value as value, stats.shortname as shortname FROM user_stats INNER JOIN stats ON user_stats.stat_id = stats.id WHERE user_stats.user_id = ".$this->get_user($user_id));
$value = $query->fetch(PDO::FETCH_ASSOC);
return $value;
}
public function init_stat_array($user_id = null){
while($query = $this->stat_query($this->get_user($user_id))) {
$this->temp_array[$query['shortname']] = $query['value'];
}
}
public function store_session($user_id = null) {
$this->init_stat_array($this->get_user($user_id));
$_SESSION['stats'] = $this->temp_array;
}
注意:get_user函数按预期工作,它只返回绑定在构造函数中的用户或输入的用户。
答案 0 :(得分:1)
stat_query
启动查询并获取第一行。它将无限期地运行,因为它应该返回带有$this->get_user($user_id)
参数的真实结果,并且该参数不会改变。解决此问题的最简单方法是删除while
,因为该查询应该只返回一行(我假设user_id是规范的)。
您也可以从该方法返回结果集($query
)并在另一种方法中迭代它。你只需要在外部打电话给fetch
。
我认为您可能希望循环的是init_stat_array
,因为对于user_ids数组运行stat_query
是有意义的。
答案 1 :(得分:1)
while循环不起作用。在fetch_assoc
while ($row = $this->core->conn->fetch()
上使用while,因为fetch
方法旨在以这种方式工作。将fetch方法的返回值分配给变量(或方法返回值)后,在其上运行while()
将无法在fetch方法上运行while()
,但是正在运行{{ 1}}你的方法。因此,如果方法在将$ value传递给它时返回非false值,则while()
始终为true。
如果一个方法返回一个数组,那么while是一个过度杀手,因为你需要使用while($this->yourMethod($value))
和其他一些函数来与数组交互。在您的情况下,您需要key()
:
foreach()