我正在尝试跟踪我网站上的网页浏览量,无论用户是否登录,因此我在我的日志中捕获sessionId。我只想显示在某些时候登录的会话ID的跟踪结果,因此我的流程如下:
$pagestats = $wpdb->get_results("SELECT * FROM wp_user_stats WHERE uid=".$_GET['viewstats']);
$sessionArray = array();
foreach($pagestats as $checkSession)
{
if( !(in_array($checkSession->sessionId, $sessionArray)))
{
$sessionArray[] = $checkSession->sessionId;
}
}
接下来,我正在尝试收集有关此特定用户生成的任何会话ID的所有统计信息......
$sessions = join(',',$sessionArray);
$pagestats = $wpdb->get_results("SELECT * FROM wp_user_stats WHERE `sessionId` IN($sessions)") or die(mysql_error());
这是抛出错误的部分。错误是:
Unknown column 'sjhntmqhltknks8pbhr750voe7' in 'where clause'
我不明白为什么它会尝试找到与会话ID匹配的列而不是该列中的结果。
答案 0 :(得分:2)
会话ID可能未被引用,因此查询看起来像WHERE sessionID IN(abc, def, ...)
。
解决这个问题的一种方法是在第一个循环中更改一行:
$sessionArray[] = "'".$checkSession->sessionId."'";
或者您可以使用引用的值创建第二个数组。
答案 1 :(得分:2)
问题是会话ID不是数字,需要用引号括起来。以下内容会为您的$sessions
字符串添加正确的引号:
$sessions = "'" . implode("', '", $sessionArray) . "'";
在使用它们以帮助避免SQL注入攻击之前,您还应确保转义任何用户提供的输入(例如$_GET['viewstats']
)。逃离$checkSession->sessionId
并将其添加到$sessionArray
数组也不会有什么坏处。
如果您正在使用框架(看起来您可能正在使用WordPress),请阅读数据库组件的手册,因为它可能会为您提供处理其中一些功能的功能。
答案 2 :(得分:1)
我认为您需要在会话值周围加上引号
$sessions = "'".join("','",$sessionArray)."'";
现在它就像WHERE IN (a,b,c)
而不是WHERE IN ('a','b','c')
。
答案 3 :(得分:0)
$pagestats = $wpdb->get_results("SELECT * FROM wp_user_stats WHERE `sessionId`=$sessions") or die(mysql_error());
答案 4 :(得分:0)
这不是特定问题的答案,但不是第二个SELECT
声明不必要吗?如果它全部存储在一个表中(除非有拼写错误...),那么SELECT * FROM wp_user_stats WHERE uid=$_GET['view_stats']
将检索该用户的所有会话。也许您需要为多个用户完成它?即便如此,您也可以简单地执行GROUP BY
子句。
也许我错过了一些东西 - 如果是的话,抱歉。