2016-11-30 4 views
0

Ich habe eine Webseite, auf der ein Benutzer auf eine Karte klickt, die Längen- und Breitengrade werden an Textfelder übergeben und zusammen mit einigen anderen Details werden die Daten an die Datenbank gesendet. Ich habe eine Formel für die Berechnung der nächsten Stadt, und ich habe eine kleine Stichprobe von Städten mit ihren Breiten und Logitudes.Auswählen und Einfügen in eine Abfrage SQL

Im Moment kann ich die nächste Stadt und Entfernung anzeigen, aber ich kann es nicht an die Datenbank senden. Ich denke, ich muss die zwei Fragen zusammensetzen, aber ich weiß nicht wie. Bitte sei nett, ich weiß, dass mein Code schrecklich ist und ich habe viele Sicherheitsprobleme, die ich später angehen werde. Vielen Dank!

<?php 

$conn = Connect(); 

/** 
* Use the Haversine Formula to display the 100 closest matches to $origLat, $origLon 
* Only search the MySQL table $tableName for matches within a 10 mile ($dist) radius. 
*/ 

$origLat = $conn->real_escape_string($_POST['lat']); 
$origLon = $conn->real_escape_string($_POST['lng']); 

// This is the maximum distance (in miles) away from $origLat, $origLon in which to search 
$dist = 50; 

$query = "SELECT Townland, lat, lng, 3956 * 2 * 
      ASIN(SQRT(POWER(SIN(($origLat - lat)*pi()/180/2),2) 
      +COS($origLat*pi()/180)*COS(lat*pi()/180) 
      *POWER(SIN(($origLon-lng)*pi()/180/2),2))) 
      as distance FROM townland WHERE 
      lng between ($origLon-$dist/cos(radians($origLat))*69) 
      and ($origLon+$dist/cos(radians($origLat))*69) 
      and lat between ($origLat-($dist/69)) 
      and ($origLat+($dist/69)) 
      having distance < $dist ORDER BY distance limit 1"; 

$result = mysqli_query($conn, $query) or die(mysql_error()); 
while($row = mysqli_fetch_assoc($result)) { 
    echo $row['Townland']." > ".$row['distance']."<BR>"; 
} 


$User_ID = $conn->real_escape_string($_POST['User_ID']); 
$Species_Name = $conn->real_escape_string($_POST['Species_Name']); 
$No_Of_Birds = $conn->real_escape_string($_POST['No_Of_Birds']); 
$newdate = $conn->real_escape_string($_POST['Sighting_Date']); 
//Converts date to 'yyyy-mm-dd' acceptable to mysql 
$newdate=date('Y-m-d',strtotime($newdate));  
$Sighting_Details = $conn->real_escape_string($_POST['Sighting_Details']); 
$lat = $conn->real_escape_string($_POST['lat']); 
$lng = $conn->real_escape_string($_POST['lng']); 
$townland = $row['Townland']; 

$query = "INSERT into sighting 
       (User_ID, Species_Name, No_Of_Birds, 
       Sighting_Date, Sighting_Details, 
       lat, lng, Townland) 
      VALUES('" . $User_ID . "','" . $Species_Name . "','" . $No_Of_Birds . "','" 
      . $newdate . "','" . $Sighting_Details . "','" 
      . $lat . "','" . $lng . "','" . $townland . "')"; 

$success = $conn->query($query); 

if (!$success) { 
    die("Couldn't enter data: ".$conn->error); 
} 

header("Location: ../View/thankYouSubmitSighting.php"); 

$conn->close(); 
exit(); 

while($row = mysqli_fetch_assoc($result)) { 
    echo $row['Townland']." > ".$row['distance']."<BR>"; 
} 
mysqli_close($conn); 

?> 
+0

Ihr Skript ist Risiko von [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Schauen Sie sich an, was mit [Little Bobby Tables] passiert ist (http://bobby-tables.com/) Auch [Wenn Sie Eingaben entgehen, ist es nicht sicher!] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql- echte Flucht g) Verwenden Sie [vorbereitete parametrisierte Anweisungen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

+0

Haben Sie nach dem Ausführen einer Abfrage einen Fehler erhalten? – Aleksandar

+0

Entschuldigung, ja, der Fehler lautet: 'Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl' auf 'Townland', aber liegt das daran, dass Townland nicht in die zweite Abfrage einbezogen wird? So wie ich die Abfragen eingerichtet habe, werden sie nicht einfach nacheinander laufen, oder? Ich weiß einfach nicht, wie ich sie zusammenfassen soll. Führen Sie die Entfernungsberechnung durch, und verwenden Sie dann das daraus entdeckte Townland, um die Datenbank mit der zweiten Abfrage zu füllen. –

Antwort

0

Wenn Sie das Ergebnis von Abfrage in einer Tabelle zB einfügen müssen: my_table könnten Sie eine Insert Auswahlabfrage (einen einzelnen SQL-Befehl von zwei Teil zusammengesetzt) ​​müssen seine

"INSERT into my_table (Townland, lat, lng, distance) 
SELECT Townland, lat, lng, 3956 * 2 * 
     ASIN(SQRT(POWER(SIN(($origLat - lat)*pi()/180/2),2) 
     +COS($origLat*pi()/180)*COS(lat*pi()/180) 
     *POWER(SIN(($origLon-lng)*pi()/180/2),2))) 
     as distance FROM townland WHERE 
     lng between ($origLon-$dist/cos(radians($origLat))*69) 
     and ($origLon+$dist/cos(radians($origLat))*69) 
     and lat between ($origLat-($dist/69)) 
     and ($origLat+($dist/69)) 
     having distance < $dist ORDER BY distance limit 1"; 
Verwandte Themen