0

クエリが何をするのかを正確に説明する方法はわかりませんが、問題は完全に設定方法にあるわけではありません。別の例では、配列として使用すると機能するためですが、私がmysql_fetch_assoc()で使用するので、これが私の元のクエリです(問題のあるものではありません):

SELECT * FROM 
(SELECT * FROM comments 
          WHERE postID='$id' AND state='0' 
          ORDER BY id DESC LIMIT 3
) t ORDER BY id ASC

これは、投稿の最後の3つのコメントを選択し、別の方法でそれらを並べ替えます(つまり、古いものから新しいものへと正しい順序で表示されます)。これは、コメントの配列を直接エコーアウトするためのクエリです。しかし、今私がやりたいのは、3つのコメントから最初のIDを取得することです。

これが私がやろうとしたことです(ちなみに、以前のクエリを置き換えて結果を配列にエコーアウトすると、このクエリは機能しますが、使用するIDだけを取得する必要があります。配列):

$previousIDq = mysql_fetch_assoc(mysql_query("
                                   SELECT * FROM 
                                  (SELECT * FROM comments 
                                   WHERE postID='$id' AND state='0' 
                                   ORDER BY id DESC LIMIT 3
                                  ) t ORDER BY id ASC LIMIT 1"));

 $previousID = $previousIDq['id']; //this doesn't return the id as I want it to.
4

5 に答える 5

1

問題は、一致する行がないことである可能性があります。

また、これに対するクエリを改善することもできると思います。

SELECT * FROM comments WHERE postID='$id' AND state='0' ORDER BY id DESC LIMIT 2,1

しかし、他の人が言うように、PDOまたはMySQLiを使用し、プリペアドステートメントを使用します。そして、*を選択しないでください。

于 2012-10-29T15:04:45.320 に答える
0

var_dump($ previousID)を試して、何が得られるかを確認してください

それはおそらくあなたにオブジェクトを返しているでしょう、そしてあなたはそのオブジェクトからあなたのIDを取得する必要があります

于 2012-10-29T14:56:08.517 に答える
0

mysql_新しいコードを書くための関数の使用をやめてください。非推奨になっています。または機能(mysqli_以下)。PDOmysqli

  • SQLインジェクションを防ぐためにパラメータをバインドします
  • 常に列リストを使用してください(使用しないでくださいSELECT *
  • 1行を超える行を返す場合は、whileループを使用します

mysqli_解決

$link = mysqli_connect("localhost", "user_name", "password", "stock");

if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
}

$stmt = mysqli_prepare($link, "SELECT t.id FROM 
    (SELECT id FROM comments 
    WHERE postID = ? AND state = 0
    ORDER BY id DESC 
    LIMIT 3) t 
ORDER BY id ASC");

mysqli_bind_param($stmt, 's', $id) or die(mysqli_error($dbh));

$result = mysqli_stmt_execute($stmt) or die(mysqli_error($link));

while($row = mysqli_fetch_assoc($result)) {
    echo $row[id];
}

mysqli_close($link);

mysql_解決

$stmt = "SELECT t.id FROM 
        (SELECT id FROM comments 
        WHERE postID = $id AND state = 0
        ORDER BY id DESC 
        LIMIT 3) t 
    ORDER BY id ASC";
$result = mysql_query($stmt) or die(mysql_error());
$row = mysql_fetch_assoc($result);

while($row = mysql_fetch_assoc($result)) {
    echo $row[id];
}
于 2012-10-29T15:00:30.947 に答える
0

スクリプトは、デバッグはもちろん、エラー処理には凝縮されすぎています

$mysql = mysql_connect(...

$query = "
    SELECT * FROM 
    (SELECT * FROM comments 
    WHERE postID='$id' AND state='0' 
    ORDER BY id DESC LIMIT 3
    ) t ORDER BY id ASC LIMIT 1
";
$result = mysql_query($query, $mysql);
if ( !$result ) { // query failed
  die('<pre>'.htmlspecialchars(mysql_error($mysql)).'</pre><pre>'.htmlspecialchars($query).'</pre>');
}

$previousIDq = mysql_fetch_assoc($result);
if ( !$previousIDq ) {
    die('empty result set');
}
else {
    $previousID = $previousIDq['id'];
}
于 2012-10-29T15:00:42.943 に答える
0

デバッグできるようにするには、コードを分離する必要があります

$query = "SELECT * FROM 
               (SELECT * FROM comments 
                     WHERE postID='$id' AND state='0' 
                                   ORDER BY id DESC LIMIT 3
                                  ) t ORDER BY id ASC LIMIT 1";

$result = mysql_query($query);

echo mysql_error(); //what eror comes out here

while($previousIDq  = mysql_fetch_assoc($result))
{
     print ($previousIDq['id']);
}

注: mysql_ *は減価償却されているため、mysqliまたはPDOにアップグレードしてください

于 2012-10-29T15:01:33.133 に答える