0

我有这段代码,我一直在处理它,当我运行它时,我得到了第一个结果 10 次(它曾经无限重复,直到我添加了 if 语句)。它应该返回前 10 个结果。我查看了其他几个类似的问题,但没有一个解决方案在这里有效。谁能看到我错过了什么?

<?php
$link = mysql_connect('XXXXXXXXX.com', 'XXXXXX', 'XXXXX');
$db = mysql_select_db('a1007515_troop1', $link);
$i = 1;
while($row = mysql_fetch_array(mysql_query('SELECT * FROM `posts` ORDER BY `pid` DESC LIMIT 10;')))
{
$authinfo = mysql_fetch_array(mysql_query('SELECT * FROM `users` WHERE `id` = '.$row['aid'].' LIMIT 1'));
echo '
<div class="content">
<a href="post.007?pid='.$row['pid'].'"><h1 class="title">'.$row['title'].'</h1></a>
<span class="authinfo">This post was made by '.$authinfo['name'].'<i>('.$authinfo['username'].')</i> on '.$row['date'].'.</span>
<p class="txt">'.$row['content'].'</p>
</div>';
if ($i == 10) { break; }
++ $i;
}
mysql_close($link);
?>
4

2 回答 2

3

也许尝试简化事情,尝试坚持每行做一件事,而不是试图压缩它。

每次运行 while 循环时,调用mysql_query将重复该查询,而不是获取下一个结果。while在迭代另一个 mysql 查询的结果时运行另一个 mysql 查询也会导致问题。

$link = mysql_connect('mysqlwebhost', 'user', 'pass');
$db = mysql_select_db('dbname', $link);

$result = mysql_query('SELECT * FROM `posts` p, `users` u WHERE u.id = p.aid  ORDER BY `pid` DESC LIMIT 0,10;');

while ($row = mysql_fetch_assoc($result)) {
    echo '
    <div class="content">
    <a href="post.007?pid='.$row['pid'].'"><h1 class="title">'.$row['title'].'</h1></a>
    <span class="authinfo">This post was made by '.$row['name'].'<i>('.$row['username'].')</i> on '.$row['date'].'.</span>
    <p class="txt">'.$row['content'].'</p>
    </div>';
}

mysql_close($link);

您可能还希望避免使用 mysql_* 函数,因为它们已被弃用。看看mysqli 或 PDO

于 2012-08-04T03:39:37.417 回答
3

问题是每次测试 while() 条件时都要再次执行 SQL 语句:

while($row = mysql_fetch_array(mysql_query('SELECT * FROM `posts` ORDER BY `pid` DESC LIMIT     10;')))
{
...
}

每次评估 while() 时,上面的代码都会执行此函数:

mysql_query('SELECT * FROM `posts` ORDER BY `pid` DESC LIMIT     10;')

而是使用:

$stmt = mysql_query(...) or die(mysql_error());
while($row = mysql_fetch_array($stmt)) {
...
}

接下来,您应该使用连接。您正在遵循一种“过度查询”数据库的模式。

您只需要以下 SQL 和一个循环:

SELECT u.* 
  FROM `posts` p 
  JOIN `users` u 
    ON u.id = p.aid  
 ORDER BY `pid` DESC 
 LIMIT 0,10;
于 2012-08-04T03:47:30.870 回答