带有WHERE子句中数组的SELECT语句

时间:2012-08-20 23:32:24

标签: php mysql

我正在尝试跟踪我网站上的网页浏览量,无论用户是否登录,因此我在我的日志中捕获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匹配的列而不是该列中的结果。

5 个答案:

答案 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子句。

也许我错过了一些东西 - 如果是的话,抱歉。