2012-10-15 3 views
0

오케이, 신비 하네. 어떤 이유로이 루프 조합은 하나의 도시 레코드만을 반환합니다. 우편 번호 배열 ($ locationzips)이 있습니다. foreach 루프가 제대로 완료 되더라도 모든 항목을 실행할 수 있지만 연관된 도시는 하나만 반환됩니다. 나는 데이터베이스 테이블을 확인했고 우편 번호는 정확한 도시와 함께있다. 나는 무엇을 보지 못하니?

PHP while 루프는 foreach 루프 내에서만 하나의 레코드 만 검색합니다.

foreach ($locationzips as $key => $zip) { 
    $getcities = mysql_query("SELECT * FROM us WHERE code = '$zip'"); 
    echo 'test zip: '.$zip.'<br>'; 
    while($row = mysql_fetch_assoc($getcities)) { 
     $city = $row['city']; 
     echo 'test city: '.$city.'<br>'; 
    } 
} 

이 반환

test zip: 34110<br> 
test city: Naples<br> 
test zip: 34145<br> 
test zip: 34135<br> 
test zip: 33928<br> 
test zip: 33901<br> 
test zip: 33904<br> 
+0

count (mysql_fetch_assoc ($ getcities))는 무엇을 말합니까? – Marcus

+0

SQL은 무엇을 반환합니까? php가 아니라 phpmyadmin처럼? 쿼리에 오류가있을 수 있습니까? – Dorvalla

+0

'$ city' 대신'$ city []'시도 (결과가 여러 개인 경우)'var_dump ($ city)'라고 쓰십시오. – diEcho

답변

0

A) 나는 다음과 같은 스크립트 + 샘플 데이터

<?php 
mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error()); 
mysql_select_db('test') or die(mysql_error()); 
setup(); 
$locationzips = array(34110,34145,34135,33928,33901,33904); 

foreach ($locationzips as $key => $zip) { 
    $getcities = mysql_query("SELECT * FROM tmp_us WHERE code = '$zip'") or die(mysql_error()); 
    echo 'test zip: '.$zip."\n"; 
    while($row = mysql_fetch_assoc($getcities)) { 
     $city = $row['city']; 
     echo 'test city: '.$city."\n"; 
    } 
} 

function setup() { 
    mysql_query(' 
     CREATE TEMPORARY TABLE tmp_us (
      id int auto_increment, 
      city varchar(64), 
      code varchar(16), 
      primary key(id) 
     ) 
    ') or die(mysql_error()); 

    for($code=33901; $code<=34145; $code++) { 
     foreach(range('a','d') as $foo) { 
      $city = $code.'_'.$foo; 
      $stmt = sprintf("INSERT INTO tmp_us (city,code) VALUES('%s','%s')", $city, $code); 
      mysql_query($stmt) or die(mysql_error()); 
     } 
    } 
} 

B를 동작을 재현 할 수 있습니다) 여러 쿼리 할 때 예를 들어, 필요하지 않습니다 IN 연산자를

<?php 
mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error()); 
mysql_select_db('test') or die(mysql_error()); 
setup(); 
$locationzips = array(34110,34145,34135,33928,33901,33904); 


$stmt = sprintf("SELECT * FROM tmp_us WHERE code IN ('%s') ORDER BY code", join("','", $locationzips)); 
$getcities = mysql_query($stmt) or die(mysql_error()); 
$current_code = null; 
while(false!==($row=mysql_fetch_assoc($getcities))) { 
    if ($current_code!=$row['code']) { 
     $current_code = $row['code']; 
     echo 'zip: ', $current_code, "\n"; 
    } 
    echo ' city: ', $row['city'], "\n"; 
} 

function setup() { 
    mysql_query(' 
     CREATE TEMPORARY TABLE tmp_us (
      id int auto_increment, 
      city varchar(64), 
      code varchar(16), 
      primary key(id) 
     ) 
    ') or die(mysql_error()); 

    for($code=33901; $code<=34145; $code++) { 
     foreach(range('a','d') as $foo) { 
      $city = $code.'_'.$foo; 
      $stmt = sprintf("INSERT INTO tmp_us (city,code) VALUES('%s','%s')", $city, $code); 
      mysql_query($stmt) or die(mysql_error()); 
     } 
    } 
} 

인쇄

zip: 33901 
    city: 33901_a 
    city: 33901_b 
    city: 33901_c 
    city: 33901_d 
zip: 33904 
    city: 33904_d 
    city: 33904_c 
    city: 33904_b 
    city: 33904_a 
zip: 33928 
    city: 33928_a 
    city: 33928_b 
    city: 33928_c 
    city: 33928_d 
zip: 34110 
    city: 34110_d 
    city: 34110_c 
    city: 34110_b 
    city: 34110_a 
zip: 34135 
    city: 34135_d 
    city: 34135_c 
    city: 34135_b 
    city: 34135_a 
zip: 34145 
    city: 34145_a 
    city: 34145_b 
    city: 34145_c 
    city: 34145_d 

c) depreacted으로 MySQL의 확장 표시된을 사용. 대신 PDO 같은 것을 사용하십시오.

+0

니스! IN을 사용하는 코드가 마음에 듭니다. 훨씬 더 매끄럽다. 그리고 네, 저는 PDO를 확인하려고합니다. 당신의 도움을 주셔서 감사합니다. –

1

테이블의 모습을 모른 채, 나는이이 작업을 수행 할 수있는 저렴한 방법입니다 말할 것입니다. 나는 당신의 테이블에서 모든 도시 배열을 생성하고 우편 번호로 키를 입력하는 것이 좋습니다. 쿼리를 여러 번 실행할 필요가 없습니다.

$cities = mysql_query("SELECT * from us"); 
    $cityArray = array(); 
    while($row = mysql_fetch_row($cities, MYSQL_ASSOC)){ 
     $cityArray[$row['code']] = $row['city']; 
    } 

    foreach($locationzips as $zip) { 
     print 'Test Zip:' . $zip . '<br>'; 
     print 'Test City:' . $cityArray[$zip] .'<br>'; 
    } 

나는 당신이 그들을 교체에 대해 생각해야, 내가 만 말할 것이다되지 않습니다 ... (즉 mysql_로 *) 기능을 MySQL의 확장 기능을 사용하지에 대해 호언 장담을 시작할 수 있었다; PHP는 비추천 및 삭제할 것입니다. 앞으로 PDO 나 MySQLi를 사용해보십시오. 위의 블록을보다 효율적이고 쉽게 테스트/디버깅 할 수있을 것입니다.

+0

그 제안에 감사드립니다. 미국은 실제로 미국의 모든 우편 번호의 테이블이므로 모든 도시를 배열에 배치하는 것이 좋을 것입니다. 그러나 앞으로 PDO 나 MYSQLi를 사용하여 후속 조치를 취할 것입니다. 나는 mysql_ thingy가 아직 사용되지 않는다는 소식을 듣지 못했기 때문에 머리를 고맙게 생각한다. –