Antworten auf deine Fragen:
Neues Thema erstellen

Variablen an Klasse übergeben

DJWebdesign

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:

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;
    }

}
?>
DIESE ABFRAGE MUSS UM DIE FILTER-VARIABLEN $TAG, $GENRE, $TYP UND $RANK ERWEITERET WERDEN !!!

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
 

jens260181

Schmarotzer

AW: Variablen an Klasse übergeben

wann willst du/musst du die weiteren variablen mitsenden?
zu beginn: $Suche = new Umkreissuche($db2, 'ng_locations');

oder später, beim aufruf einer methode?
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Ich denke, wenn ich die Methode "Suche" aufrufe. Diese greift wohl auf die anderen Methgoden innerhalb der Klasse zu.

Ich bekomme immer die Fehlermeldung, dass keine Resource übergeben wurde...
 

jens260181

Schmarotzer

AW: Variablen an Klasse übergeben

du rufts methoden so auf:
$Ergebnis = Suche($PLZ, $Entfernung, $genre, $table, .....

wenn dann so:
$Suche->Ergebnis();
sonst kommst du an die methoden nicht dran.

das war jetzt nur ein beispiel.
ich suche mal nen link, wo objekt-orientierets programmieren einfach erklärt wird. an einfachen beispielen. dann solltest du weiter kommen.
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Hallo, die Methode heißt aber "Suche", daher sollte

$Ergebnis = $Suche->Suche()

richtig sein.

Mit $Suche habe ich ja den Aufruf der Klasse deklariert.
 

jens260181

Schmarotzer

AW: Variablen an Klasse übergeben

Richtig. War nur ein Beispiel.

$Ergebnis = $Suche->Suche();

wäre richtig. Nur dein Methodenaufruf ganz oben sieht so aus:
$Ergebnis = Suche(........);
Das ist falsch.

Den letzten Ansatz weiter als Beispiel:
Mit
$Ergebnis = $Suche->Suche($parameter1,$parameter2, $parameter3,.... );
kannst du der Methode Suche Variablen übergeben.
In der Klasse musst du die Methode Suche so anpassen, das Sie deine Variablen akzeptiert

public function Suche($p1, $p2, $p3, .....){
// Dein Code
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Was bewirkt das "public" und was bewirkt das "private" ?

public bedeutet doch, dass die Variable auch ausserhalb der Klasse verfügbar ist, oder bedeutet das, dass auf die Variable ausserhalb der Klasse zugegriffen wird?
 

jens260181

Schmarotzer

AW: Variablen an Klasse übergeben

private: nur innerhalb einer klasse verwendbar. von aussen nicht erreichbar, fehler kommt zustande

public: von überall erreichbar
 

saila

Moderatorle

AW: Variablen an Klasse übergeben

Mal ganz nebenei, warum lässt du dir nicht ausgeben, was die Methode oder Klasse dir zur Verfügung stellt?

print_r(inizialisierte Klasse); oder print_r(klasse->methode());

über diesen Weg kannst du erkennen, was innerhalb dieser Klasse/Mehtode zur Verfügung steht.

Abgesehen davon, wenn du an die Methode Werte übergibst und du nichts zurück erhälst, ist entweder das in der Methode nicht vorgesehen, oder die Logig der Rückgabe erfolgt nicht in der Methode.
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Ohne den Filter "genre" funktioniert die Abfrage hervorragend, doch immer wenn ich die MySQL Abfrage mit dem folgenden Filter ergänze

PHP:
public function Suche($PLZ, $Radius, $genre, $Spalten = array(), $Reihenfolge = false, $Richtung = 'ASC') {
        if (!is_array($Spalten) || count($Spalten) == 0) {
            $Spalten = '*';
        } else {
            $Spalten = '`' . implode('`, `', $Spalten) . '`';
        }
        $this->genre = $genre;
        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
                l_genre = '.$this->genre.'
                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) . '"';
        if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
            $Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
            //$sql .= "\n" . 'GROUP BY `l_genre` ' . $Richtung;
            $sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
        }
        $re = mysql_query($sql, $this->db);
        $result = array();
bekomme ich diese Fehlermeldung.

Warning
: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in K:\xampp\htdocs\relax-time\navigate\http\includes\umkreissuche.class.php on line 123

Also scheint doch irgend etwa an der SQL-Abfrage nicht zu stimmen.
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Die Variable sende ich in dem Aufruf der Methode Suche():

PHP:
$Ergebnis = $Suche->Suche($PLZ, $Entfernung, $genre, $table, array('ID', 'Name', 'l_website', 'Street', 'Hsnr', 'PLZ', 'Ort', 'l_genre'), 'PLZ', 'ASC');
Die Variable ist auch verfügbar, kann sie mit $Suche->genre aufrufen.

Der Fehler liegt scheinbar in der SQL-Abfrage.

Wenn ich mir die Variable $sql als String anzeigen lasse, scheint alles korrekt. Der Wert der Variablen $genre wird richtig angezeigt.

Dennoch bemängelt er, dass mysql_query($sql, $this->db2) keine gültige MySQL-Resource ist.

Hier mal meine DB-Abfrage, da muss der Fehler liegen.

PHP:
$sql = 'SELECT ' . $Spalten . '
                FROM `' . $this->table . '`
                WHERE 
                (l_genre LIKE `%'.$this->genre.'%`)
                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) . '"';
        if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
            $Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
            //$sql .= "\n" . 'GROUP BY `l_genre` ' . $Richtung;
            $sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
        }
        $re = mysql_query($sql, $this->db2);
        $result = array();
        echo 'Variable $re= '.$re;
        while ($rd = mysql_fetch_object($re)) {
            $result[] = $rd;
        }
 

