Ankündigung

Einklappen
Keine Ankündigung bisher.

Umkreissuche

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Umkreissuche

    Guten Morgen Gemeinde.

    Da ich kein sondeliches Mathegenie bin, habe ich eine Umkreisabfrage via Google genommen. Diese funktioniert aber nur bedingt.
    Ich habe z.Z. 3 Testeinträge in der DB. 2x mit PLZ 04838 und 1x mit 04808.
    Wenn ich nach 04838 abrufe, mit einem Umkreis von 15km, dann list er alles korrekt aus.
    Er fängt mir 0 km entfernung an und liest alle Einträge aus.
    Frage ich jetzt nach der 04808 , dann liest er alle nur nicht den mit 0 km.

    Die Abfrage sieht wie folgt aus:
    PHP-Code:
    $var explode(" "$_POST['umkreis']);
        
    $umkreis $var[0];
        
    $radius  '6378.137';
        
        if(
    $_POST['plz'] != '' ) { $abfrage "patrol_postcode LIKE '".$_POST['plz']."%'"; }
        elseif(
    $_POST['ort'] != '') { $abfrage "patrol_place LIKE '".$_POST['ort']."%'"; }
        else { 
    $abfrage "patrol_postcode = ''"; }
        
        
    #lat und lon von PLZ holen
        
    $geo mysql_query("SELECT lat, lon FROM tankstelle WHERE ".$abfrage." LIMIT 0,1");
        
    $geo_anzahl mysql_num_rows($geo);
        
    $geo_daten mysql_fetch_object($geo);
        
        
    //print_r($geo_daten);
        
        
    if($geo_anzahl == '0') {
            echo 
    "Keine Daten gefunden";
        } else {
            
    #lat und lon umrechnen
            
    $lon $geo_daten->lon 180 M_PI;
            
    $lat $geo_daten->lat 180 M_PI;

            
    #PLZ raussuchen
            
    $sql "SELECT  *, (
                                "
    .$radius." * SQRT(2*(1-cos(RADIANS(lat)) * 
                                cos("
    .$lat.") * (sin(RADIANS(lon)) *
                                sin("
    .$lon.") + cos(RADIANS(lon)) * 
                                cos("
    .$lon.")) - sin(RADIANS(lat)) * sin(".$lat.")))) AS Distance 
                            FROM `tankstelle`
                            HAVING Distance <= '"
    .$umkreis."'
                            ORDER BY Distance "
    ;
        
            
    # Ausgabe der PLZ
            
    $result mysql_query($sql) or die(mysql_error());
            while(
    $row mysql_fetch_object($result) ) {
                
    $preis mysql_fetch_object($sql);
                echo 
    '<pre>'print_r($row), '</pre>';
                echo 
    $row->patrol_postcode." ".$row->patrol_place."<br />";
                } 
        } 
    Kann mir da jemand weiterhelfen?

    Danke


  • #2
    Eine umfangreiche Liste von Postleitzahlen und deren entsprechenden ungenauen Koordinaten (Postleitzahlengebiete sind sehr unterschiedlich gross) hast du ja schon, sonst erhält man eine solche Liste unter

    http://dev.maxmind.com/geoip/legacy/geolite/
    http://dev.maxmind.com/geoip/geoip2/geolite2/


    In den FAQ zu den GeoIP Databases ist unter dem Punkt How can I find nearby postal codes? ist mit Zipdy ein interessantes Projekt auf github verlinkt, das zeigt wie die Distanzabfrage richtig funktioniert.

    Tipp: Im Zipdy-Projekt ist eine PHP-Datei enthalten, die auch den Erdradius berücksichtigt. Diese Funktion solltest du in eine SQL-Abfrage übertragen können.

    Kommentar


    • #3
      Hinweise:

      Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
      Choosing an API
      Warum man mysql* generell nicht (mehr) nutzen sollte.
      Wie man von mysql* auf PDO umsteigt
      Wissenswertes zum Thema SQL-Injection

      Die Verwendung von "*" in SQL-Abfragen wird im Allgemeinen als schlechter Stil angesehen. "*" kann entweder alle Felder aus einer Tabelle, oder (wenn mehrere Tabellen mit einbezogen werden) aus allen Tabellen ziehen.

      Zwei Gründe sprechen dagegen: Wenn du dein Tabellenschema anpasst, wird die Abfrage weiterhin funktionieren. Die Abfrage wird in deinem Code aber Variablen (bzw. Array-Keys) erzeugen, die von deinem Programm so nicht erwartet werden. Das kann (je nachdem, wie deine Applikation aufgebaut ist) zu schwer nachvollziehbaren Problemen führen. Würdest du die Spaltennamen direkt in deiner SQL-Abfrage angeben, würde die SQL-Abfrage direkt lautstark fehlschlagen. Dann kannst du möglicherweise einen Alias für umbenannte Tabellenspalten angeben, ohne dass du deinen Applikationscode anpassen musst.

      Außerdem kann man durch eine explizite Angabe die Reihenfolge und die Anzahl der Tabellenspalten begrenzen. Die Reihenfolge kann je nach Applikation eine Rollen spielen und je weniger Felder man einbezieht, desto schneller wird das Ergebnis zum abfragenden Client übertragen.

      Es ist nicht mehr zeitgemäß, Anwendungslogik und Ausgabelogik zu kombinieren. Dadurch leidet die Wartbarkeit beider Komponenten. In der Regel folgen in PHP geschriebene Applikationen daher dem EVA-Muster, welches einen leicht nachvollziehbaren Datenfluss ermöglicht, besser wartbare Applikationen erzeugt und leichter von anderen Entwicklern verstanden wird. In der PHP-Welt hat sich hierauf aufbauend das (häufig falsch interpretierte) MVC-Muster [1] etabliert (siehe auch DCI oder ADR). Ganz einfach gesagt handelt es sich bei dem EVA-Muster um eine Aufteilung der Aktionen "Auswertung der Eingabeparameter", "Verarbeitung der damit verknüpften Anwendungslogik" und "Erzeugung und Übermittlung der Ausgabe". Oder vereinfacht: Erst Daten sammeln, dann daraus die Darstellung erzeugen und ausgeben. Die Verwendung einer Templateengine (mit Layout-Support) ist dafür Empfehlenswert - jedoch aber keine Voraussetzung.
      Standards - Best Practices - AwesomePHP - Guideline für WebApps

      Kommentar

      Lädt...
      X