Daten werden komisch ausgegeben

veil123

Grünschnabel
Ich habe hier eine Umkreissuche, welche auch an sich gut funktioniert.
Das Problem ist nur das, die Ergebnisse in dieser blöden Art und Weise ausgegeben werden:
HTML:
stdClass Object
(
    [ort] => Hamburg
    [Distance] => 0
)

stdClass Object
(
    [ort] => Hamburg
    [Distance] => 1.35221811138344
)

PHP:
<?php

// verbindung zur DB
include('../Connections/Test.php');
mysql_select_db($database_Test, $Test);
/* -------------------------- */
$suche = $_GET['suche'];
$plz = $_GET['post'];
$umkreis = $_GET['umkreis'];

if ($_GET['post'] == "" and $_GET['umkreis'] == "")
{ $plz = '01067' and $umkreis = 9000;} 
if ($_GET['post'] == "" and $_GET['umkreis'] != "")
{echo "Wählen Sie einen Ort";}
if ($_GET['umkreis'] == "" and $_GET['post'] != "")
{echo "Wählen Sie einen Umkreis";}
else {

/* -------------------------- */
if (isset($_GET['submit'])) {
$sql_rad = mysql_query("SELECT geo_l, geo_b, ort FROM `cix_plz` WHERE `plz` = '$plz' OR `ort` = '$plz'");
$erg_rad = mysql_fetch_object($sql_rad);

// Umrechnung von GRAD IN RAD

$rad_l = $erg_rad->geo_l / 180 * M_PI;
$rad_b = $erg_rad->geo_b / 180 * M_PI;

// jetzt erfolgt die eigentliche Abfrage

$query = "SELECT  ort,(
    6367.41 * SQRT(2*(1-cos(RADIANS(geo_b)) * 
    cos(".$rad_b.") * (sin(RADIANS(geo_l)) *
    sin(".$rad_l.") + cos(RADIANS(geo_l)) * 
    cos(".$rad_l.")) - sin(RADIANS(geo_b)) * sin(".$rad_b.")))) AS Distance 
    FROM cix_plz WHERE 
    6367.41 * SQRT(2*(1-cos(RADIANS(geo_b)) * 
    cos(".$rad_b.") * (sin(RADIANS(geo_l)) * 
    sin(".$rad_l.") + cos(RADIANS(geo_l)) * 
    cos(".$rad_l.")) - sin(RADIANS(geo_b)) * sin(".$rad_b."))) <= ".$umkreis."
    
    AND `suchfeldtabelle` LIKE ('$suche')";

// die Ausgabe (vereinfacht)
$sql = mysql_query($query);
while( $erg = mysql_fetch_object($sql) ) {

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

$num_rows = mysql_num_rows($sql);

}}}
echo $num_rows;

?>

Was müsste ich ich dort ändern, damit z.B. nur die Suchergebnisse also z.B. die Postleitzahlen ausgegeben werden ?
 
Moin,

Was müsste ich ich dort ändern, damit z.B. nur die Suchergebnisse also z.B. die Postleitzahlen ausgegeben werden ?

Du müsstest als 1. die Postleitzahlen holen, denn momentan tust du dies mit deinem Query nicht, wie man am Ergebnis sieht.

Ausgeben könntest du sie dann so:

jetzt:
Code:
echo '<pre>', print_r($erg, true), '</pre>';
neu:
Code:
echo $erg->plz;
(wobei plz für den Namen der Spalte mit der PLZ steht)
 
Oh Danke, das funktioniert.
Ich habe auch verusht diese Abfrage zu erweitern, ich möchte noch ein weiteres feld abfragen.

Ich bin da noch auf diese Suche gestossen. Von http://www.mamat-online.de
PHP:
<?php
class Umkreissuche {
	// Erdradius in Kilometern
	private $Erdradius = 6371;
	// mysql link identifier
	private $db;
	// Datentabelle
	private $table = false;
	// Fehler zeigen?
	public $zeigeFehler = true;

