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