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);
?>
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
Haben Sie nach dem Ausführen einer Abfrage einen Fehler erhalten? – Aleksandar
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. –