The Only-One
Hallo, brauche mal Eure Hilfe.
Programmiere eine Umkreissuche, dazu habe ich eine sehr schöne Klasse im Netz gefunden.
Da ich aber die Suchefunktion durch weitere Variablen noch weiter filtern muss, muss ich dieser Klasse weitere Variablen übergeben.
Ich kenne mich mit Klassen leider gar nicht aus.
Müssen diese Variablen in der Klasse nochmals deklariert werden, oder reicht es aus, wenn ich die Variablen an den Funktionsaufruf in der Klasse übergebe???
Wäre super, wenn Ihr mir helfen könnt.
Hier ist die Klasse:
DIESE ABFRAGE MUSS UM DIE FILTER-VARIABLEN $TAG, $GENRE, $TYP UND $RANK ERWEITERET WERDEN !!!
Der Klassenaufruf erfolgt bei mir so:
Danke schon mal für die Hilfe
Programmiere eine Umkreissuche, dazu habe ich eine sehr schöne Klasse im Netz gefunden.
Da ich aber die Suchefunktion durch weitere Variablen noch weiter filtern muss, muss ich dieser Klasse weitere Variablen übergeben.
Ich kenne mich mit Klassen leider gar nicht aus.
Müssen diese Variablen in der Klasse nochmals deklariert werden, oder reicht es aus, wenn ich die Variablen an den Funktionsaufruf in der Klasse übergebe???
Wäre super, wenn Ihr mir helfen könnt.
Hier ist die Klasse:
PHP:
<?php
/* * * * * * * * * * * * * * * * * * * * * * * * *
Klasse Umkreissuche
(c) 2008 Philipp Mamat
http://www.mamat-online.de/
http://www.mamat-online.de/umkreissuche/opengeodb.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);
// DIESE ABFRAGE MUSS UM DIE FILTER_VARIABLEN $TAG, $GENRE, $TYP UND $RANK ERWEITERET WERDEN !!!
$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;
}
}
?>
Der Klassenaufruf erfolgt bei mir so:
PHP:
require_once('includes/umkreissuche.inc.php');
$Suche = new Umkreissuche($db2, 'ng_locations'); //Tabelle angeben, worauf sich die Suche bezieht mit ergänzenden Parametern
$zeigeFehler = false;
//$Suche->genre = $_POST['genre'];// Das war mein Versuch die Variable Genre zu übergeben
$genre = $_GET['genre'];// Für die Übergabe der Variablen Genre an die Funktion selber
$table = "ng_locations";
$Ergebnis = Suche($PLZ, $Entfernung, $genre, $table, array('ID', 'Name', 'l_website', 'Street', 'Hsnr', 'PLZ', 'Ort', 'l_genre'), 'PLZ', 'ASC');
Danke schon mal für die Hilfe