Как структурировать MySQL OR?
Я создаю мини-социальную сеть на одном из своих сайтов, чтобы у пользователей были "друзья" и прочее.
Моя таблица выглядит так:
| id | f1 | f2 | status |
----------------------------------------------
| 000001 | username1 |username2| 0 |
| 000002 | username4 |username7| 1 |
и я должен написать запрос, чтобы проверить, дружат ли они, но проблема в том, что 1 человек может быть либо в f1, либо в f2.
Это немного из файла profile.php, этот файл $_GET'ing? U в качестве имени пользователя, запрашивает у сервера имя пользователя и выбирает ассоциативный массив.
Я посмотрел синтаксис запроса на OR и написал запрос (который не удался):
<?
session_start(); /* If you want to take a look at *some* of the earlier code */
$connect1 = mysql_connect("localhost", "xxxxx", "xxxxxx") or die(mysql_error());
mysql_select_db("txclanco_xxxxx") or die(mysql_error());
if(isset($_GET['u']))
{
$username = mysql_real_escape_string($_GET['u']);
$data = mysql_query("SELECT * FROM users WHERE username='$username'");
if(mysql_num_rows($data)===1)
{
$result = mysql_fetch_assoc($data);
$firstname = $result['firstname']; }
$user = $_SESSION['username'];
/ * Более нерелевантный код здесь */
/ * Здесь начинается бит проверки друга */
$friendcheck = mysql_query("SELECT * FROM friends WHERE (f1='$username' AND f2='$user') OR (f1='$user' AND 'f2='$username')");
if(mysql_num_rows($friendcheck)===1)
{
$fa = mysql_fetch_assoc($data);
$fstatus = $fa['status'];
$addstring = "";
}
else { $addstring = "<a href='#' id='".$username."' class='addfriend'>add as friend</a>"; }
?>
Затем на странице, где мы показываем состояние друга:
<?
if($user==$username) {
echo "nice profile you got here :)";
$fstatus = "asd";
}
if($fstatus==0) {
echo "friend request sent";
}
echo $addstring;
?>
Этот код возвращается с:
<b>Warning</b>: mysql_num_rows(): supplied argument is not a valid MySQL result resource in <b>/home/txclanco/public_html/hotmuze/beta/profile.php</b> on line <b>56</b><br />
Что, я думаю, означает, что запрос $friendcheck неверен.:S
Есть идеи?:S
Спасибо!:)
2 ответа
Я действительно думаю, что вместо этого вы должны использовать что-то в качестве PDO, что также поможет вам избежать внедрения SQL:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("SELECT * FROM friends WHERE (f1 = :username AND f2 = :user) OR (f2 = :user AND f1 = :username)");
$stmt->bindParam(':username',$username);
$stmt->bindParam(':user',$user);
$stmt->execute();
$result = $stmt->fetchAll();
if (count($result) > 0) {
// Do something
}
?>
В вашем запросе есть дополнительная одинарная кавычка перед f2 во второй части.
f1='$username' AND f2='$user') OR (f1='$user' AND 'f2='$username')
должно быть
f1='$username' AND f2='$user') OR (f1='$user' AND f2='$username')