2010-12-14 10 views
1

私はphpとmysqlには新しくなっていますので、もっと経験豊富な人が私にここでいくつかの指針を与えることができます。PHP MySQL whileループは何も返さない

私は、次のコードを持っている:

npcs 
name|location|npcid 

quests 
name|qid|npcid 

ので、クエストがnpcidフィールドを経由してNPCに関連している:私はこのようになりwhcihいくつかのテーブルを持ってこれを移動するには

<?php 

$npcname = $_GET['npcname']; 
$npcinfo="SELECT * from npcs where name='$npcname'"; 
$npcinfo2=mysql_query($npcinfo) or die("could not get npc!"); 
$npcinfo3=mysql_fetch_array($npcinfo2); 

$listquests = "SELECT * from quests where npcid = '$npcinfo3[npcid]'"; 
$listquests2 = mysql_query($listquests) or die("No Quests to list"); 
$listquests3=mysql_fetch_array($listquests2); 

echo "<b>Quests Available for ".$npcname."</b><br>"; 

while($row=mysql_fetch_array($listquests2)) { 

echo $row['name']; 


} 
?> 

を。

私は各テーブルに1つのエントリを持っています。

Bob|Scrapyard|1 
AND 
Sort Scrap Metal|1|1 

あなたは、私がボブのためのクエストをすべてリストしようとしているクエストとボブの両方を共有私のループでは1

のnpcidを見ることができるように。しかし、コードを実行すると、私はクエストはリストされません。それが成功し、予想通り「ソート金属スクラップ」と表示され、私のループの

$listquests3['name']; 

外:私は、コードを置けば

。私がループを使用した理由は、それらを追加するときに複数のクエストを表示することです。

誰かがコードを見て、私が間違ったことを教えてくれたら、感謝します。

ありがとうございます。

+0

+1あなたの最初のプロジェクト(の1つ)にクエストとnpcを含むものを作るために+1してください。 –

+0

サンプルコードは非常に深刻な[セキュリティリスク](http://bobby-tables.com/)である[SQLインジェクション](http://unixwiz.net/techtips/sql-injection.html)の脆弱性があります。 。この穴を修正するには、旧式のmysqlドライバから[PDO](http://php.net/PDO)に切り替え、[prepared statements](http://www.php.net/PDO.prepared-statements)を使用してください。 PDOチュートリアルが必要な場合は、「PHPとPDOでMySQLスクリプトを書く」(http://www.kitebird.com/articles/php-pdo.html)を試してみてください。あなたが保存したサイトはあなた自身のものかもしれません。 HTMlを出力するときは、['' die''を使用しないでください。](http://www.phpfreaks.com/blog/or-die-must-die)。 – outis

+0

[joins](http://en.wikipedia.org/wiki/Join_%28SQL%29)についてお読みください。複数のステートメントを実行するときに複数のステートメントを発行すると、非効率的でリソースが浪費されます。データベースがデータ操作を処理し、プログラムが他のすべてを処理するようにします。最後に、['SELECT *'](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select)を使わないでください。必要な列だけを選択します。 – outis

答えて

2

SQLを印刷してデータベースに対して実行して、結果を確認することをお勧めします。唯一

$listquests3=mysql_fetch_array($listquests2); 

ラインでフェッチされるつの結果があるかもしれないよう これを見るとそれが見えます。それ以上の結果がないので、ループすることはありません。

+0

ああ、ありがとう!私は、私が最初のフェッチからそれを除外することになるという初期の結果を取り込んだとき、それを認識しませんでした。 – GesterX

0

ルールは1つしかなく、$ listquests3で取得したため、結果はすでに取得されています。私が思うその行を削除するとうまくいくでしょう。

0

INNER JOINまたはLEFT JOINを実行する必要があります。はい、もう一度慎重に質問した結果、最初に "while"ループの前に "mysql_fetch_array()"コードを実行すると、変数 "$listquests2"の値が失われることがわかりました。したがって、 "while"ループは何も効果がありません。

変数 "$listquests3"の場合は、この1行を削除する必要があります。

+0

私は正しく答えを与えている場合、(私の答えをdownowoted who)は、それを修正することができますか? –

+1

+1内部結合 –

0

最初にmysql_fetch_arrayを呼び出すと、その行が1行しか取り出されませんでした。 2回目を呼び出すと、結果セットにフェッチする行がなくなり、関数はfalseを返し、ループが終了します。

0

この文は、 "$ listquests3 = mysql_fetch_array($ listquests2);"すでに最初のものを取り出します。 Sicneには1つしかありません。フェッチする必要はありません。したがって、mysql_fetch_arrayの次の呼び出しでは何も返されません。

それは修正する必要がありますが、自分の経験では、これはMySQL結合(特にLEFT JOIN)の学習を始める良い瞬間かもしれません。あなたはインターネット上で簡単にそれについて多くを見つけることができます!

関連する問題