Friedel: Umkreissuche

Hi, bezugnehmend auf diesen Beitrag: Umkreissuche bzw. auf diesen: mamat-online 《editiert, Tom》

Ist von dieser Umkreissuche wirklich abzuraten? Sie stammt zwar offenbar aus 2008, aber mit dem Beispielskript (und meinen dürftigen eigenen Programmierkenntnissen) erscheint sie mir doch sehr gut.

Danke!

  1. Hello,

    hallo Friedel. Ich habe für Dich die beiden URLs zu Links aktiviert. Das kannst Du mit dem Linksymbol über dem Eingabefeld auch selber ;-)

    Zur Frage:
    Selbstverständlich benätigt man eine aktuelle Datenbank. Da weiß ich im Moment auch keinen Link.
    Abef die Suche selst ist zwar mathematisch ok, aber für die Datenbank sehr aufwändig / teuer. Wenn man nur Orte in einer begrenten Nachbatschaft um den gegebenen sucht, ist es besser, zuerst in einem GK-Quadrat zu suchen und erst diese Obermenge dann mittels der shpärischen Formeln zu bereinigen.

    Für die Obermenge kann man dann "between" benutzen. Das kostet die Datenbabk nur ein Runzeln.

    Ob die zweite Stufe dann auch in der DB berechnet wird (mittels temporärer Tabelle), oder in der API, ist Geschmackssache.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
    1. Abef die Suche selst ist zwar mathematisch ok, aber für die Datenbank sehr aufwändig / teuer.

      Ich habe mich jetzt nicht durch die Links gehangelt. Aber ich bin immer wieder erstaunt, wie blitzschnell und problemlos so eine Formel von der Datenbank mySQL berechnet wird:

      ,ROUND( 6366.19773095 * ACOS( SIN(0.91444053026693) *SIN(RADIANS(ort1.geo_breite)) +COS(0.91444053026693) *COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_laenge) -0.16985231866473 ))) dist_km
      

      Die GPS bezieht sich auf Hannover, das Programm braucht 1.214 sec, um die nächsten 25 Shanty-Chöre aus 1150 Adressen zu finden und als HTML aufzubereiten:

      http://shantyfreun.de/choirs.php?GPS=52.393583,%209.731821

      Wenn ich die GPS von Seoul nehme (37.554701,127.049816), geht's genau so schnell.

      Linuchs

      1. Hello,

        Die Suche selbst ist zwar mathematisch ok, aber für die Datenbank sehr aufwändig / teuer.

        Ich habe mich jetzt nicht durch die Links gehangelt. Aber ich bin immer wieder erstaunt, wie blitzschnell und problemlos so eine Formel von der Datenbank mySQL berechnet wird:

        Die GPS bezieht sich auf Hannover, das Programm braucht 1.214 sec, um die nächsten 25 Shanty-Chöre aus 1150 Adressen zu finden und als HTML aufzubereiten:

        Wieviele Datenstätze hat die Tabelle? Sind das die 1150? Dann sind 1.214 sec. bestimmt nicht "blitzschnell". Und wenn ich das Statement nun auf die Tabellen der OpenGeoDB ansetze (die haben ein paar 100.000 Datensätze), dann kannst Du dir sicherlich vorstellen, wie die Zeit in die Höhe geht. Es kann hier nämlich kein Index benutzt werden, wie es bei "between" möglich wäre. Die Zeilen der Tabelle müssen sequentiell durchgearbeitet werden.

        http://shantyfreun.de/choirs.php?GPS=52.393583,%209.731821

        Wenn ich die GPS von Seoul nehme (37.554701,127.049816), geht's genau so schnell.

        Wo läuft das? Auf deinem Host?

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Wieviele Datenstätze hat die Tabelle? Sind das die 1150?

          Genau. Ich habe 1150 Adressen (Tabelle adressen), verknüpft mit je einem Ort (Tabelle orte). In orte sind die geogr. Koordinaten.

          Dann sind 1.214 sec. bestimmt nicht "blitzschnell".

          In einem anderen Beispiel benötigt die Suche und Aufbereitung von 25 Terminen mit Entfernungsangabe nur 0.124 sec. Ist in ein Konzept eingebunden, in dem ein Cookie das Zentrum definiert, also nicht per Link zu zeigen.

          Um das "wissenschaftlich" zu untersuchen, könnte man ja die Zeit für die Ausführung des SQL-Kommandos messen. Und mit der Lösung vergleichen, die eine Vor-Auswahl trifft.

          Passt in meinem Projekt aber nicht immer, weil diese "between" Sache über die Pole versagt. Oder?

          Und wenn ich das Statement nun auf die Tabellen der OpenGeoDB ansetze (die haben ein paar 100.000 Datensätze), dann kannst Du dir sicherlich vorstellen, wie die Zeit in die Höhe geht.

          Was ist denn das für eine Anwendung? Willst du nach allen Dörfern in der OpenGeoDB suchen? Ich suche nach Adressen, die mit genau einem Ort verknüpft sind.

          SELECT
          ...
          FROM      (".$db[0]['adressen']." adr1
                    ,".$db[0]['orte']." ort1 )
          ...
          WHERE     ort1.id = adr1.ort_id
          ...
          

          Ich habe irgendwas um die 15000 Orte. Meinst du, wenn das zehnmal so viele wären, schlägt das merklich auf die Zeit?

          Es kann hier nämlich kein Index benutzt werden, wie es bei "between" möglich wäre.

          Hä? ID ist einer der schnellsten Indexe.

          Wo läuft das? Auf deinem Host?

          Ja.

          Gruß, Linuchs

          1. Hello,

            Um das "wissenschaftlich" zu untersuchen, könnte man ja die Zeit für die Ausführung des SQL-Kommandos messen. Und mit der Lösung vergleichen, die eine Vor-Auswahl trifft.

            Passt in meinem Projekt aber nicht immer, weil diese "between" Sache über die Pole versagt. Oder?

            Das mag wohl richtig sein. Die Polkreise muss man wahrscheinlich ausnehmen von der Betrachtung, wenn es auf absolute Wege (gekrümmte Strecken) auf der Erdoberfläche ankommt.

            Ich schrieb deshalb auch extra "in einer begrenzten Umgebung" (sollte es zumindest heißen ... ) und meinte damit die üblichen bewohnten Gebiete. Begrenzt heißt hier, dass die durch die Krümmung verursachten Fehler z. B. nicht größer als 10% werden. Das dürfte bei 200km Radius noch der Fall sein.

            Man sollte also unterscheiden, ob man genaue wissenschaftliche Ergebnisse haben möchte (dann wird es aufgrund der Abplattung der Erde noch komplexer) oder ob man den Massenmarkt bedienen will, der wissen will, was ca. 50 - 500km im Umkreis los ist.

            Liebe Grüße
            Tom S.

            --
            Es gibt nichts Gutes, außer man tut es
            Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
            1. Moin,

              Ich schrieb deshalb auch extra "in einer begrenzten Umgebung" (sollte es zumindest heißen ... ) und meinte damit die üblichen bewohnten Gebiete. Begrenzt heißt hier, dass die durch die Krümmung verursachten Fehler z. B. nicht größer als 10% werden. Das dürfte bei 200km Radius noch der Fall sein.

              Das Thema hatten wir doch schon mal. Zwischen den Längen-Graden besteht entfernungsmäßig ein großer Unterschied, ahängig vom Breitengrad.

              Meine Idee war. ein zusätzliches Netz von "Neu-Graden" über den Globus zu legen mit gleichen Abständen. Stell dir vor, die Kugel mit den Breitengraden so zu drehen, dass der bisherige Nordpol auf 0,0 am Äquator liegt.

              Bin mit der Idee nicht weitergekommen, wurde in einem wissenschaftlichen Forum irgendwie nicht verstanden.

              Eine andere Möglichkeit wäre, die Erde mit (etwa) gleichgroßen Quadraten zu überziehen. Das Gauß-Krüger-Koordinatensystem versagt aber für die Entfernungsberechnung wohl auch bei größeren Entfernungen.

              Linuchs

              1. Tach!

                Eine andere Möglichkeit wäre, die Erde mit (etwa) gleichgroßen Quadraten zu überziehen. Das Gauß-Krüger-Koordinatensystem versagt aber für die Entfernungsberechnung wohl auch bei größeren Entfernungen.

                Ja klar, weil dann die kugelähnliche Form der Erde zuschlägt. Ich glaube nicht, dass die klugen Köpfe bisher nur zu dumm waren, solch einfache Lösungen zu finden. Das wird wohl prinzipbedingt nicht besser gehen.

                dedlfix.

              2. Hello,

                Ich schrieb deshalb auch extra "in einer begrenzten Umgebung" (sollte es zumindest heißen ... ) und meinte damit die üblichen bewohnten Gebiete. Begrenzt heißt hier, dass die durch die Krümmung verursachten Fehler z. B. nicht größer als 10% werden. Das dürfte bei 200km Radius noch der Fall sein.

                Das Thema hatten wir doch schon mal. Zwischen den Längen-Graden besteht entfernungsmäßig ein großer Unterschied, ahängig vom Breitengrad.

                Meine Idee war. ein zusätzliches Netz von "Neu-Graden" über den Globus zu legen mit gleichen Abständen. Stell dir vor, die Kugel mit den Breitengraden so zu drehen, dass der bisherige Nordpol auf 0,0 am Äquator liegt.

                Ich erinnere mich gut. Das habe ich damals mangels mathematischer Kompetenz nicht weiter verfolgt. Aber die Idee, eine virtuelle Abbildung für Karten usw. zu erzeugen, hat mich nicht losgelassen. Man könnte stattdessen ja auch die Pole verschieben, also einfach das Netz aus Längen- und Breitengraden so verdrehen, dass es einem besser gefällt. Dafür müsste es dann doch sicher bijektive Funktionen geben? Man müsste auch nur ein paar wenige Verdrehungen zulassen, um die Menge der Möglichkeiten nicht explodieren zu lassen.

                Liebe Grüße
                Tom S.

                --
                Es gibt nichts Gutes, außer man tut es
                Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
                1. Ich versuche meinen Ansatz noch mal mit einer Skizze zu verdeutlichen.

                  Bildbeschreibung

                  Die grüne Linie ist ein Breitengrad.

                  Zwei Breitengrade sind 40.000 km / 360 = 111,11... km voneinander entfernt. Für 20 km muss ich also 0,18 Grad addieren (nach Nord) und subtrahieren (nach Süd).

                  Meine neu gedachten Kreise (rot) haben auch diesen Abstand voneinander.

                  Jeder beliebige Ort der Erde liegt nun auf einem Breitenkreis und einem Neukreis. Der Neukreis ist der, der den Breitenkreis tangiert. Also anders als im bisherigen System liegt ein geografischer Punkt nicht auf einem Schnittpunkt beider Systemen, davon gäbe es nämlich zwei.

                  Nun haben also auch die Neugrade einen Abstand von 111,11 km bei Kugelform.

                  Also auch hier für 20 km 0,18 Grad addieren und subtrahieren.

                  Habe ich einen Denkfehler? Wenn nein, mit welcher Formel könnte ich nun die Neugrade aller Orte in der DB aus Latitude und Longitude berechnen? Und dann speichern.

                  Linuchs

                  Edit: Für die meisten Punkte der Erdoberfläche gibt es doch Schnittpunkte und keine Berührungspunkte. Also mus noch gespeichert werden, welcher von den beiden.

                2. Hallo,

                  und was willst du erreichen, wenn du den Pol verschiebst, z.B. in den Hartz?

                  Gruß
                  Jürgen

              3. Hallo,

                hast du schon mal versucht, einen Globus vollständig und überlappungsfrei mit quadratischen Flicken zu bekleben?

                Gruß
                Jürgen

                1. Hallo,

                  hast du schon mal versucht, einen Globus vollständig und überlappungsfrei mit quadratischen Flicken zu bekleben?

                  Vergleich mit einem Fußball, da gehts ja auch. Du musst nur ein bisschen großzügiger sein, was die Anzahl der Ecken eines Quadrates angeht ;)

                  Gruß
                  Kalk

          2. Tach!

            Es kann hier nämlich kein Index benutzt werden, wie es bei "between" möglich wäre.

            Hä? ID ist einer der schnellsten Indexe.

            Wenn du für die Selektion von Datensätzen eine Formel im WHERE hast, muss diese für jeden Datensatz einzeln berechnet werden. Es gibt keine Indexe mit berechneten Ausdrücken (in MySQL).

            Zum Beispiel beim Suchen nach Datümern, sollte man nicht heute < Datumsfeld - 7 Tage als Bedingung nehmen, sondern heute + 7 Tage < Datumsfeld um die nächsten 7 Tage mit zu berücksichtigen. Der Wert heute + 7 Tage kann dann einmalig berechnet werden und muss nur noch gegen den Index auf dem Datumsfeld geprüft werden (also, wenn da ein Index ist). Ansonsten hätte jedes Datumsfeld erst berechnet werden müssen, um verglichen werden zu können.

            dedlfix.

            1. Moin,

              Wenn du für die Selektion von Datensätzen eine Formel im WHERE hast, muss diese für jeden Datensatz einzeln berechnet werden.

              Ja. Und das geht überraschend schnell. Für Veranstaltungen "NL-9670 Winschoten + 20 km" müssen etwa 1000 Veranstaltungen berechnet werden. Nach 0.064 sec sind die 8 Sätze gefunden und die HTML Seite aufbereitet.

              Bei NL-9670 Winschoten + 100 km und 100 zulässigen Positionen dre Anzeige werden 0.084 sec gebraucht.

              Allerdings wird bei Neueingabe / Änderung pro Veranstaltung ein HTML-Snippet erzeugt und im Datensatz hinterlegt. Aber wir schreiben hier ja über das "Finden" der Sätze.

              Die WHERE-Klausel in Rohform (ist jedesmal anders)

              FROM        (".$db[0]['termine']." trm1
                          ,".$db[0]['orte']." ort1 )
              
              WHERE       ort1.id = trm1.ort_id
              AND        (trm1.gesperrt_bis IS NULL OR trm1.gesperrt_bis <= NOW())
              AND         trm1.intern_kz = 0
              AND         (trm1.tag >= '".addslashes($arr_in['tag_von'])."' OR  trm1.tag_bis >= '".addslashes($arr_in['tag_von'])."' )
              AND         (trm1.tag <= '".addslashes($arr_in['tag_bis'])."' OR  trm1.tag_bis <= '".addslashes($arr_in['tag_bis'])."' )
              AND         ROUND( 6366.19773095 * ACOS( SIN(".$rad_lat1.") *SIN(RADIANS(ort1.geo_breite)) +COS(".$rad_lat1.") *COS(RADIANS(ort1.geo_breite)) *COS(RADIANS(ort1.geo_laenge) -".$rad_lon1." ))) <= '".$arr_in['KM']."'
              ORDER BY  trm1.tag, trm1.uhr
              LIMIT ".$start_nr.",".addslashes($arr_in['posi'])."
              

              Linuchs

              1. Tach!

                Wenn du für die Selektion von Datensätzen eine Formel im WHERE hast, muss diese für jeden Datensatz einzeln berechnet werden.

                Ja. Und das geht überraschend schnell. Für Veranstaltungen "NL-9670 Winschoten + 20 km" müssen etwa 1000 Veranstaltungen berechnet werden. Nach 0.064 sec sind die 8 Sätze gefunden und die HTML Seite aufbereitet.

                Das sind ja auch keine Datenmengen, bei denen heutige Rechentechnik ohne Optimierung Schwierigkeiten hätte, sie durchzurechnen. Wenn du irgendwann mal mit richtigen™ Datenmengen zu tun hast, wirst du die Unterschiede eher merken.

                dedlfix.

              2. Kann es sein, dass die "einfachen" WHERE-AND-Kriterien von mySQL zuerst geprüft werden, sodass die kompliziert aussehende Entfernungsformel nur noch auf eine Teilmenge angewendet wird?

                1. Tach!

                  Kann es sein, dass die "einfachen" WHERE-AND-Kriterien von mySQL zuerst geprüft werden, sodass die kompliziert aussehende Entfernungsformel nur noch auf eine Teilmenge angewendet wird?

                  Es kann sein, dass ein EXPLAIN in groben Zügen verrät, was der Optimizer für die aktuelle Anfrage zu tun gedenkt. Das fällt je nach Datenmenge auch mal unterschiedlich aus.

                  Aber so detailliert, dass man jeden Rechenschritt verfolgen kann, ist EXPLAIN auch wieder nicht.

                  Wenn für die Berechnung eines Wertes Feldwerte benötigt werden, dann kann man da nur die vollständige Tabelle durchrechnen. Wenn jedoch ein konstanter Wert oder ein Ausdruck mit stets gleichem Ergebnis nur noch mit Feldinhalten verglichen werden muss, dann kann ein Index abkürzen und es wird kein Full Table Scan benötigt.

                  dedlfix.

              3. Hi,

                FROM        (".$db[0]['termine']." trm1
                AND         (trm1.tag >= '".addslashes($arr_in['tag_von'])."' OR  trm1.tag_bis >= '".addslashes($arr_in['tag_von'])."' )
                

                warum benutzt Du addslashes anstelle der korrekten db-abhängigen escape-Methode (mysql_real_escape bzw. deren Nachfolger für mysqli ...)?

                cu,
                Andreas a/k/a MudGuard

                1. Tach!

                  warum benutzt Du addslashes anstelle der korrekten db-abhängigen escape-Methode (mysql_real_escape bzw. deren Nachfolger für mysqli ...)?

                  Ganz so schlimm ist es auch wieder nicht, solange es richtig angewendet wird. mysql(i)_real_escape_string() behandelt die für das Statement wichtigen Zeichen in derselben Weise wie addslashes(). Es maskiert lediglich noch ein paar weitere Zeichen, die erst später in Logfiles, aber nicht mehr für die Query eine Rolle spielen. Dass die mysql-Funktionen außerdem noch die Zeichenkodierung berücksichtigen, hat keine Auswirkungen auf ASCII-basierte Kodierungen wie ISO-8859-1 und UTF-8. Die kritischen Zeichen sind alle im ASCII-Bereich und außerhalb kommen keine Bytefolgen vor, die damit verwechselt werden könnten.

                  dedlfix.

                  1. Hallo dedlfix,

                    warum benutzt Du addslashes anstelle der korrekten db-abhängigen escape-Methode (mysql_real_escape bzw. deren Nachfolger für mysqli ...)?

                    Ganz so schlimm ist es auch wieder nicht, solange es richtig angewendet wird. mysql(i)_real_escape_string() behandelt die für das Statement wichtigen Zeichen in derselben Weise wie addslashes(). Es maskiert lediglich noch ein paar weitere Zeichen, die erst später in Logfiles, aber nicht mehr für die Query eine Rolle spielen.

                    Das ist im Moment zwar richtig, kann sich aber jederzeit ändern. Deshalb ist es wichtig, die richtige Methode zum escapen zu verwenden; die ist die einzige, die garantiert, dass es auch richtig escaped wird.

                    LG,
                    CK

                    1. Tach!

                      Das ist im Moment zwar richtig, kann sich aber jederzeit ändern. Deshalb ist es wichtig, die richtige Methode zum escapen zu verwenden; die ist die einzige, die garantiert, dass es auch richtig escaped wird.

                      Die Wahrscheinlichkeit halte ich für äußerst gering. Da müsste schon grundlegend etwas an der Syntax für Stringliterale gedreht werden. Und das würde jede Menge Anwendungen kaputtmachen, die Escaping nicht oder anders verwenden. Solch ein Schritt wird nicht ohne Not erfolgen.

                      Es ist zwar richtig, die genau dafür vorgesehene Funktion zu verwenden, aber ich kann die Situation jetzt auch nicht dramatischer machen, als ich sie einschätze.

                      dedlfix.

                      1. Hallo dedlfix,

                        Die Wahrscheinlichkeit halte ich für äußerst gering. Da müsste schon grundlegend etwas an der Syntax für Stringliterale gedreht werden. Und das würde jede Menge Anwendungen kaputtmachen, die Escaping nicht oder anders verwenden. Solch ein Schritt wird nicht ohne Not erfolgen.

                        Es ging mir nicht um die Wahrscheinlichkeit. Es ging mir darum, dass diese Fehlerklasse sich leicht vermeiden lässt indem man die korrekte Methode zum escapen verwendet. Wenn man Fehlerklassen vermeiden kann, sollte man das tun, Stichwort robuste Programmierung - es gibt schon mehr als genug Möglichkeiten Bugs einzubauen.

                        Edit: um das nochmal zu verdeutlichen: für einen Sicherheits-Aspekt sind mir das zu viele Wenns und Abers. Du hast recht, dass addslashes() reicht, wenn UTF-8 als Encoding benutzt wird. Aber das alles zu beachten ist zu komplex, KISS ist für Security essentiell. Eliminiere diese Fehlerklasse! In anderen Encodings gibt es nämlich durchaus die Möglichkeit, addslashes() auszutricksen, siehe etwa diesen Blogpost (danke, @mermshaus, für den Link).

                        LG,
                        CK

              4. Tach!

                LIMIT ".$start_nr.",".addslashes($arr_in['posi'])."

                addslashes() hat an der Stelle keinen Sinn. Dort wird eine Zahl verlangt. Eine Zwangsvertypisierung mit intval() hilft an der Stelle. Da kann dann zwar immer noch 0 für ungültige Werte rauskommen, aber das richtet keinen Schaden an.

                Du bist nicht in einem String, aus dem man mit Anführungszeichen ausbrechen könnte, was man mit den Slashes verhindern könnte. Stattdessen bist du im Befehlsmodus und kannst Syntaxbestandteile direkt angeben und ausführen lassen.

                dedlfix.

                1. Moin,

                  LIMIT ".$start_nr.",".addslashes($arr_in['posi'])."

                  addslashes() hat an der Stelle keinen Sinn. Dort wird eine Zahl verlangt. Eine Zwangsvertypisierung mit intval() hilft an der Stelle. Da kann dann zwar immer noch 0 für ungültige Werte rauskommen, aber das richtet keinen Schaden an.

                  Sehe ich anders. Sämtliche GET und POST Werte kopiere ich in das array $arr_in. Da ist gleich oben im Programm klar, welche Werte erwartet werden. Die können nun geprüft und ergänzt werden. Z.B. wenn ich tag_von und tag_bis benötige, aber nur (Anzahl der) tage und tag_von reinkommt.

                  Wie ich hier gelernt habe, gibt es böse Mädchen, die ganz seltsame Werte schicken. Wenn also $_POST['posi'] einen unerwarteten Wert hat, sollten Angriffe mit addslashes abgewehrt werden. Warscheinlich wird dann ein SQL-Fehler gemeldet.

                  Du bist nicht in einem String, aus dem man mit Anführungszeichen ausbrechen könnte, was man mit den Slashes verhindern könnte. Stattdessen bist du im Befehlsmodus und kannst Syntaxbestandteile direkt angeben und ausführen lassen.

                  Ich gehe auf Nummer sicher, anstatt mich auf meine unzulänglichen Kenntnisse über Betrugsversuche zu verlassen.

                  Linuchs

                  1. Tach!

                    LIMIT ".$start_nr.",".addslashes($arr_in['posi'])."

                    addslashes() hat an der Stelle keinen Sinn. Dort wird eine Zahl verlangt. Eine Zwangsvertypisierung mit intval() hilft an der Stelle. Da kann dann zwar immer noch 0 für ungültige Werte rauskommen, aber das richtet keinen Schaden an.

                    Sehe ich anders.

                    Du hast dann augenscheinlich das Prinzip nicht verstanden.

                    Wie ich hier gelernt habe, gibt es böse Mädchen, die ganz seltsame Werte schicken. Wenn also $_POST['posi'] einen unerwarteten Wert hat, sollten Angriffe mit addslashes abgewehrt werden. Warscheinlich wird dann ein SQL-Fehler gemeldet.

                    Nein. addslashes() und die datenbankspezifische Funktion mysqli_real_escape_string() entfernen nicht mit Magie alles Böse aus den Eingaben. Sie sorgen (vorwiegend) dafür, dass Anführungszeichen mit einem \ davor ergänzt werden, damit sie in einem Stringliteral als literales Anführungszeichen gelesen werden.

                    Wenn du nicht in einem String bist, wie das bei LIMIT der Fall ist, hilft ein maskiertes Anführungszeichen nicht weiter. Der Angreifer braucht kein Anführungszeichen, um den String vorzeitig zu beenden, weil er ja nicht in einem solchen gefangen ist. Wenn er Syntaxbestandteile in seiner Eingabe hat, gelangen die direkt ins Statement.

                    Das Ziel ist, ein syntaktisch korrektes Statement zu erzeugen, bei dem Werte Werte bleiben und nicht zum einem anderen Statementbestandteil mutieren. mysqli_real_escape_string() maskiert, wie der Name es schon sagt, Strings. Für Zahlenwerte gibt es keine Möglichkeit, Zeichen zu maskieren. Eine Zahl muss nach den Syntaxregeln für Zahlen geschrieben werden. Es gibt auch keine Funktion, die beliebige Werte in eine korrektes Zahlenliteral pressen kann. Aber intval() oder ein Typecast zu int sorgen zumindest dafür, dass nicht als Zahl interpretierbare Zeichenfolgen zu 0 konvertiert werden.

                    Du bist nicht in einem String, aus dem man mit Anführungszeichen ausbrechen könnte, was man mit den Slashes verhindern könnte. Stattdessen bist du im Befehlsmodus und kannst Syntaxbestandteile direkt angeben und ausführen lassen.

                    Ich gehe auf Nummer sicher, anstatt mich auf meine unzulänglichen Kenntnisse über Betrugsversuche zu verlassen.

                    Ja, aber damit gehst du nicht sicher, sondern hast aufgrund deiner unzulänglichen Kenntnisse eine Sicherheitslücke drin, weil deine Gegenmaßnahme unwirksam ist.

                    dedlfix.

  2. Hello,

    vielleicht kommst Du mit der OpenStreetmap weiter.
    Hierzu gibt es einen interessanten Artikel

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
    1. Vielen Dank!

      Zur OpenStreetMap gibt es diesen Beitrag bzw. diesen. Daran muss ich mich mal versuchen.

      Generell muss ich auf ein fertiges Modell zurückgreifen, meine Kenntnisse sind sehr rudimentär und zum Einarbeiten fehlt mir die Zeit. Daher könnte es auch hierauf hinauslaufen, den Link gibt's hier ebenfalls im Forum.

      Oder kennt jemand eine Lösung, die schon relativ fertig und auch für einen Laien umzusetzen ist?

      Vielen Dank!

      1. Hello,

        da: diesen Beitrag kommt nichts.

        Stimmt der Link?

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Bei mir gehen alle Links 😀 Link

  3. Auch wenn ich Eure sehr anregende (und auch interessante) Diskussion nicht stören möchte (von der ich leider nur die Hälfte nachvollziehen kann :-)), für mich persönlich wäre es relativ egal, ob der Umkreis genau 50km umfassen würde oder ob dann auch Orte erscheinen, die 65km entfernt sind. Darauf käme es für mich nicht an.

    Aufgrund meiner beschränkten Kenntnisse bin ich auf eine relativ fertige Lösung angewiesen, daher hat sich die Lösung von Mamat-Online angeboten. Das ist der Bereich, den mit meinen Kenntnissen überein geht. Ich möchte eine private Seite erstellen, eine Art Reiseblog. Da wird mich hoffentlich keiner verklagen, wenn er 20 Kilometer zu weit gefahren ist.

    Mir fehlt im Endeffekt bei der Sache die Detailkenntnis. Ich meine: Was muss da groß an Datenbanken gepflegt werden, es entsteht ja nicht alle Nase lang irgendwo eine neue Siedlung, die Stadtrechte bekommt. Etwas polemisch, aber Ihr wisst hoffentlich, was ich meine.

    Nochmals vielen Dank für jeden Beitrag und jede Hilfe!

    1. Was ist denn hiervon zu halten? Ist der Preis in Ordnung?

      1. Hello,

        es gibt Daten bei den statistischen Landesämtern und beim Bundesamt für Statistik. Die sollten eigentlich schon sehr umfangreich sein.

        Und die OpenStreetMap solltest Su auch nochmal genauer untersuchen.

        Außerdem sind die Daten der OpenGeoDb noch nicht vergammelt, da sich außer ein paar Zusammenschlüssen von Gemeinden kaum etwas geändert hat. Die Kontinentaldrift ist nicht so groß, dass die Geokoordinaten gar nicht mehr stimmen.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
        1. Die Kontinentaldrift ist nicht so groß, dass die Geokoordinaten gar nicht mehr stimmen.

          Sag das nicht. Ich habe vor ein paar Jahren auf der Webseite der lokalen Zeitung gelesen, dass der Pilsumer Leuchtturm um ca. 50m versetzt wurde, damit seine Koordinaten mit den Seekarten wieder übereinstimmen. Es war sogar ein Bild dabei mit dem verlassenen Fundament des ehemaligen Standortes.

          Ein sehr informativer und (fast) glaubhafter Artikel. Bis ich das Datum sah.

          Leider habe ich den Artikel nicht wiedergefunden, hätte ihn gerne verlinkt.

          Linuchs

          1. Hallo,

            Die Kontinentaldrift ist nicht so groß, dass die Geokoordinaten gar nicht mehr stimmen.

            Sag das nicht. Ich habe vor ein paar Jahren auf der Webseite der lokalen Zeitung gelesen, dass der Pilsumer Leuchtturm um ca. 50m versetzt wurde, damit seine Koordinaten mit den Seekarten wieder übereinstimmen.

            Bis 10 cm / Jahr! Nicht unerheblich, aber die Seekarten müssen ziemlich alt gewesen sein…

            Gruß
            Kalk

    2. Mir fehlt im Endeffekt bei der Sache die Detailkenntnis. Ich meine: Was muss da groß an Datenbanken gepflegt werden, es entsteht ja nicht alle Nase lang irgendwo eine neue Siedlung, die Stadtrechte bekommt.

      Bei mir kann jedermann nach Registrierung Events eingeben, die einen Ort benötigen. Wenn Ort fehlt, kommt eine Rückfrage und Ort kann angelegt werden. Meine Aufgabe ist dann, die geografischen Koordinaten nachzutragen.

      Neue Orte können Sinn machen, weil sich in der Ex-DDR immer wieder Kommunen unter neuem Namen zusammenschließen oder weil eine Meisterchaft in Nanjing 南京 gemeldet wird. Und China ist in der Datenbank nicht enthalten

      Oft ist das aber auch Unfug, wenn der Feuerwehrball in Posemuckel gemeldet wird, ein Ortsteil von Hinterwaldbach mit 178 Einwohnern. Dann ändere ich auf Hinterwaldbach.

      1. Auf welcher Basis hast Du die Sache denn erstellt? (Wenn ich fragen darf)

        1. Auf welcher Basis hast Du die Sache denn erstellt? (Wenn ich fragen darf)

          Ich habe 2008 die Deutschland-Daten der OpenGeoDB in die eigene Datenbank übernommen.

          1. Danke! Hattest Du denn viele Änderungen seit 2008? Vielleicht kennst Du dann ja die Variante von Mama-Online, die ist für mich sehr gut, da sie meinen Kenntnissen (halbwegs) entspricht. Wenn es da nicht viele Änderungen gab, dann würde das für mich ja passen.