4

これを少し整理できるかどうか疑問に思っていました。ネストされたSQLステートメントを作成したかったのですが、方法がわかりません。

$serverfile = mysqli_fetch_array(mysqli_query($link,"SELECT `Server_ID` 
    FROM `FileServerFiles` 
    WHERE `File_ID` ='$fileid' 
    limit 1"));
$server = mysqli_fetch_array(mysqli_query($link,"SELECT `ExternalDomain`,`AccessFile` 
    FROM `FileServers` 
    WHERE `ID` ='".$serverfile['Server_ID']."'"));

私はこのようなものが欲しかった?

    $server = mysqli_fetch_array(mysqli_query($link,"SELECT `ExternalDomain`,`AccessFile` 
        FROM `FileServers` 
        WHERE `ID` ='(SELECT `Server_ID` 
            FROM `FileServerFiles` 
            WHERE `File_ID` ='$fileid' 
            limit 1)'"
    ));
4

4 に答える 4

2

このクエリでそれを行う必要があります。クエリを実行するのは 1 つの項目のみであるため、実際には結合は必要ありません。

SELECT `ExternalDomain`,`AccessFile` 
FROM `FileServers` 
WHERE `ID` IN (SELECT `Server_ID` 
    FROM `FileServerFiles` 
    WHERE `File_ID` ='$fileid' 
    limit 1
);

ところで、私はそれ$fileidが適切にサニタイズされていると仮定しました。準備済みステートメント (および/または) を検討することもできます。

于 2013-04-23T11:26:45.593 に答える
0

これはネストされていませんが、join構文を使用した同等のものであり、より簡潔であると見なされる場合があります (そして、その価値のために現代的です)。あなたが望むものではないかもしれませんが、参考までにここに示します (データベースを扱っている場合、この構文に遭遇する可能性が高いため)。

これINNER JOINは、結合の右側に一致する行がない場合、結合の左側の行が結果から破棄されることを意味します。

わかりやすいように空白をたくさん追加しました。自由に取り除いてください。しかし、する必要はありません。

$server = mysqli_fetch_array(mysqli_query($link,
   "SELECT 
       fs.ExternalDomain,
       fs.AccessFile

    FROM 
       FileServers fs

       INNER JOIN FileServerFiles fsf
       ON fs.fileid = fsf.server_id

     WHERE 
       fsf.File_ID ='$fileid' 

     LIMIT 1
   "));

私の前に@Jackが述べたように、サニタイズされていることを確認する必要があります$fileidhttp://en.wikipedia.org/wiki/SQL_injectionを参照

于 2013-04-23T11:22:03.303 に答える