2011-04-28 10 views
1

수천 개의 레코드가있는 MySQL 데이터베이스에서 가져온 이름으로 로고를 만드는 PHP 스크립트를 만들었습니다.PHP : 한 번에 하나씩 MySQL 레코드 가져 오기

로고를 만드는 데 레코드 당 최대 몇 초가 걸릴 수 있으므로 전체 프로세스에는 며칠이 소요됩니다. 내가 지금 만든 스크립트는 모든 데이터를 미리 가져 와서 로고를 만들기 시작합니다. 그러나 스크립트가 실행되는 동안 아직 처리되지 않은 레코드의 데이터가 변경 될 수 있습니다!

다음 레코드를 처리 할 때 최신 데이터를 가져 오는 동안 결과 집합을 반복 할 수 있습니까?

이것은 내가 지금 무엇을 사용 : 당신은 할 수 없습니다

 $sql = "SELECT * FROM names"; 
     $mysqli = new mysqli($server, $user, $password, $database); 
     if ($mysqli->multi_query($sql)) { 
      do { 
      if ($result = $mysqli->store_result()) { 
       while ($record = mysqli_fetch_assoc($result)) { 
       $records[] = $record 
       } 
       $result->close(); 
      } 
      } while ($this->DB->next_result()); 
     } 
     foreach($records as $record) { 
      //create the logo from $record['name'] 
     } 

답변

4

데이터베이스의 각 항목에 대한 고유 ID의가 있고이 스크립트는 "영원히"를 실행 할 수 있는지 알고 있다고 가정하면,이 같은 작업을해야합니다 :

$result = mysql_query('SELECT `id` FROM `logos`'); 
$ids = array(); 

while($id = mysql_fetch_row($result)){ 
    $ids[] = $id[0]; 
} 

// we now have all the ids stored in an array which we'll loop through. 

foreach($ids as $id){ 
    $result = mysql_query('SELECT * FROM `logos` WHERE `id`=' . $id); 
    $row = mysql_fetch_assoc(); 

    // process 
} 

이는 무엇입니까? 이제는 데이터베이스에있는 모든 ID를 가져 오는 것으로 시작합니다. 변수에 저장하고 순환하며 각 행에 대한 최신 데이터를 가져옵니다.

다른 사람들이 말했듯이, 가장 최근의 데이터를 동시에 가지고있는 동안 결과 세트를 반복 할 수는 없습니다. 이것은 대안입니다.

-1

. 매번 단일 행을 쿼리하여 한 번에 하나씩 행을 수동으로 단계별로 실행해야합니다. SELECT 쿼리를 발행하면 MySQL은 결과를 버퍼링합니다. 따라서 쿼리를 실행하고 행을 가져 오는 사이에 데이터가 변경되면 이전에 버퍼링 된 데이터가 생성됩니다.

모든 행에 대해 쿼리를 실행하지 않으려면 일괄 적으로 수행하면됩니다. 예를 들어 쿼리 100은이를 기록하고 처리합니다. 다음 100 등을 조회하십시오.

0

데이터가 이미지로 변환되면 어떻게됩니까? 데이터 행이 테이블에 남아 있습니까?

중요하지 않은 경우 SELECT 끝에 LIMIT 1을 추가하면 요청과 일치하는 첫 번째 항목 만 표시됩니다.

1

아마도 가장 낮은 ID에서 시작하여 하나씩 행을 가져온 다음 최대 ID에 도달 할 때까지 해당 ID를 하나씩 늘리십시오. 해당 ID가있는 레코드가 없으면 다음 레코드로 바로 이동하십시오.

+1

나는 비슷한 것을 제안 할 것이지만, 작업이 끝나면 추가 필드 "done"을 true로 업데이트하면됩니다. 그런 다음 LIMIT 1과 WHERE done = false를 가진 새로운 SELECT. 해야 할 것 같네요. – Erik

0

한 번에 30 줄을 가져 와서 타협 할 수 있습니다. 업데이트 된 행을 다시 실행 목록에 추가하는 일종의 메커니즘을 구현할 수 있습니다.

편집 :

얼마나 자주 테이블을 업데이트합니까? 결과 집합의 절반은 30 시간 변경과 다릅니다. 이것은 일회성 조작입니까? 이 작업이 자주 수행되면 변경 사항을 찾기 위해 계속해서 전체 결과 세트를 검토해야합니다. 또한 행 987에오고 로고를 만들고 행 1032로 이동하면 누군가 행 987을 변경하면 어떻게됩니까?

업데이트 작업이 최소한이라면 변경 결과를 기록하고 모든 로고를 수행 한 다음 다시 돌아가서 로깅을 기준으로 로고를 업데이트하는 업데이트 트리거 이벤트를 작성하여 전체 결과 세트를 얻으려고합니다. (이것은 잔인한 것일 수 있습니다.)

관련 문제