0

我正在尝试向登录的用户显示居住在本地的用户列表。因此,如果登录的会话用户的邮政编码为“m3 4”,而其他 5 个用户的邮政编码以“m3 4”开头,那么这些用户将显示给用户。

我的桌子是这样布置的:

id  |   user_id  | user_postcode
1          2          M3 4
2          3          SM2 7
3          4          M3 4

因此在这种情况下,用户 2 将显示给已登录的用户 4,因为他们的邮政编码匹配。

我正在尝试在 mysql 中执行此操作,并且当我手动输入邮政编码时它可以工作,如下所示:

AND ptb_stats.user_postcode='M3 4'

但我试图使其特定于用户会话,因此如果登录用户 / $_SESSION[user_id'] 与其他用户具有相同的邮政编码。

我正在尝试这样做,但它显示了所有没有邮政编码的用户,因为它应该显示具有匹配邮政编码的用户,不是吗?

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

3 回答 3

0

如果用户 id 存储在 中$_SESSION['user_id'],则可以通过以下方式获取本地用户

select u.id, u.name
from ptb_users u
join ptb_stats s1 on s1.user_id = $_SESSION['user_id']
join ptb_stats s2 on s2.user_id = u.id and s2.user_postcode = s1.user_postcode
where u.id <> $_SESSION['user_id']

SQLFiddle

如果你有邮政编码$_SESSION['user_postcode'],那就更容易了

select u.id, u.name
from ptb_users u
join ptb_stats s on s.user_id = u.id
     and s.user_postcode = $_SESSION['user_postcode']
where u.id <> $_SESSION['user_id']

SQLFiddle

于 2013-03-11T12:38:31.817 回答
0

有了这个答案,我假设 $_SESSION['user_postcode'] 是从某种类型的输入框中填充的,并且该值是有效的邮政编码(如“M3 4”)。

您可以使用 preg_match 从数字中拆分邮政编码,并尝试从数据库中选择邮政编码。看看这个例子:

$matches = array();
$zipCode = preg_match('/^([a-z0-9]+)/i', $_SESSION['user_postcode'], $matches); 

邮政编码现在位于第二位的 $matches 变量中 ($matches[1])。现在使用此值创建一个查询并检查它是否与其他查询相同..

$query = "SELECT *
        From ptb_stats, ptb_users
        WHERE ptb_stats.user_id=ptb_users.id
        AND ptb_stats.user_postcode REGEX '^" . $matches[1] . "'";
于 2013-03-11T12:38:33.703 回答
0

根据你的描述,我会继续这样的事情。

我使用 PDO 中的准备好的语句来处理查询。

function get_local_users() {
    // given that it was created like this: $connection = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 'username', 'password');
    global $connection;

    $stmt = $connection->prepare(
        "SELECT ptb_stats.*
        FROM ptb_stats, ptb_users
        WHERE ptb_stats.user_id = ptb_users.id
        AND ptb_stats.user_id != ?
        AND ptb_stats.user_postcode = (
            SELECT user_postcode 
            FROM ptb_stats 
            WHERE user_id = ?
        )");

    $stmt->execute(array($_SESSION['user_id'], $_SESSION['user_id']));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return $rows;
}
于 2013-03-11T12:39:10.677 回答