	public function __construct($db, $table = 'vereine') {
		if (!is_resource($db) || get_resource_type($db) != 'mysql link') {
			trigger_error('Keine MySQL-Ressource übergeben', E_USER_ERROR);
		}
		$this->db = $db;
		$this->table = $table;

		// leere Koordinaten in Tabelle füllen
		$sql = 'SELECT `ID`, `PLZ`
				FROM `' . $this->table . '`
				WHERE
					`KoordX` = "0"
				AND `KoordY` = "0"
				AND `KoordZ` = "0"
				';
		$re = mysql_query($sql, $this->db);
		while ($rd = mysql_fetch_object($re)) {
			if (!$this->Plz2Koord($rd->PLZ, $lon, $lat)) {
				if ($this->zeigeFehler) {
					trigger_error('Postleitzahl ' . $rd->PLZ . ' konnte nicht zugeordnet werden', E_USER_NOTICE);
				}
				continue;
			}
			$this->Kugel2Kartesisch($lon, $lat, $x, $y, $z);
			$sql = 'UPDATE `' . $this->table . '`
					SET
						`Longitude` = "' . $lon . '",
						`Latitude` = "' . $lat . '",
						`KoordX` = "' . $x . '",
						`KoordY` = "' . $y . '",
						`KoordZ` = "' . $z . '"
					WHERE
						`ID` = "' . (int)$rd->ID . '"
					LIMIT 1
					';
			mysql_query($sql, $this->db);
		}
	}
		
	public function Kugel2Kartesisch($lon, $lat, &$x, &$y, &$z) {
		$lambda = $lon * pi() / 180;
		$phi = $lat * pi() / 180; 
		$x = $this->Erdradius * cos($phi) * cos($lambda);
		$y = $this->Erdradius * cos($phi) * sin($lambda);
		$z = $this->Erdradius * sin($phi); 
		return true;
	}
	
	public function Plz2Koord($PLZ, &$lon, &$lat) {
		$sql = 'SELECT
					coo.lon,
					coo.lat
				FROM geodb_coordinates AS coo
				INNER JOIN geodb_textdata AS textdata
				ON textdata.loc_id = coo.loc_id
				WHERE
					textdata.text_val = "' . mysql_real_escape_string($PLZ, $this->db) . '"
				AND textdata.text_type = "500300000"
				LIMIT 1';
		$re = mysql_query($sql, $this->db);
		if (mysql_num_rows($re) != 1) {
			return false;
		}
		list($lon, $lat) = mysql_fetch_row($re);
		return true;
	}
	
	public function Suche($PLZ, $Radius, $Spalten = array(), $Reihenfolge = false, $Richtung = 'ASC') {
		if (!is_array($Spalten) || count($Spalten) == 0) {
			$Spalten = '*';
		} else {
			$Spalten = '`' . implode('`, `', $Spalten) . '`';
		}

		if (!$this->Plz2Koord($PLZ, $lon, $lat)) {
			if ($this->zeigeFehler) {
				trigger_error('Postleitzahl ' . $PLZ . ' konnte nicht zugeordnet werden', E_USER_NOTICE);
			}
			return false;
		}
		$this->Kugel2Kartesisch($lon, $lat, $UrsprungX, $UrsprungY, $UrsprungZ);
		
		$sql = 'SELECT ' . $Spalten . '
				FROM `' . $this->table . '`
				WHERE
					KoordX >= ' . ($UrsprungX - $Radius) . '
				AND KoordX <= ' . ($UrsprungX + $Radius) . '
				AND KoordY >= ' . ($UrsprungY - $Radius) . '
				AND KoordY <= ' . ($UrsprungY + $Radius) . '
				AND KoordZ >= ' . ($UrsprungZ - $Radius) . '
				AND KoordZ <= ' . ($UrsprungZ + $Radius) . '
				AND POWER(' . $UrsprungX .' - KoordX, 2)
				  + POWER(' . $UrsprungY .' - KoordY, 2)
				  + POWER(' . $UrsprungZ .' - KoordZ, 2)
					<= "' . pow(2 * $this->Erdradius * sin($Radius / (2 * $this->Erdradius)), 2) . '"';
		if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
			$Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
			$sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
		}
		$re = mysql_query($sql, $this->db);
		$result = array();
		while ($rd = mysql_fetch_object($re)) {
			$result[] = $rd;
		}
		return $result;
	}

}
?>

Ich schaffe es nicht die sql - Abfrage um ein weiteres Feld z.B. Suchfeld zu erweitern. Es soll halt noch ein zusätzliches Tabellenfeld abgefragt werden.
Wie baut man das in die obige Abfrage ein ?
 
Füge mal hiernach:

