PHP无限重复MySQL的第一个结果

时间:2012-08-04 03:24:59

标签: php mysql

我有这个代码,我一直在努力,当我运行它时,我得到第一个结果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);
?>

2 个答案:

答案 0 :(得分:3)

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

mysql_query中调用while将在每次运行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 or PDO

答案 1 :(得分: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;