sql >> データベース >  >> RDS >> Mysql

iOSの緯度と経度のphpクエリがxml出力で近くのmysqllatとlonを検索していません

    あなたはPHPを初めて使用するので、スクリプトを1行ずつ見ていくことで、自分の観察結果をスクリプトに記録すると思いました。

    { $lat = (float)$_GET['lat']; }
    { $lon = (float)$_GET['lon']; }
    

    ここのブレースは不要です。また、入力の健全性チェック(パラメーターが設定されているかどうかを含む)を実行することもできます。

    $minlat = $lat-.1;
    $maxlat = $lat+.1;
    $minlon = $lon-.1;
    $maxlon = $lon+.1;
    

    地上のある範囲内のレコードを検索する場合は、を計算する必要があります。大圏距離 ;現在のアプローチでは、経度0.1度の距離は緯度によって異なり、極での距離はまったくなく、赤道での距離はほぼ7マイルであることに注意してください。

    Googleは、 PHP、MySQL、Googleマップを使用した店舗検索の作成> :MySQLを使用した場所の検索 のセクションに特に注意してください。 および(あなたの場合)PHPを使用したXMLの出力

    残りのコードを1つ以上のtry { ... }に配置します スローされた例外をブロックしてキャッチします。

    $dbh = new PDO('(censored personal information)');
    

    成功したことを確認します:if (!$dbh) die('Unable to create PDO object');

    次に、このPDOオブジェクトを設定して、例外を発生させます$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); プリペアドステートメントをエミュレートするだけではありません$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

    $sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
    

    上記のアドバイスに従ってクエリが大幅に変更される可能性がありますが、MySQLの BETWEEN ... AND ... 演算子:WHERE (lat BETWEEN ? AND ?) AND (lon BETWEEN ? AND ?)

    また、プレースホルダーの代わりに名前付きパラメーターを使用すると、コードの保守が容易になる場合があります。WHERE (lat BETWEEN :minlat AND :maxlat) AND (lon BETWEEN :minlon AND :maxlon)

    $params = array( $minlat, $maxlat, $minlon, $maxlon );
    

    名前付きプレースホルダーを使用する場合は、連想配列を$params = array ( ':minlat' => $minlat, ... );として使用できます。 。

    いずれの場合も、値または変数をパラメーターに個別にバインドできます(これは、一部のパラメーターを変更するだけでクエリを簡単に再実行できるため、私の推奨されるアプローチです):$q->bindParam(':minlat', $minlat); など

    $q = $dbh->prepare( $sql );
    $q->execute( $params );
    $doc = new DOMDocument();
    

    成功したことを確認します:if (!$doc) die('Unable to create DOMDocument object');

    $r = $doc->createElement( "locations" );
    $doc->appendChild( $r );
    foreach ( $q->fetchAll() as $row) {
    

    fetchAll() 結果セット全体をPHPにフェッチします。これは、結果セットが大きい場合に大量のメモリを必要とする可能性があります。各レコードを順番に繰り返し処理したいだけの場合は、通常、必要に応じて各レコードをフェッチすることをお勧めします。while ( $row = $q->fetch() )

      {
    

    このブレース(以下のペアと一緒に)は不要です。

        $e = $doc->createElement( "location" );
        $e->setAttribute( 'name', $row['name'] );
        $e->setAttribute( 'd', $d );
    

    $dはどこにありますか 宣言/割り当てられた変数?

        $r->appendChild( $e );
      }
    

    上記のように、このブレースは不要です。

    }
    print $doc->saveXML();
    



    1. SQL、数値の補助テーブル

    2. 12.2 RAC/GIの新機能

    3. SQLiteはPRINTF()の名前をFORMAT()に変更します

    4. SSMSでオブジェクトエクスプローラーの詳細ウィンドウを使用して複数のオブジェクトを処理する方法-SQLServer/TSQLチュートリアルパート22