Code:
$sql = 'SELECT ' . $Spalten . '
                FROM `' . $this->table . '`
                WHERE
                    KoordX >= ' . ($UrsprungX - $Radius) . '
                AND KoordX <= ' . ($UrsprungX + $Radius) . '
                AND KoordY >= ' . ($UrsprungY - $Radius) . '
                AND KoordY <= ' . ($UrsprungY + $Radius) . '
                AND KoordZ >= ' . ($UrsprungZ - $Radius) . '
                AND KoordZ <= ' . ($UrsprungZ + $Radius) . '
                AND POWER(' . $UrsprungX .' - KoordX, 2)
                  + POWER(' . $UrsprungY .' - KoordY, 2)
                  + POWER(' . $UrsprungZ .' - KoordZ, 2)
                    <= "' . pow(2 * $this->Erdradius * sin($Radius / (2 * $this->Erdradius)), 2) . '"';
        if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
            $Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
            $sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
        }

folgendes ein:
Code:
echo $sql;

...und poste, was das ausgibt.
 
Das gibt er aus:
PHP:
SELECT `Name`, `Einwohner`, `Website`, `Strasse`, `PLZ`, `Ort` FROM `staedte` WHERE 
KoordX >= 3890.6547079151 
AND KoordX <= 3990.6547079151 
AND KoordY >= 435.01540381767 
AND KoordY <= 535.01540381767 
AND KoordZ >= 4932.5336457516
AND KoordZ <= 5032.5336457516 
AND 
POWER(3940.6547079151 - KoordX, 2) + 
POWER(485.01540381767 - KoordY, 2) + 
POWER(4982.5336457516 - KoordZ, 2) <= "2499.9871683451" 
ORDER BY `Einwohner` DESC
 
Da kann ich keinen Fehler entdecken.

Wie greifst du denn auf den Rückgabewert von Umkreissuche->Suche() zu ...wie erfolgt die Ausgabe?
 
Wenn ich es so mache, also z.b. nach dem string "hallo" frage geht es. Jetzt muss ich aber eine Variable dort einbauen. Aber das geht nicht.
Es erscheinen immer Meldungen wie : Unexpected String, oder T...irgendetwas.

PHP:
$sql = 'SELECT ' . $Spalten . '
				FROM `' . $this->table . '`

				WHERE frei = "hallo" AND

					KoordX >= ' . ($UrsprungX - $Radius) . ' 
				AND KoordX <= ' . ($UrsprungX + $Radius) . '  
				AND KoordY >= ' . ($UrsprungY - $Radius) . '
				AND KoordY <= ' . ($UrsprungY + $Radius) . '
				AND KoordZ >= ' . ($UrsprungZ - $Radius) . '
				AND KoordZ <= ' . ($UrsprungZ + $Radius) . '
				AND POWER(' . $UrsprungX .' - KoordX, 2)
				  + POWER(' . $UrsprungY .' - KoordY, 2)
				  + POWER(' . $UrsprungZ .' - KoordZ, 2)
					<= "' . pow(2 * $this->Erdradius * sin($Radius / (2 * $this->Erdradius)), 2) . '"';
 
Mmmh,

es wäre schon gut wenn du zeigen würdest, was du machst, wenn es nicht funktioniert :-(

Was beinhaltet diese Variable und wie baust du sie in das Query ein?
 
Ja, ich versuche die ganze Zeit eine Variable dort einzubauen.
PHP:
$sql = 'SELECT ' . $Spalten . '
                FROM `' . $this->table . '`

                WHERE frei = '$suchfeld'  AND

                    KoordX >= ' . ($UrsprungX - $Radius) . ' 
                AND KoordX <= ' . ($UrsprungX + $Radius) . '  
                AND KoordY >= ' . ($UrsprungY - $Radius) . '
                AND KoordY <= ' . ($UrsprungY + $Radius) . '
                AND KoordZ >= ' . ($UrsprungZ - $Radius) . '
                AND KoordZ <= ' . ($UrsprungZ + $Radius) . '
                AND POWER(' . $UrsprungX .' - KoordX, 2)
                  + POWER(' . $UrsprungY .' - KoordY, 2)
                  + POWER(' . $UrsprungZ .' - KoordZ, 2)
                    <= "' . pow(2 * $this->Erdradius * sin($Radius / (2 * $this->Erdradius)), 2) . '"';
 
Diese Zeile:
Code:
WHERE frei = '$suchfeld'  AND

sollte besser so aussehen:

Code:
WHERE frei ="'.$suchfeld.'"  AND
...vorrausgesetzt die Variable ist ordentlich für ein Query vorbereitet.
 

Neue Beiträge

Zurück