2009-09-15 2 views
1

어떤 이유로 데이터베이스에서 데이터를 가져 오는 데 문제가 있습니다. 목록에있는 첫 번째 항목에서 출발합니다.데이터베이스에서 데이터베이스를 가져올 때 MySQL이 첫 행을 버리는 이유는 무엇입니까?

연결 :

mysql_select_db($database_my_db, $my_db); 

    $query_rs_jobboards11 = "SELECT * FROM jobBoardsSpecTypes ORDER BY type"; 
    $rs_jobboards11 = mysql_query($query_rs_jobboards11, $my_db) or die(mysql_error()); 
    $row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11); 
    $totalRows_rs_jobboards11 = mysql_num_rows($rs_jobboards11); 

출력 :

<form action="" method="get"> 
     <select name="specialty"> 

     <?php do { ?> 

    <option value="<?php echo $row_rs_cms11['type']; ?>"><?php echo $row_rs_cms11['type']; ?></option> 


    <?php } while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)); ?> 


     </select> 

<input type="submit" value="Go" /> 

</form> 

그것은 유형 열에서 첫 번째 항목을 떠나 ​​유지합니다. 항목을 더 추가하면 이전에 제외 된 항목이 표시되고 새 항목이 숨겨집니다.

내가 뭘 잘못하고 있니? 데이터베이스는이 페이지 이외의 모든 것에 대해 완벽하게 작동합니다.

답변

9

이미 첫 번째 행을 $row_rs_jobboards11에 할당 했으므로 do/while 루프에서 $row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)을 호출하면 테이블의 두 번째 행부터 시작합니다.

잠시 대신 do/while을 사용해도 차이는 없지만 다른 변수 이름을 사용하면 효과가 있습니다.

while, do/while 및 while 사이의 차이점을 설명하는 업데이트로 변수 이름이 올바른지 확인하십시오. 작동

동안 루프 : 또한 $ 행 변수와 일치

$row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11); 
do { 
    echo '<tr>'; 
    //stuff here 
    echo '</tr>'; 
} while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)); 

주를 작동하는 루프 동안

while ($row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11)) { 
    echo '<tr>'; 
    //stuff here 
    echo '</tr>'; 
} 

이/않습니다.첫 번째 전화를 끊어도 계속 작동하지만 콘텐츠가 출력되기 전에 추가 (비어 있음)가 표시됩니다. 변수를 다른 이름으로 설정하고 mysql_fetch_ * 호출을 사용하면 내부 데이터베이스 포인터가 테이블의 두 번째 행으로 설정됩니다. 결과적으로 테이블의 첫 번째 행은 다른 (사용되지 않은) 변수로 설정되기 때문에 놓친다. 이야기의

도덕적 :

/루프 동안, 당신은 단지 확인해야합니다 당신은 잠시 나 할 일 중 하나를 사용할 수 있습니다

확인하십시오

  • 당신이 할 일/동안 사용하는 경우, 행 변수는 루프에 들어가기 전에 보다 먼저 생성되어야합니다.. 그리고
  • 변수 이름이 일치하는지 확인하십시오!
+0

흠 ... 이것은 단지 문제 중 하나 일뿐입니다. $ row_rs_cms11이 조건에 할당 되었기 때문에 while 대신 while은 실제로 차이를 만듭니다. while - while 변수는 루프의 첫 번째 실행에서 어떤 값도 가지지 않습니다 ... – hjhill

+0

$ row_rs_jobboards11은 루프에서 사용되는 $ rs_jobboards11 대신 변수가 인스턴스화 된 방법 이었기 때문에입니다 (추가 $ row_). do/while은 적절한 변수를 사용하고 있는지 확인하면 완벽하게 작동합니다. – davethegr8

+0

while 루프 대신 do/while의 명백한 장점은 없지만 여기에 있습니다. 예를 들어, 결과 세트가 비어있는 경우 다른 조치가 수행됩니다. 하지만 mysql_num_rows()를 호출하거나 fetch_assoc() 코드를 중복하는 것은 불필요한 일이다. – VolkerK

3

while 대신 do-while을 사용하고 있기 때문에. 첫 번째 반복에서 $ row_rs_cms11은 정의되지 않습니다.

+0

네 - 영업 이익은 $ row_rs_jobboards11에 첫 번째 행을 설정하기 때문에 항상 특히 while 루프 –

+1

를 사용, 그것은 내부 포인터가 행 2 – davethegr8

+1

@dcaunt에서 찾고있다, 그래서 정의되지 않은 : 아니 당신이 무슨 일을하는지 알고 do-while 루프를 사용할 때 정답입니다. –

2

$ row_rs_cms11은 실제로 $ row_rs_jobboards11을 의미합니다 ($ row_rs_cms11은 처음으로 정의되지 않았습니다).

<?php do { ?> 

<option value="<?php echo $row_rs_jobboards11['type']; ?>"><?php echo $row_rs_jobboards11['type']; ?></option> 


<?php } while ($row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11)) ?> 


    </select> 

do() while() 대신 while()을 사용하면 오류가 더 분명해졌습니다.

while()을 while()으로 변경 한 경우 $ row_rs_jobboards11을 처음으로 가져 오는 코드 부분을 제거해야합니다.

2

do/while 루프의 첫 번째 반복에서는 $row_rs_cms11이 설정되지 않습니다. 코드는 while 코드로 다음 반복에서 설정되지만, 처음 처음에는 공백으로 표시됩니다. 나는 변수를 잘못 명명했다고 생각한다.

변경이 : 여기에

$row_rs_jobboards11 = mysql_fetch_assoc($rs_jobboards11); 

은 : 첫째 mysql_fetc_assoc() 호출은 전혀 간단하게 만 while 루프에 do/while 루프를 변경

$row_rs_cms11 = mysql_fetch_assoc($rs_jobboards11); 

더 나은 아직 수행하지 않는 것이 대신에 첫 번째 행이 읽힐 것입니다.

관련 문제