1

特定のユーザーから回答または質問された質問の ID を取得しようとしています。これらの ID を使用して、最初のクエリから取得した ID とは異なる ID の質問を取得しようとしています。これを達成しようとしているときに、mysql_fetch_assoc を取得しています。 () 関連のエラー/警告が発生し、その結果、プログラムがクラッシュしました。

以下は、データベースでクエリを実行する DB_Functions.php ファイルのコードです。

public function getQuestions($username){
$result = mysql_query("SELECT question_id FROM answered WHERE asked_by =  '$username' OR answered_by =  '$username'");
if($result){
$data = array();
    while($row = mysql_fetch_assoc($result)) {
        $data[] = array(
        $r=$row["question_id"]);}
        for($i=0; $i<sizeof($data); $i++){
            $result2 = mysql_query("SELECT * FROM answers EXCEPT WHERE question_id='$data[i]'") or die(mysql_error());
            return ($result2);
            }
    }else{
        return false;}
}

index.php にあるコードに従って、DB_Functions.php から結果を受信しようとしています。

if($tag == 'getQuestions'){
                $username = $_POST['username'];
                    $getAllQuestions = $db->getQuestions($username);
            $data = array();
            while($row = mysql_fetch_assoc($getAllQuestions)) { //I'm getting ERROR on this line
            $data[] = array(
            $response["getAllQuestions"]["id"] = $row["id"],
            $response["getAllQuestions"]["username"] = $row["username"],
            $response["getAllQuestions"]["question_id"] = $row["question_id"],
            $response["getAllQuestions"]["question"] = $row["question"],
            $response["getAllQuestions"]["tag1"] = $row["tag1"],
            $response["getAllQuestions"]["tag2"] = $row["tag2"],
            $response["getAllQuestions"]["tag3"] = $row["tag3"],
            $response["getAllQuestions"]["question_time"] = $row["question_time"]);}
            echo json_encode($data);
                    }

以下は logcat メッセージです。

06-26 21:08:13.920: D/JSON(478): <b>Warning</b>:  mysql_fetch_assoc() expects parameter 1 to be resource, null given in <b>C:\xampp\htdocs\android_php_1\index.php</b> on line <b>178</b><br />

ありがとう

4

1 に答える 1

2

MySQL はEXCEPTキーワードをサポートしていないため、結果セットが形成されなかったため、クエリは に戻ります。これが、そのエラーが発生する理由ですnull$result2代わりに、実際には次のようにこれら 2 つのクエリを 1 つに統合できます。

SELECT
    a.*
FROM
    answers a
LEFT JOIN
    (
        SELECT DISTINCT question_id
        FROM answered
        WHERE ? IN (asked_by, answered_by)
    ) b ON a.question_id = b.question_id
WHERE 
    b.question_id IS NULL 

getQuestions()関数では、全体を次のように置き換えることができます。

public function getQuestions($username) {
    $filtered_username = mysql_real_escape_string($username);
    $sql = "
        SELECT a.*
        FROM answers a
        LEFT JOIN
        (
            SELECT DISTINCT question_id
            FROM answered
            WHERE '$filtered_username' IN (asked_by, answered_by)
        ) b ON a.question_id = b.question_id
        WHERE b.question_id IS NULL";

    return mysql_query($sql) ?: false;
}

また、以前のコードは SQL インジェクションに対して脆弱であったことにも注意してください。私のソリューションでは、最初にユーザー名変数を渡してmysql_real_escape_string()それを防ぎました(準備済みステートメントほどではありませんが、何もないよりはましです)。ユーザー入力をクエリに直接渡さないでください。

于 2012-06-26T18:31:38.683 に答える