2010-12-14 7 views
1

저는 PHP와 MySQL에 익숙합니다. 경험이 많은 분이라면 여기에 약간의 지침을 줄 수있을 것입니다.PHP MySQL while 루프는 아무 것도 반환하지 않습니다

<?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']; 


} 
?> 

이 갈 I는 다음과 같이 whcih 일부 테이블이 있습니다 :

npcs 
name|location|npcid 

quests 
name|qid|npcid 

그래서 퀘스트가 npcid 필드를 통해 NPC에 관련되어

나는 다음과 같은 코드가 있습니다.

각 테이블마다 하나의 항목이 있습니다.

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

퀘스트를 볼 수 있고 밥은 모두 내가 밥의 퀘스트를 모두 나열하려고 내 루프 1.

의 npcid을 공유한다. 그러나 코드를 실행하면 퀘스트가 나열되지 않습니다. 성공적으로 예상대로 "정렬 금속 스크랩"표시 내 루프의

$listquests3['name']; 

외부 : 내가 코드를 넣으면

. 루프를 사용한 이유는 내가 추가 할 때 여러 퀘스트를 표시하기 위해서입니다.

누군가가 코드를 살펴보고 내가 잘못한 것을 말해 주면 감사 할 것입니다.

감사합니다.

+0

+1 첫 번째 프로젝트 (들) 중 하나에 퀘스트가 포함되어 있고 npc가 생성되었습니다. –

+0

샘플 코드는 [SQL 주입] (http://unixwiz.net/techtips/sql-injection.html)에 취약하며 매우 심각한 [보안 위험]입니다 (http://bobby-tables.com/) . 이 구멍을 수정하려면 오래된 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)]를 시도하십시오. 저장하는 사이트는 귀하의 사이트 일 수 있습니다. [''die''에 대해서는 HTMl을 출력 할 때 사용하지 마십시오.] (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

하나의 규칙 만 있고 $ listquests3에 그 규칙을 가져온 결과가 이미 가져온 것입니다. :). 제 생각에는 그 선을 제거하면 효과가 있습니다.

0

내부 결합 또는 좌측 결합을 수행해야합니다. 예. 질문을 다시 한 번 확인한 후에 처음으로 "while"루프 바로 앞에있는 "mysql_fetch_array()"코드를 수행하면 변수 "$listquests2"의 값이 손실됩니다. 따라서 "while"루프는 효과가 없습니다.

변수 "$listquests3"에 대해이 단일 행을 제거해야합니다.

+0

대답을 올바르게 입력했다면, 누가 내 대답을 downowoted 사람이 그것을 교정 할 수 있습니까? –

+1

+1 내부 조인 –

0

처음으로 mysql_fetch_array을 호출했을 때 한 행만 있고 그 행을 가져 왔습니다. 두 번째 호출 할 때 결과 집합에서 가져올 행이 더 이상 없으면 함수는 false를 반환하고 루프가 종료됩니다.

0

다음 진술 : "$ listquests3 = mysql_fetch_array ($ listquests2);" 이미 첫 번째를 가져옵니다. Sicne은 하나만 가지고 있고, 더 이상 가져올 것이 없기 때문에 mysql_fetch_array에 대한 다음 호출은 아무 것도 반환하지 않을 것이다.

그걸 수정해야하지만, 자신 만의 '경험'을 위해서는 MySQL 조인 (특히 LEFT JOIN)에 대해 배우기 시작하는 것이 좋습니다. 인터넷에서 쉽게 찾을 수 있습니다!

관련 문제