如何设置$ _SESSION变量在sql查询中使用?

时间:2013-03-12 14:13:13

标签: php mysql sql

我不确定我是否有这个权利,但我可以帮助我指出正确的方向。

基本上我有一个名为ptb_stats的表。这张桌子的布局如下:

user_id  |  user_postcode

   1             m3 4
   2             m3 4
   3             kt1 3
   4             sm2 7

我正在尝试生成一个mysql查询,该查询将调出所有具有匹配邮政编码的用户。 例如,如果登录user 1 / user_id 1,那么他们将看到user 2与他们具有相同的邮政编码(以m3开头)

这大致告诉用户用户1和用户2彼此相距不到5英里。

我有一个有效的查询:

function get_local_users() {
            global $connection;
            $query = "
            SELECT *
            From ptb_stats, ptb_users
            WHERE ptb_stats.user_id=ptb_users.id
            AND ptb_stats.user_postcode='m3 4'
            AND ptb_users.id!=".$_SESSION['user_id']."";
            $local_set = mysql_query($query, $connection);
            confirm_query($local_set);
            return $local_set;  

        }

此刻我必须手动输入邮政编码到查询中才能正常工作。我的问题是我需要分配一个会话变量,我相信这将告诉查询将用户与具有相同邮政编码的用户匹配到登录的用户。

目前我已将$ _SESSION ['user_id']设置为变量,但有人先前已设置此变量,我正在尝试修复他们的所有工作,但无法与执行此操作的人取得联系。所以我不理解会话变量。我以为我可以将$ _SESSION ['user_id']更改为$ _SESSION ['user_postcode']并且它会起作用,但基本上我需要做的是如何让查询说:

如果登录用户的user_postcode是(任何值),并且他们是匹配user_postcodes的其他用户,则显示这些用户。

有人可以告诉我我需要做些什么才能让它发挥作用。我真的很感激。谢谢。

1 个答案:

答案 0 :(得分:0)

SELECT  a.*
FROM
        tableName a
        INNER JOIN
        (
            SELECT  user_postcode
            FROM    tableName
            GROUP   BY user_postcode
            HAVING  COUNT(*) > 1
        ) b ON a.user_postcode = b.user_postcode

更新1

function get_local_users() 
{ 
    global $connection; 
    $query = "  SELECT  a.* 
                FROM    ptb_stats a 
                        INNER JOIN 
                        ( 
                            SELECT user_postcode 
                            FROM ptb_stats 
                            GROUP BY user_postcode 
                            HAVING COUNT(DISTINCT user_id  ) > 1 
                        ) b ON a.user_postcode = b.user_postcode 
                WHERE a.user_id <> " . $_SESSION['user_id']; 
    $local_set = mysql_query($query, $connection); 
    confirm_query($local_set); 
    return $local_set; 
}

作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。