jens260181

Schmarotzer

AW: Variablen an Klasse übergeben

tausch mal die zeile
Code:
(l_genre LIKE `%'.$this->genre.'%`)
gegen diese hier aus
Code:
(l_genre LIKE \'%'.$this->genre.'%\')

evtl. mag er das zeichen
Code:
`
nicht
 

saila

Moderatorle

AW: Variablen an Klasse übergeben

Ohne den Filter "genre" funktioniert die Abfrage hervorragend, doch immer wenn ich die MySQL Abfrage mit dem folgenden Filter ergänze

PHP:
public function Suche($PLZ, $Radius, $genre, $Spalten = array(), $Reihenfolge = false, $Richtung = 'ASC') {
        if (!is_array($Spalten) || count($Spalten) == 0) {
            $Spalten = '*';
        } else {
            $Spalten = '`' . implode('`, `', $Spalten) . '`';
        }
        $this->genre = $genre;
        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
                l_genre = '.$this->genre.'
                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) . '"';
        if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
            $Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
            //$sql .= "\n" . 'GROUP BY `l_genre` ' . $Richtung;
            $sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
        }
        $re = mysql_query($sql, $this->db);
        $result = array();
bekomme ich diese Fehlermeldung.

Warning
: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in K:\xampp\htdocs\relax-time\navigate\http\includes\umkreissuche.class.php on line 123

Also scheint doch irgend etwa an der SQL-Abfrage nicht zu stimmen.


Abgesehen von dem was vor diesem Post schon genannt wurde, welche Zeile ist den 123?
 

M3g4Star

Nicht mehr ganz neu hier

AW: Variablen an Klasse übergeben

Hallo,
um einmal zu sehen was du dort genau abschickst und mehr Informationen zu deinem Query zu bekommen versuch bitte einmal folgendes:

PHP:
$re = mysql_query($sql, $this->db2) or die(mysql_error()."<br>".$sql);

Dann bekommst du ein Paar mehr Informationen da es ja um die Abfrage geht die kein gültiges Ergebnis bringt.
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Darauf gibt er mir aus:(kulinarisch war in der variablen $genre)

Unknown column '%kulinarisch%' in 'where clause'
SELECT * FROM `ng_locations` WHERE (l_genre LIKE `%kulinarisch%`) AND KoordX >= 4013.4250952476 AND KoordX <= 4063.4250952476 AND KoordY >= 591.76345357152 AND KoordY <= 641.76345357152 AND KoordZ >= 4863.8001178626 AND KoordZ <= 4913.8001178626 AND POWER(4038.4250952476 - KoordX, 2) + POWER(616.76345357152 - KoordY, 2) + POWER(4888.8001178626 - KoordZ, 2) <= "624.99919802034"
 

DJWebdesign

The Only-One

AW: Variablen an Klasse übergeben

Ich hab's !!!
Abfrage sieht jetzt folgendermassen aus:

PHP:
$sql = 'SELECT ' . $Spalten . '
                FROM `' . $this->table . '`
                WHERE 
                (l_genre LIKE \'%'.$this->genre.'%\')
                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) . '"';
        if ($Reihenfolge && strpos($Spalten, $Reihenfolge) !== false) {
            $Richtung = (strtoupper($Richtung) == 'DESC') ? 'DESC' : 'ASC';
            //$sql .= "\n" . 'GROUP BY `l_genre` ' . $Richtung;
            $sql .= "\n" . 'ORDER BY `' . $Reihenfolge . '` ' . $Richtung;
        }
        $re = mysql_query($sql, $this->db2) or die(mysql_error()."<br>");
        $result = array();
        echo 'Variable $re= '.$re;
        while ($rd = mysql_fetch_object($re)) {
            $result[] = $rd;
        }
Der Fehler lag dann doch hier:

(l_genre LIKE \'%'.$this->genre.'%\')

//statt vorher

(l_genre LIKE `%'.$this->genre.'%`)

Nochmal allen einrecht herzliches Dankeschön, hoffe bald wieder was zurückgeben zu können.

MfG

DJ
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben