PLZ Umkreis

CreativPur

Erfahrenes Mitglied
Hi,

ich habe ein script, welches aber leider nicht so richtig funktioniert.
Vielleicht kann mir jemand erklären, was ich da falsch mache ?

die Datenbank:
Code:
$db = new PDO('mysql:host=dbxxxxxx; dbname=dbxxxx;', 'dboxxxxx', 'xxxxx',
array('charset'=>'utf8'));

Code:
<?php

// Verbindung zur Datenbank aufbauen.
include "Datenbankverbindung/db_plz_umkreis.php";
?>

ein Script, welches schon läuft und mit der gleichen Datenbankverbindung arbeitet:
Code:
<?php

$abfrage = $db->query("SELECT COUNT(*) FROM `plz_de` ");
$ergebnis = $abfrage->fetch();
?>

Es wurden <?php echo $ergebnis[0] ?> Eintragungen gefunden.

Und nun zu dem eigentlichen Sorgenkind...
Code:
<?php

// die PLZ nach der wir suchen
$plz = '9220';

// der Umkreis in Km
$umkreis = 5;

// Erdradius (geozentrischer Mittelwert) in Km
$radius = 6368;

/* -------------------------- */



$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = mysql_fetch_object($sql_rad);

// Umrechnung von GRAD IN RAD

$lon = $erg_rad->lon / 180 * M_PI;
$lat = $erg_rad->lat / 180 * M_PI;

// jetzt erfolgt die eigentliche Abfrage

$query = "SELECT ort, plz, (
".$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 plz_de WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance
";

// die Ausgabe (vereinfacht)

$sql = $db->query($query);
while( $erg = mysql_fetch_object($sql) ) {

echo '
<pre>', print_r($erg), '</pre>
';
}
?>

Leider wird bei diesem Script nichts ausgegeben..
Wenn ich es über eine normale Datenbank-Abfrage mache, funktioniert es, leider nicht über PDO.
Ich denke mal, dass ich in dem Script etwas erweitern muss, nur weiß ich nicht genau, was es ist..

Vielen Dank für Eure Hilfe
 
Zuletzt bearbeitet:
Das hier (Zeile 21/22) kann schon gar nicht so funktionieren!
PHP:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = mysql_fetch_object($sql_rad);

Entweder bleibst du komplett bei PDO oder komplett bei mysql (würde komplett PDO empfehlen ;) )
Das müsste dann so in der Art aussehen:
PHP:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = $sql_rad->fetchObject($sql_rad);

Das gleiche ist dann noch einmal au der Zeile 41.

Außerdem würde ich an deiner Stelle vielleicht noch Prepared-Statements nutzen.
 
Das hier (Zeile 21/22) kann schon gar nicht so funktionieren!
PHP:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = mysql_fetch_object($sql_rad);

Entweder bleibst du komplett bei PDO oder komplett bei mysql (würde komplett PDO empfehlen ;) )
Das müsste dann so in der Art aussehen:
PHP:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = $sql_rad->fetchObject($sql_rad);

Das gleiche ist dann noch einmal au der Zeile 41.

Außerdem würde ich an deiner Stelle vielleicht noch Prepared-Statements nutzen.
Hallo Merzi86,

vielen Dank für deine schnelle Antwort.
Ich habe die Änderungen folgend vorgenommen..

Code:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = $sql_rad->fetchObject($sql_rad);

// Umrechnung von GRAD IN RAD

$lon = $erg_rad->lon / 180 * M_PI;
$lat = $erg_rad->lat / 180 * M_PI;

// jetzt erfolgt die eigentliche Abfrage

$query = "SELECT ort, plz, (
".$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 plz_de WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance
";

// die Ausgabe (vereinfacht)
$sql = $db->query($query);
while( $erg = $sql_fetch_object($sql) ) {
echo '
<pre>', print_r($erg), '</pre>
';
}
?>

Leider gibt das Script immer noch nichts aus.
Ich hatte mir schon gedacht, das es an PDO liegt, aber als reiner Webdesigner
kenne ich mich so gut wie nicht mit php aus.
Dennoch bin ich sehr lernwillig..

Für was und an welcher Stelle soll ich Prepared-Statements nützen ?

Lieben Gruß
Creativpur
 
Wahrscheinlich gibt es nichts aus, weil du ein error_reporting unterdrückt hast.

