Ale Tabellen durchsuchen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ale Tabellen durchsuchen

    Hi.

    Mit folgendem Code durchsuche ich alle meine MySQL DB Tabellen (Eingabe eines Suchbegriffes in ein Textfeld):

    PHP-Code:
    function mysqlSearch($sSearch)
    {
        
    // Eingabestring splitten
        
    $aSearch explode(' 'preg_replace('#\s+#'' '$sSearch));
        
    //Anzahl der Suchbegriffe bestimmen
        
    $iSearch count($aSearch);
        if (
    $iSearch == 0) {
            return array();
        }
        
    //Sql-Injektion vorbeugen
        
    if (get_magic_quotes_gpc()) {
            
    $aSearch array_map('stripslashes'$aSearch);
        }
        
    $aSearch array_map('mysql_real_escape_string'$aSearch);
        
        
    //Alle Tabellen aus der ausgewählten Datenbank
        
    $sSQL1 'SHOW TABLES';
        
    $rRes1 mysql_query($sSQL1);
        
        
    //Übereinstimmungen sammeln
        
    $aHits = array();
        while (
    $aTable mysql_fetch_array($rRes1)) {
            
    $sTable $aTable[0];
            
            
    //Alle Spalten von allen Tabellen ermitteln
            
    $sSQL2 "SHOW COLUMNS FROM `$sTable`"
            
    $rRes2 mysql_query($sSQL2);
            
            
    // Kombiniere Suchbegriff mit den Spalten
            
    $aPermutation = array();
            while (
    $aColumn mysql_fetch_assoc($rRes2)) {
                
    $sColumn $aColumn['Field'];
                for (
    $i 0$i $iSearch$i++) {
                    
    $sSearchword $aSearch[$i];
                    
    $aPermutation[] = "`$sColumn` LIKE '%$sSearchword%'";
                }
            }
            
            
    //Kombinieren als OR-Kondition mit implode
            
    $sSQL4 "SELECT * FROM `$sTable` WHERE " implode(' OR '$aPermutation);
            
    $rRes4 mysql_query($sSQL4);   //Query ausführen
            
            //Ergebnisse sammeln
            
    while ($aHit mysql_fetch_assoc($rRes4)) {
                
    $aHits[$sTable][] = $aHit;
            }
        }
        
        return 
    $aHits;
    }

    //..
    $array mysqlSearch($sSearch);
    //usw. 
    Das Problem ist jetzt, dass er mir die Ergebnisse nicht der Anzahl entsprechend, sondern gefundene Einträge doppelt oder dreifach ausgibt. Finde den Fehler einfach nicht. Vielleicht hat jemand nen Tipp für mich, danke.

    mfg streuner
    Zuletzt geändert von streuner; 19.08.2009, 14:56.
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

  • #2
    Zitat von streuner Beitrag anzeigen
    Mit folgendem Code durchsuche ich alle meine MySQL DB Tabellen:
    Da sollte vielleicht erst mal geklärt werden, woraus sich denn eigentlich die Notwendigkeit ergibt, "alle" Tabellen auf einmal zu durchsuchen.

    Was hast du für Tabellen, wie sind die strukturiert, was steht da drin?


    Und alle Spalten mit dem LIKE-Operator zu durchsuchen, noch dazu vor und hinter dem Suchbegriff mit der %-Wildcard - das ist absolut unperformant, verhindert die Nutzung jegliches möglicherweise existierenden Index'.

    Mit der Volltextsuche bist du da vielleicht besser bedient.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Na im Resultset sind die Einträge ja noch nicht doppelt (Notfalls per DISTINCT), da machst du wohl bei der Ausgabe was falsch.

      Kommentar


      • #4
        Hallo,

        nur mal ne Vermutung. Wenn du Views definiert hast, werden die ebenfalls von SHOW TABLES zurückgeliefert und würden logischerweise die selben Daten enthalten, was die doppelte und dreifache Multiplizität erklären würde.

        Tipp: mit SHOW FULL TABLES hat das Ergebnis noch eine zweite Spalte, in der der Tabellentyp steht ("BASE TABLE", "VIEW", "SYSTEM VIEW").

        Gruß,

        Anja

        Edit:
        Code:
        [COLOR=#000000][COLOR=#0000CC]$aHits[/COLOR][COLOR=#006600][[/COLOR][COLOR=#0000CC]$sTable[/COLOR][COLOR=#006600]][] = [/COLOR][COLOR=#0000CC]$aHit[/COLOR][COLOR=#006600];[/COLOR][/COLOR]
        Ach nee, die hätten dann ja nen anderen Namen.
        Zuletzt geändert von AmicaNoctis; 19.08.2009, 15:05.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          @wahsaga: Die Notwendigkeit ergibt sich aus dem Pflichten- und Lastenheft ! Tabellen sind nicht redundant in der 3. Normalform über eine ID miteinander gekoppelt (ca. 10-12 Tabellen). Eine Tabelle enthält allg. Zugangsdaten (email, aktivierungscode...usw.), weitere Tabellen enthalten allg. Daten zur den registrierten Usern, Bildverlinkungen...usw. und eine Tabelle beinhaltet CSS & Layout Attribute.

          "Und alle Spalten mit dem LIKE-Operator zu durchsuchen, noch dazu vor und hinter dem Suchbegriff mit der %-Wildcard - das ist absolut unperformant, verhindert die Nutzung jegliches möglicherweise existierenden Index'." Hm...da magst Du wohl recht haben. Eine andere Möglichkeit ist mir ehrlich gesagt nicht eingefallen. Was meinst Du mit der Volltextsuche genau?

          @onemorenerd: DISTINCT ist ne gute Idee. Stimmt, an die Ausgabe habe ich jetzt gar nicht gedacht*ärger*! Schaue ich mir gleich nochmal an!

          @AmicaNoctis: interessant, das habe ich gar nicht bedacht!

          mfg streuner
          Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
          der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

          "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

          Kommentar


          • #6
            Zitat von streuner Beitrag anzeigen
            Was meinst Du mit der Volltextsuche genau?
            http://www.google.de/search?hl=de&q=mysql+volltextsuche

            Und benutze bitte die [quote]-Tags, wenn du zitierst.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Mist

              ...hab den Fehler gefunden (war natürlich nicht in der Funktion). War bei der Ausgabe des zurückgegeben Arrays und der Darstellung in einer Tabelle. Sorry, hab den Wald vor lauter Bäumen nicht gesehen und den Fehler falsch gesucht...sollte wohl erstmal ne Kaffee Pause einlegen! Ich lasse mir das Array + Subarray (nenne ich das mal) über 2 ineinander verschachtelte For-Schleifen ausgeben mit

              PHP-Code:
              for ($array_splitten 0$array_splitten sizeof($array); $array_splitten++){
              ....
              for (
              $subarray=1;$subarray<sizeof($org_array);$subarray++){
              //..
              }
              //..

              und ich hab mich mit dem Zähler im ersten Array vertan*ärger*! Hab noch ne Bedingung eingebaut und jetzt funzt es.

              @wahsaga: Volltextsuche klingt wirklich gut. Hab mir gerade ein paar Beispiel angeschaut. Werde ich mal vorschlagen - erscheint mir auch deutlich sinniger!

              thanx.

              mfg streuner
              Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
              der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

              "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

              Kommentar


              • #8
                Und benutze bitte die [quot]-Tags, wenn du zitierst.
                ok, hatte ich direkt im Eingabeeditor nicht gefunden! thanx
                Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
                der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

                "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

                Kommentar

                Lädt...
                X