0

私は自分のサイトの 1 つでミニ ソーシャル ネットワークを作成しているので、ユーザーには「友達」などがあります。

私のテーブルは次のようになります。

    |   id   |     f1    |    f2   |   status   |
    ----------------------------------------------
    | 000001 | username1 |username2|     0      |
    | 000002 | username4 |username7|     1      |

彼らが友達かどうかを確認するクエリを作成する必要がありますが、問題は次のとおりf1 OR 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これは、クエリが間違っていることを意味すると思います。

何か案は?

ありがとう!

4

2 に答える 2

1

代わりに 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
}
?>
于 2011-07-17T23:48:23.257 に答える
1

クエリでは、2 番目の部分の f2 の前に追加の一重引用符があります。

f1='$username' AND f2='$user') OR (f1='$user' AND 'f2='$username')

する必要があります

f1='$username' AND f2='$user') OR (f1='$user' AND f2='$username')
于 2011-07-17T23:29:55.097 に答える