1

ローカルの xampp で while スクリプトを実行すると、同じ結果が何度も返されます。使用している PHP は次のとおりです。

<?php
$id = $_GET['id'];
$getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
$getids = mysql_fetch_assoc($getmembers);
    while($id = $getids['userid']){
        $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
        echo ($getusers['username']);
        echo('<br />');
    }
?>

http://prntscr.com/12nh6g私のデータベースには、そのグループに登録された 4 人の異なるユーザーが含まれています。MySQL でテーブルを結合する方法がわからないため、よくわかりません。

休憩を追加すると; その後、タイムアウトするのではなく、1 つの結果のみを返します。

どんな助けでも大歓迎です!

また、PHP がいかに乱雑であるかについては申し訳ありません。私はこれが初めてです。

4

4 に答える 4

1
<?php

$id = (int) $_GET['id']; // very important part here, I cast the id to int, else you have a SQL injection leak
$getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
while ($membership = mysql_fetch_assoc($getmembers)) // on each pass we take a new result off first query
{
    $user = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '".$membership['user_id']."'"));
    echo ($user['username']);
    echo('<br />');
}
?>
于 2013-04-29T09:08:48.617 に答える
1
while($id = $getids['userid']){ #This condition will always be true.

mysql_fetch_assoc以下のようなループでステートメントを使用します。

while ($getids = mysql_fetch_assoc($getmembers)) {
    $id = $getids['userid']
    $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
    echo $getusers['username'];
    echo '<br />';
}

あなたが試すことができるサブクエリについては、

SELECT look, username FROM users
WHERE id IN 
       (SELECT userId FROM group_memberships
        WHERE groupid = $id
        LIMIT 10)

JOINを使用して、

SELECT u.look,u.username
FROM users as u
LEFT JOIN group_memberships as gm
     on gm.userId = u.id 
     WHERE gm.groupid = $id
     LIMIT 10 

注: 新しいコードでは関数を使用しないでくださいmysql_*。それらはもはや保守されておらず、公式に非推奨です赤いボックスが見えますか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを使用するかを決めるのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。

于 2013-04-29T09:08:00.373 に答える
1

あなたのコードで:

<?php
$id = $_GET['id'];
$getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");
$getids = mysql_fetch_assoc($getmembers);
    while($id = $getids['userid']){
        $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
        echo ($getusers['username']);
        echo('<br />');
    }
?>

$id が $getids['userid'] の値に割り当てられている間、「ループを実行する」ことを PHP に指示します。

したがって、$id は常に割り当てられる (そして常に同じ値である) ため、無限ループが発生します。 $getids は while ループ内で変更されることはありません。

しかし、たとえ $getids が変更されようとしていたとしても、ループは $id が $getids['userid'] の値であるかどうかをチェックしていないため、無限ループのままです。値を割り当てているだけです。

于 2013-04-29T09:13:53.143 に答える
1
<?php
$id = $_GET['id'];
$getmembers = mysql_query("SELECT * FROM group_memberships WHERE groupid = $id LIMIT 10");

    while($getids = mysql_fetch_assoc($getmembers)){
    $getusers = mysql_fetch_assoc(mysql_query("SELECT look, username FROM users WHERE id = '$id'"));
    echo ($getusers['username']);
    echo('<br />');
    }
?>

while ループが間違っていたので、 while ループ内でフェッチを行う必要があるため、フェッチが停止するまで続きます。

于 2013-04-29T09:22:08.723 に答える