Zur Navigation

mysql db durchsuchen

1 schurik

Hallo Jörg

ich benötige bitte hier noch mal deine Hilfe.
Hab im google schöne db suche gefunden, schaffe es aber nicht es für mich anzupassen.

Die u.a. Suche berücksichtigt alles was in meiner DB gespeichert ist.
Das brauche ich nicht.
Gerne würde ich nur Tabelen und Felde durchsuchen, die in Frage kommen.

Könntest du mir bitte den Code so ändern?

Also in der DB soll die Tabelle: "apx_objects" durchsucht werden und zwar in dieser Tabelle die Felder: "ort", "teilort", "ortplz", "strasse".

Die Ausgabe soll der Wert aus dem Feld: "region_id" sein.

Es geht natürlich einfacher mit einer MSQL Suche ( hatte ich schon ) aber in diesem Code werden alle Wörter berücksichtigt die per $_GET aus dem Formular übergeben wurden.

Bitte sag Bescheid, wenn du noch Infos benötigst.

Vielen Dank

schurik


<?php
//-- pre-condition ---------------------------------------------------------------------------------





//-- example input ---------------------------------------------------------------------------------

$sSearch = $_GET['search'];

//--------------------------------------------------------------------------------------------------

function mysqlSearch($sSearch)
{
    // replace multiple whitespaces with a simple blank
    $aSearch = explode(' ', preg_replace('#\s+#', ' ', $sSearch));
    // count search words once
    $iSearch = count($aSearch);
    if ($iSearch == 0) {
        return array();
    }
    // remove addslashes (automatically executed by php) and use mysql_real_escape_string instead. it's more secure against sql injection
    if (get_magic_quotes_gpc()) {
        $aSearch = array_map('stripslashes', $aSearch);
    }
    $aSearch = array_map('mysql_real_escape_string', $aSearch);
    
    // get all tables in selected database
    $sSQL1 = 'SHOW TABLES';
    $rRes1 = mysql_query($sSQL1);
    
    // save hits
    $aHits = array();
    while ($aTable = mysql_fetch_array($rRes1)) {
        $sTable = $aTable[0];
        
        // get all columns from each table
        $sSQL2 = "SHOW COLUMNS FROM `$sTable`";
        $rRes2 = mysql_query($sSQL2);
        
        // combine search words with columns
        $aPermutation = array();
        while ($aColumn = mysql_fetch_assoc($rRes2)) {
            $sColumn = $aColumn['Field'];
            for ($i = 0; $i < $iSearch; $i++) {
                $sSearchword = $aSearch[$i];
                $aPermutation[] = "`$sColumn` LIKE '%$sSearchword%'";
            }
        }
        
        // combine as OR-condition
        $sSQL4 = "SELECT * FROM `$sTable` WHERE " . implode(' OR ', $aPermutation);
        $rRes4 = mysql_query($sSQL4);
        
        // collect result
        while ($aHit = mysql_fetch_assoc($rRes4)) {
            $aHits[$sTable][] = $aHit;
        }
    }
    
    return $aHits;
}

//-- example output --------------------------------------------------------------------------------

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

//--------------------------------------------------------------------------------------------------
?>

03.12.2007 15:49

2 Jörg Kruse

Hallo schurik,

Es geht natürlich einfacher mit einer MSQL Suche ( hatte ich schon )

Du meinst MySQL? Wie sieht denn die Suche aus? das kann man dann vielleicht als Grundlage nehmen und sich den Rest, den man noch benötigt, aus dem obigen Script einbauen

03.12.2007 16:28

3 schurik

$qHotelsRegion_ID = mysql_query("SELECT 
ac.object_id, ac.name, ac.region_city_id, ac.region_id, ac.ort, ac.strasse, ac.hausnummer, ac.hotel_de_hotel_nr, ac.teilort, ac.ortplz FROM apx_objects AS ac WHERE ac.ort like '%".strtolower($CenterOrt)."%' OR ac.teilort like '%".strtolower($CenterOrt)."%' AND ac.region_id != 0 GROUP BY ac.region_id");


So siehts aus aber, wenn hier mehr als ein Wort per $_GET übergehben wird ( z.B. noch die Strasse oder PLZ ) wird nix gefunden.

schurik

03.12.2007 16:37 | geändert: 03.12.2007 16:39

4 schurik

Damit will ich die region_id raus finden, dann alle Hotels in dieser Region für Google Map zur Verfügung stellen und zur Umkreissuche verwenden.

Also ich will nicht alle Hotels in der DB verwenden sonst dauert das zu Lange alle Koordinaten vom google zu holen und die Entfernung zur Gesuchten Adresse zu berechnen.

Also muss ich die Hotel - Anzahl begrenzen.

Bitte schau mal z.B.: Hotel in Darmstadt
ist nicht ganz fertig.

http://www.2muchrooms.com/karte6.php?search=Darmstadt&map=hotelliste&p1=1916

Das ist der link, wenn man ein Hotel in der Karte sehen will ( p1=1916 ).

Dann kann man unter der Karte ( bitte im Zweiten Feld ) die Adresse eingeben und den Radius für die Suche. Um diese Adresse sollen alle Hotels in meine DB ausgegeben werden.

Ich könnte auch mal den ganzen Code meiner Google Map hier Posten.

03.12.2007 16:50

5 Jörg Kruse

Du könntest die Query Stück für Stück zusammenbauen, und dabei berücksichtigen, ob eine Variable übergeben wurde, also so ungefähr:

$query = "SELECT 
ac.object_id, ac.name, ac.region_city_id, ac.region_id, ac.ort, ac.strasse, ac.hausnummer, ac.hotel_de_hotel_nr, ac.teilort, ac.ortplz FROM apx_objects AS ac WHERE ac.ort like '%".strtolower($CenterOrt)."%' OR ac.teilort like '%".strtolower($CenterOrt)."%' AND ac.region_id != 0";
if (isset($_GET['strasse'])) {
    $strasse = strtolower(mysql_real_escape_string($_GET['strasse']));
    $query .= " AND strasse like '%" . $strasse . "%'";
}
$query .=" GROUP BY ac.region_id"

$qHotelsRegion_ID = mysql_query($query);

03.12.2007 16:51

6 schurik

Hallo Jörg

Danke schön für die schnelle Antwort.

Meinst du es ist besser mehrere Felder im Formular zu benutzen?
Je ein Feld für Ort oder Strasse oder PLZ.

Ich habe ja nur ein Feld im Formular, da kann mann z.B. nur die PLZ eingeben oder nur ein Stadtteil oder nur Ort oder alles zusammen.

03.12.2007 16:59

8 Jörg Kruse

Meinst du es ist besser mehrere Felder im Formular zu benutzen?
Je ein Feld für Ort oder Strasse oder PLZ.

Ich habe ja nur ein Feld im Formular, da kann mann z.B. nur die PLZ eingeben oder nur ein Stadtteil oder nur Ort oder alles zusammen.

Ja, ich denke verschiedene Felder wären besser. Wenn jemand z.B. "37081 Göttingen" eingibt, wird mit diesem String weder in der Spalte Postleitzahlen noch in der Spalte Ort etwas gefunden, dort steht ja jeweils nur "37081" bzw. "Göttingen"

03.12.2007 17:08 | geändert: 03.12.2007 17:09

9 schurik

Mann könnte doch mit explode() die Wörter trennen? Nach jedem Komma oder Lehrzeichen. Google maps machts auch so irgend wie

03.12.2007 17:20 | geändert: 03.12.2007 17:21

10 Jörg Kruse

Ja, das könntest du machen, würde aber vermute ich dazu führen, dass ein Suchstring "Groner Landstraße" auch "Weender Landstraße" und "Groner Straße" findet

03.12.2007 17:24