0

だから私はデバッグしていたこの超長いクエリを持っています。列 s.name と他のすべての JOIN 列が「フィールド リスト」にないというエラーを最初に受け取ったので、いくつかのグーグル検索の後、それらを二重引用符で囲むことでそのエラーを修正できました。そのため、クエリはエラーなしでリソースを返しますが、リソースは空です。

ステートメントの後のエコーから得られるのは、「Resource id #4 Warning: implode(): Invalid arguments passed in /var/www/beta/index.php on line 143 0」です。

クエリとその周辺の関数は次のとおりです。

<?php /* other functions preceding */ $result = mysql_query("SELECT * FROM users WHERE uid=" . $_SESSION['uid'] . "");
    $cur_user = mysql_fetch_array($result);
    $ufriends = explode(';', $cur_user['friends']);
    $ufsql = trim(implode(',',$ufriends),',');
    $uevents = explode(';', $cur_user['events']);
    $uesql = trim(implode(',',$uevents),',');
    $urequests = explode(';', $cur_user['requests']);
    $ursql = trim(implode(',',$urequests),',');
    if (!empty($ufriends)) {
        $time1 = microtime();
        $megaresult = mysql_query("
            ( SELECT \"s.name\" AS source_name, NULL AS target_name, recent_updates.*, 1 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                WHERE update_type='10'
                LIMIT 1
            )
            UNION
            ( SELECT \"s.name\" AS source_name, NULL AS target_name, recent_updates.*, 2 as ORD FROM recent_updates
                INNER JOIN users AS su ON (\"s.uid\"=recent_updates.source_id)
                WHERE update_type='10'
                LIMIT 1,9
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN users AS t ON (\"t.uid\"=recent_updates.target_id)
                WHERE update_type='2'
                AND
                    ( target_id IN (" . $ufsql . ") )
                AND
                    ( source_id IN (" . $ufsql . ") )
                OR
                (
                    ( target_id IN (" . $cur_user['uid'] . ") )
                AND
                    ( source_id IN (" . $ufsql . ") )
                )
                OR
                (
                    ( target_id IN (" . $ufsql . ") )
                AND
                    ( source_id IN (" . $cur_user['uid'] . ") )
                )
                LIMIT 0,10
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN users AS t ON (\"t.uid\"=recent_updates.target_id)
                WHERE update_type='4'
                AND
                (
                    ( target_id IN (" . $ufsql . ") )
                AND
                    ( source_id IN (" . $ufsql . ") )
                )
                OR
                (
                    ( target_id IN (" . $cur_user['uid'] . ") )
                AND
                    ( source_id IN (" . $ufsql . ") )
                )
                OR
                (
                    ( target_id IN (" . $ufsql . ") )
                AND
                    ( source_id IN (" . $cur_user['uid'] . ") )
                )
                LIMIT 0,10
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
                WHERE update_type='3'
                AND
                target_id IN (" . $uesql . ")
                LIMIT 0,10
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
                WHERE update_type='3'
                AND
                target_id IN (" . $ursql . ")
                LIMIT 0,10
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
                WHERE update_type='5'
                AND
                target_id IN (" . $ursql . ")
                LIMIT 0,10
            )
            UNION
            ( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
                INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
                WHERE update_type='11'
                AND
                (
                    target_id IN (" . $uesql . ")
                OR
                    target_id IN (" . $ursql . ")
                )
                AND
                (
                    source_id IN (" . $ufsql . ")
                )
                LIMIT 0,10
            )
            UNION
            ( SELECT NULL AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
                INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
                WHERE public != 0 LIMIT 0,10
            )
            ORDER BY ORD ASC, time_un DESC");
        echo $megaresult;
        $feed = mysql_fetch_array($megaresult);
        echo mysql_error();
        $time2 = microtime();
        echo implode('##', $feed);
        echo mysql_num_rows($megaresult);
        echo mysql_info($con);
/* brackets closed, etc */ ?>

エイリアス化された列を二重引用符で囲むことに関係があると感じています。このクエリの以前のバージョンには、完全に正常に機能する JOIN 部分が含まれていなかったので、pastebin にアップロードしました: http://pastebin.com/upifa7VJ

編集:

うーん、これは恥ずかしいです...引用符が問題を引き起こしていると疑うのは正しかったです(@andrewtweberに感謝します!)が、引用符なしで得られたエラーは、2番目のSELECTステートメントのタイプミスによるものでした、 INNER JOIN users AS sとしての INNER JOIN ユーザーの代わりにsu。みんな助けてくれてありがとう!

4

2 に答える 2

2

あなたの問題はタイプミスだったので、この機会にPDOを紹介させてください。

誰もが SQL インジェクションについてどのように話しているか、そしてそれがどれほど恐ろしいものか知っていますか? まあ、適切な練習をすれば、PDO はこれを解決してくれます。

これは悪いです:

$result = mysql_query("SELECT * FROM users WHERE uid=" . $uid . "");

これはさらに悪いことです!

$result = mysql_query("SELECT * FROM users WHERE uid=" . $_GET['uid'] . "");

PDO を使用して、コードの最初の数行を実行してみましょう

//Getting the handle that will allow us to do stuff with the Database
$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
$sql = "SELECT * FROM users WHERE uid= :uid"
//Now we prepare our query, send it to the database server and get it ready
$stmt = $dbh->prepare($sql);
//So now we add the parameters to the query
$stmt->bindParam(':uid', $_SESSION['uid'], PDO::PARAM_INT);
//Now we execute it
$stmt->execute();
//Fetching the result
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Let's see our result
print_r($result);

以上です!さらに数行を書きましたが、データベースを保護しただけでなく、パフォーマンスを向上させるチャンスがあり、いくつかの優れた実践原則に従っていることに満足しています。

今読んだだけでは不十分です。PDO のドキュメントまたは少なくともこの優れたチュートリアルを確認してください。

于 2012-06-30T20:21:27.603 に答える
1

二重引用符は、列ではなく文字列"s.name" を選択していることを意味します。 s.name

おそらくあなたが意図していたのは、バッククォート ` を使用することでした。バックティックを使用すると、予約済みの MySQL キーワードを列名として使用できます。

SELECT `table`.`name` FROM `table` ORDER BY `order` ASC
于 2012-06-30T20:23:00.943 に答える