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_PDO功能(mysqli下)。

  • 绑定参数以防止 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 回答