我正在尝试跟踪我网站上的网页浏览量,无论用户是否登录,所以我在我的日志中捕获了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 匹配的列而不是该列中的结果。
ID 可能没有被引号,因此查询看起来像WHERE sessionID IN(abc, def, ...)
。
解决此问题的一种方法是更改第一个循环中的一行:
$sessionArray[] = "'".$checkSession->sessionId."'";
或者,您可以使用带引号的值创建第二个数组。
问题是会话 ID 不是数字,需要用引号括起来。如下所示的内容将在$sessions
字符串中添加适当的引号:
$sessions = "'" . implode("', '", $sessionArray) . "'";
您还应该确保转义任何用户提供的输入(例如 $_GET['viewstats']
(,然后再使用它们来帮助避免 SQL 注入攻击。当您将其添加到$sessionArray
数组时,转义$checkSession->sessionId
也没有什么坏处。
如果您使用的是框架(看起来您可能正在使用WordPress(,请阅读数据库组件的手册,因为它可能会提供为您处理其中一些的功能。
我认为您需要在会话值周围加上引号
$sessions = "'".join("','",$sessionArray)."'";
现在就像WHERE IN (a,b,c)
而不是WHERE IN ('a','b','c')
.
$pagestats = $wpdb->get_results("SELECT * FROM wp_user_stats WHERE `sessionId`=$sessions") or die(mysql_error());
对特定问题的答案,但第二个SELECT
语句不是没有必要的吗?如果它全部存储在一个表中(除非有拼写错误...(,那么SELECT * FROM wp_user_stats WHERE uid=$_GET['view_stats']
将检索该用户的所有会话。也许您需要为多个用户完成它?即使这样,您也可以简单地执行GROUP BY
子句。
也许我错过了一些东西 - 如果是这样,对不起。