0

わかりました、私は当惑しています。何らかの理由で、このループの組み合わせは 1 つの都市レコードのみを返します。郵便番号 ($ locationzips) の配列があります。それらすべてを実行できますが、foreach ループが正常に完了しても、関連する都市が 1 つしか返されません。データベース テーブルを確認したところ、正しい都市の郵便番号が表示されています。何が表示されないのですか?

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>
4

2 に答える 2

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 の使用を検討してください。上記のブロックの方が効率的で、テスト/デバッグが簡単であることがわかると思います。

于 2012-10-15T11:45:32.317 に答える
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) mysql 拡張機能は非推奨としてマークされています。代わりにPDOのようなものを使用してください

于 2012-10-15T12:01:03.460 に答える