2017-03-09 4 views
-1

Ich habe eine Tabelle mit dem Namen Nachrichten, bei denen ein Eintrag des gleiches wie die folgenden enthält:PHP: Kombination mit und wo arbeitet nicht in mysql Abfrage

longtitude = 4.867478333333334 
latitude = 52.31819833333334 
username = 'pb' 

Wenn ich auf dem Tisch Abfrage mit der unten:

$longitude=4.867478333333334 
$latitude=52.31819833333334 
$username='pb' 
$search='' 
$visibledistance=2 

die unter mysql Abfrage mit:

ich bekomme keine Ergebnisse. Wenn ich die HAVING-Distanz < '$ visibledistance' entferne, bekomme ich alle Einträge, die den restlichen Kriterien entsprechen, also ist nichts falsch mit irgendetwas außer der Entfernung. Könnte mir jemand helfen zu verstehen, wie ich das richtig machen kann?

Danke!

+2

* "Wenn ich auf die Tabelle mit dem folgenden abfrage:" * - Haben Sie jede Aussage geschlossen? Dies ist ein technischer Hinweis für zukünftige (Neu-) Besucher, die vielleicht denken, dass das eine gültige Syntax in PHP ist. –

+2

Auf der Nebennote hoffe ich, dass dies nie in den Code, der aus dem Internet ausgeführt wird, gehen wird. Es ist die Definition der SQL-Injektion. – v010dya

+0

Siehe http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php und http://stackoverflow.com/documentation/php/5828/pdo/2685/preventing- sql-injection-with-parametrized-Abfragen # t = 201703091904411986445 für weitere Informationen – WOUNDEDStevenJones

Antwort

1

wenn Sie numerische Wert, den Sie die einfachen Anführungszeichen um die vars vermeiden sollten

und Sie sollten concat verwenden für wie

(für haben, wenn Sie ‚$ visibledistance‘ verwenden Sie eval HAVING distance < '4' (Sie sind EVAL distanzieren Sie in Bezug auf eine Zeichenfolge)

zum Code der Suche
Sie keine Aggregationsfunktion verwenden, so dass Sie nicht brauchen, die Sie nutzen könnten, wo (aber noy Alias) für Fliter und distcint statt Gruppe von

$query=("SELECT distinct 
    subject,username,message,timestamp,(
     6371 * acos (
      cos (radians($latitude)) 
     * cos(radians(Messages.latitude)) 
     * cos(radians(Messages.longitude) - radians($longitude)) 
     + sin (radians($latitude)) 
     * sin(radians(Messages.latitude)) 
    ) 
    ) AS distance FROM Messages WHERE username ='pb' AND ((subject LIKE concat('%', '$search', '%') 
      OR (message LIKE concat('%','$search','%'))  

    WHERE (
     6371 * acos (
      cos (radians($latitude)) 
     * cos(radians(Messages.latitude)) 
     * cos(radians(Messages.longitude) - radians($longitude)) 
     + sin (radians($latitude)) 
     * sin(radians(Messages.latitude)) 
    ) 
    ) < $visibledistance 
    ORDER BY timestamp"); 
+0

Danke, ich habe alle einfachen Anführungszeichen von numerischen Werten entfernt, aber das Ergebnis ist das gleiche. Mein Verdacht ist, dass dies mit der Adressierung der Breiten- und Längenfelder mit "Nachrichten" zusammenhängt, da ich andere Leute gesehen habe, die sich mit dieser Aufgabe beschäftigen, die dazu ermutigt wurden, JOIN zu benutzen, aber ich bin mir nicht sicher, ob ich das wirklich tun muss Das. –

+0

beitreten oder wo Bedingung das gleiche Ergebnis .. so das ich nicht das Problem .. stattdessen für echte Daten überprüfen .. ... versuchen Sie, die echte Abfrage von PHP erstellt und versuchen, es in einer SQL-IDE auszuführen .... (könnte auch sein, dass $ search = '' ist nicht gut) – scaisEdge

+0

Was ich meine ist, dass ich es bekam "messages.latitude" - arbeitete nie mit der Adressierung einer Spalte vor diesem Weg. Die Suche funktioniert gut wie es ist .. wenn ich die Teile HAVING, GROUP BY und ".............. AS distance" entferne, funktionieren die Dinge gut - so war es früher, aber jetzt brauche ich einen Teil der Abfrage, um die Koordinaten zu berücksichtigen, womit ich mich abmühen muss. –