| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

19-08-2009, 14:51
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
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
__________________
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 ---"
Geändert von streuner (19-08-2009 um 14:56 Uhr)
|

19-08-2009, 14:57
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von streuner
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.
|

19-08-2009, 15:00
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Na im Resultset sind die Einträge ja noch nicht doppelt (Notfalls per DISTINCT), da machst du wohl bei der Ausgabe was falsch.
|

19-08-2009, 15:02
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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:
Zitat:
Code:
$aHits[$sTable][] = $aHit;
|
Ach nee, die hätten dann ja nen anderen Namen.
Geändert von AmicaNoctis (19-08-2009 um 15:05 Uhr)
|

19-08-2009, 15:10
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
@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 ---"
|

19-08-2009, 15:21
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von streuner
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.
|

19-08-2009, 15:23
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
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 ---"
|

19-08-2009, 15:26
|
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 461
|
|
Zitat:
|
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 ---"
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|