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()条件をテストするたびに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 に答える
3

物事を単純化して、圧縮しようとするのではなく、1 行に 1 つのことを行うようにしてください。

を呼び出すmysql_querywhile、次の結果をフェッチするのではなく、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 に答える