In Zeile 26 steht folgendes:
PHP:
while( $erg = $sql_fetch_object($sql) ) {

Das müsste aber so aussehen:
PHP:
while( $erg = $sql->fetch_object($sql) ) {

Prepared-Statements sind immer empfohlen sobald wie User-Eingaben für ein Sql-Statement genutzt werden.
In dein Skript hattest du zwar $plz, $umkreis und $radius selber fest gesetzt, ich nehme aber an dies soll später mal durch User-Eingaben selbst gesetzt werden können.

In dem Fall könnte ein Hacker anstelle von gültigen Werten auch SQL-Befehle abschicken (Stichwort SQL-Injection).

Edit: Um solche Fehler während der Programmierung leichter zu entdecken würde ich dir empfehlen vielleicht mal ein error_reporting auf E_ALL zu stellen.
 
Wahrscheinlich gibt es nichts aus, weil du ein error_reporting unterdrückt hast.

In Zeile 26 steht folgendes:
PHP:
while( $erg = $sql_fetch_object($sql) ) {

Das müsste aber so aussehen:
PHP:
while( $erg = $sql->fetch_object($sql) ) {

Prepared-Statements sind immer empfohlen sobald wie User-Eingaben für ein Sql-Statement genutzt werden.
In dein Skript hattest du zwar $plz, $umkreis und $radius selber fest gesetzt, ich nehme aber an dies soll später mal durch User-Eingaben selbst gesetzt werden können.

In dem Fall könnte ein Hacker anstelle von gültigen Werten auch SQL-Befehle abschicken (Stichwort SQL-Injection).

Edit: Um solche Fehler während der Programmierung leichter zu entdecken würde ich dir empfehlen vielleicht mal ein error_reporting auf E_ALL zu stellen.


Ahja.. Dann muss ich mich auch mit den Absichern der Eingaben noch einmal auseinander setzen..

Das Script funktioniert allerdings immer noch nicht..

Code:
$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = $sql_rad->fetchObject($sql_rad);

// Umrechnung von GRAD IN RAD

$lon = $erg_rad->lon / 180 * M_PI;
$lat = $erg_rad->lat / 180 * M_PI;

// jetzt erfolgt die eigentliche Abfrage

$query = "SELECT ort, plz, (
".$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 plz_de WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance
";

// die Ausgabe (vereinfacht)
$sql = $db->query($query);
while($erg = $sql->fetch_object($sql)) {
echo '
<pre>', print_r($erg), '</pre>
';
}
 
Mir fällt gerade noch die Zeile mit dem echo unten auf ^^

PHP:
while($erg = $sql->fetch_object($sql)) {
echo '<pre>', print_r($erg), '</pre>
';
}
Die Kommata haben haben dort nichts zu suchen.

Entweder schreibst du es so
PHP:
while($erg = $sql->fetch_object($sql)) {
echo '<pre>'. $erg["ort"]. ', '.$erg["ort"].'</pre>
';
}

oder (vorallen da du ein Object aus dem Query bekommst eher so zu empfehlen) so:
PHP:
while($erg = $sql->fetch_object($sql)) {
echo '<pre>';
print_r($erg);
echo '</pre>';
}

Dies hätte der Browser auch als Fehler ausgegeben, wenn das Error_reporting aktiv wäre.
Schreibt bitte mal am Anfang der Datei
PHP:
error_reporting(E_ALL);

Damit lassen sich schon etliche Fehler feststellen.
 
Das Script sieht jetzt folgend aus...

Code:
<?php
error_reporting(E_ALL);

// die PLZ nach der wir suchen
$plz = '34117';

// der Umkreis in Km
$umkreis = 5;

// Erdradius (geozentrischer Mittelwert) in Km
$radius = 6368;

/* -------------------------- */



$sql_rad = $db->query("SELECT lon, lat FROM `plz_de` WHERE `plz` = '$plz' ");
$erg_rad = $sql_rad->fetchObject($sql_rad);

// Umrechnung von GRAD IN RAD

$lon = $erg_rad->lon / 180 * M_PI;
$lat = $erg_rad->lat / 180 * M_PI;

// jetzt erfolgt die eigentliche Abfrage

$query = "SELECT ort, plz, (
".$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 plz_de WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance
";

// die Ausgabe (vereinfacht)
$sql = $db->query($query);
while($erg = $sql->fetch_object($sql)) {
echo '<pre>';
print_r($erg);
echo '</pre>';
}
?>

Hierzu kommt folgende Fehlermeldung:
bei Zeile
while($erg = $sql->fetch_object($sql)) {

Code:
Es wurden 16824 Eintragungen gefunden.
Fatal error: Call to undefined function sql_fetch_object() in /homepages/46/d518398578/htdocs/.baustelle/Bewerbungsemail/app/design/frontend/default/default/template/plz_umkreis2/plz_umkreis.php on line 58
 
ich habe jetzt in der Zeile

while($erg = $sql->fetch_object($sql)) {

den Unterstrich weg gelassen..

while($erg = $sql->fetchObject($sql)) {

Jetzt erscheint keine Fehlermeldung mehr,
aber eine Ausgabe erfolgt immer noch nicht..
 
Lass dir mal den Query ausgeben (mit echo $query) und führe diesen mal manuell aus (z.B. in Phpmyadmin).

In dem fetchObject kannst du auch den Parameter weglassen das macht hier sowieso keinen Sinn.
 
Schade.. Ich komme zu keinem Ergebnis. Wenn ich echo ' $plz ' eingebe, wird nicht die Datenbank abgerufen, sondern echo nimmt sich die PLZ aus dem Script
 

Neue Beiträge

Zurück