Я пытаюсь отобразить список пользователей, которые живут локально для пользователя, который вошел в систему. Поэтому, если у зарегистрированного пользователя сеанса есть почтовый индекс «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; }
С этим ответом я предполагаю, что $ _SESSION ['user_postcode'] заполнен из некоторого типа поля ввода, а значение является действительным zipCode (например, «M3 4»).
Вы можете использовать preg_match, чтобы разделить zipcode с номером и попытаться выбрать zipcodes из db. Взгляните на этот пример:
$matches = array(); $zipCode = preg_match('/^([a-z0-9]+)/i', $_SESSION['user_postcode'], $matches);
Zipcode теперь находится в переменной $ 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] . "'";
Согласно тому, что вы описали, я пойду на что-то подобное.
Я использовал подготовленный оператор 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; }
Если идентификатор пользователя хранится в $_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