在 WHERE 子句中包含数组的 SELECT 语句


SELECT Statement with array in WHERE clause

我正在尝试跟踪我网站上的网页浏览量,无论用户是否登录,所以我在我的日志中捕获了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子句。

也许我错过了一些东西 - 如果是这样,对不起。