2014-06-13 3 views
0

쿼리를 실행하고 아래 코드로 필드 중 하나를 수정하여 루프를 반복합니다. 짧은 시간 동안 수정 된 번호 만 필요하며 데이터베이스로 돌아갈 필요가 없습니다. 이것은 올바르게 작동하고, 에코를 사용하여 예상 값을 출력합니다.mysqli_data_seek를 사용한 데이터 손실

while ($d1 = mysqli_fetch_array($d1_query)) 
{ 
    echo "Before: " . $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br>"; 

    if ($e1['e_id'] == $h1['e_id']) 
     $d1['d1_earn_rate'] = $d1['d1_earn_rate'] * 1.2; 

    echo "After: " . $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br><br>"; 
} 

그런 다음 결과의 하위 집합 합계를 계산하려고합니다. mysqli_data_seek를 사용하여 카운터를 첫 번째 행으로 재설정하므로 루프를 통과 할 수 있습니다. 그러나, 내가 할 때, 그것은 수정 된 것들이 아니라 쿼리의 원래 숫자에 기초하여 합계를 계산합니다.

이전에 msqli_data_seek를 아무런 문제없이 사용했지만이 과정에서 데이터를 다시 루프하기 전에 데이터를 수정 한 것은 이번이 처음입니다. 왜 데이터를 잃어 버리는 지 이해할 수 없습니다.

mysqli_data_seek($d1_query,0); 
$counter = 0; 
while ($counter < 15) 
{ 
    $counter++; 
    $d1 = mysqli_fetch_array($d1_query); 
    echo $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br>"; 
    $total_earn_rate += $d1['d1_earn_rate']; 
} 
+0

이 기능을 사용하지 마십시오. 배열을 대신 배우십시오. –

+2

'$ d1'에 대입하면 질의 결과가 변경되지 않고 단지 행의 복사본으로 변수가 수정됩니다. – Barmar

+2

'$ d1'에 할당하면'$ d1'을 수정 한 다음 다시'$ d1'에 할당합니다. 왜 당신이 mysqli_fetch_array에 의해 반환 된 데이터를 바꾸기를 기대 하는가? – deceze

답변

1

너는 너무 깊이 생각하는 것처럼 보입니다. 문제는 아주 간단합니다 :

  • MySQL 서버는 메모리에 결과 집합을 보유하고, 이전 쿼리의 결과는
  • mysqli_fetch_array는 PHP의 메모리에 MySQL 서버에서 데이터를 끌어와 그것을
  • 를 반환하면 '당신이
  • 위의 과정을 결과 집합의 MySQL의 내부 포인터를 다시 반복 $d1를 조작하고 $d1
  • 해당 가져온 데이터를 할당 다시

MySQL 서버가 보유하고있는 결과 세트를 다루는 시점이없고, 항상 mysqli_fetch_array을 통해 설명한 MySQL 결과 세트에서 데이터를 새로 가져 오는 중입니다. 이 함수를 호출 할 때마다 MySQL이 보유한 결과 집합에서 수정되지 않은 데이터를 가져옵니다.

+0

분명한 답변을 보내 주셔서 감사합니다. 나는 그 모든 것을 알지 못했지만, 지금은 나에게 의미가 있으며 분명합니다. – Dizzy49