2013-03-11 20 views
0

我正在尝试显示本地用户登录的用户列表。因此,如果登录的会话用户具有“m3 4”的邮政编码,并且其他5个用户的邮政编码以“m3 4 '然后这些用户将被显示给用户。select *在mysql表中匹配用户邮政编码?

我的表布局是这样的:

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

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – j0k 2013-03-11 12:17:10

+0

你在$ _SESSION ['user_postcode']'里面有什么? 'confirm_query'有什么作用? – j0k 2013-03-11 12:18:36

+0

另外,请不要使用'SELECT *'。你应该总是知道你在结果中期望的领域。 – 2013-03-11 12:18:53

回答

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

0

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

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

$matches = array(); 
$zipCode = preg_match('/^([a-z0-9]+)/i', $_SESSION['user_postcode'], $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] . "'"; 
+0

也许我没有读过这篇文章,我认为后面的数字(邮政编码)是房号。我的错 :(。 – Benz 2013-03-11 12:42:36

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; 
} 
相关问题