Datenbanktabelle im Array speichern und dann auslesen

Alles, was PHP betrifft, kann hier besprochen werden.

Datenbanktabelle im Array speichern und dann auslesen

Postby samurai » 25. March 2009 19:43

Hallo,

gibt es eine Array-Funktion die der SELECT Abfrage bei mysql gleicht?

Ich habe leider nichts brauchbares zu meiner Frage im Netz gefunden, daher probier ich es hier.


Für eine AutoSuggest-Funktion eines Formular-Text-Feldes wird bei jedem Tastenschlag eine Datenbankabfrage gemacht und entsprechende Vorschläge unterbreitet. Allerdings dauert dieser Vorgang je Tastendruck ca. 1 Sekunde, bis neue Vorschläge gezeigt werden. Das ist zielmlich langsam, denn wenn man den Text schnell schreibt und Enter drückt, erscheinen keine nützlichen Vorschläge.

Ich möchte also den Vorgang der Datenbankabfrage beschleunigen und hatte dazu die Idee:

Die komplette Datenbanktabelle erst in ein Array speichern. Und anschließend bei jedem Tastendruck das Array abfragen anstatt jedes Mal die Verbindung zur Datenbank aufzubauen. Das müsste dann doch schneller laufen oder?

Hier hole ich die Werte aus der DB und packe diese genau so geordnet in ein Array:
Code: Select all
$tabelle = Array();
$zeilen = mysql_num_rows($ergebnis);
for ($a = 0; $a < $zeilen; $a++)
{
$tabelle[$a]['nr'] = mysql_result($ergebnis, $a, Nr);
$tabelle[$a][name] = mysql_result($ergebnis, $a, Name);
$tabelle[$a][beruf] = mysql_result($ergebnis, $a, Beruf);
$tabelle[$a][wohnort] = mysql_result($ergebnis, $a, Wohnort);
}


Nun habe ich ja die Tabelle im Array.

Jetzt will ich im Array die gleiche Abfrage machen wie bei mysql
"SELEC * FROM tabelle WHERE Wohnort = 'berlin'"

Beispiel:
mein Array $tabelle sieht z.B. folgendermaßen aus:
Code: Select all
$tabelle[0] = Array(nr => '1', name => 'Hans', beruf => 'verkäufer', wohnort => 'bonn');
$tabelle[1] = Array(nr => '2', name => 'Markus', beruf => 'lehrer', wohnort => 'berlin');
$tabelle[2] = Array(nr => '3', name => 'Jan', beruf => 'mechaniker', wohnort => 'frankfurt');
$tabelle[3] = Array(nr => '4', name => 'Leo', beruf => 'arzt', wohnort => 'berlin');

Jetzt soll eine Array-Abfrage z.B. nach Wohnort berlin erfolgen und es sollen alle Werte (wie: nr, name beruf,..) des Datensatztes bzw. in diesem Fall der beiden Datensätze ausgegeben werden.
Also knapp ausgedrückt: ich will nach wohnort berlin fragen und am ende die 2 Datensätze: 2, Markus, lehrer, berlin und 4, Leo, arzt, berlin ausgeben können.
Wie kann ich das machen?

Geht die Abfrage beim Array so einfach wie bei mysql? Oder muss ich das komplette Array dann durch eine Schleife jagen und jeden Datensatz einzeln vergleichen? Es geht mir halt um eine Lösung die die AutoSugges-Funktion beschleunigt.


THX
der freundliche samurai
samurai
 
Posts: 45
Joined: 17. July 2006 13:39

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Xardas der Dunkle » 25. March 2009 19:59

Doku lesen, hilft: http://de3.php.net/manual/de/function.m ... -assoc.php ;).

Desweiteren schreibt man Strings immer noch Anführungszeichen. Ob " oder ' ist hierbei egal, so lange man sie überhaupt setzt :roll:.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby samurai » 25. March 2009 20:11

Ja, aber da macht er doch auch immer wieder die mysql Abfrage mit.
Genau das will ich ja vermeiden.

Ich will erst die Datenbanktabelle in ein Array eins zu eins kopieren um dann immerwieder das Array nach irgendwelchen Bedinungen abfragen. - Also nicht mehr auf die DB zugreifen.

Ich glaube eine Arrayabfrage sollte schneller sein als die gleiche Abfrage einer DB-Tabelle, oder?
Aber wie genau kann ich einem mehrdimensionalen Array sagen: finde alle Zeilen wo Spalte Wohnort = berlin und pack dann den kompletten Daten satz (also die ganze zusammenhängende "Zeile" nr, name, beruf, wohnort in einen Array (damit ich die Zeile wiedergeben kann)??



THX
samurai
 
Posts: 45
Joined: 17. July 2006 13:39

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Xardas der Dunkle » 25. March 2009 21:02

Ja, aber da macht er doch auch immer wieder die mysql Abfrage mit.

Bullshit.

Code: Select all
<?php
// [...] Datenbank initialisierung

$result = mysql_query('SELECT * FROM `tabelle`');
$rows = Array();

while(
$row = mysql_fetch_assoc($result)) {
      $rows[] = $row;
}

// [...] Mache irgendwas mit dem Array $rows

echo 'Hallo mein Name ist ' $rows[0]['name'] . ' wohne in ' $rows[0]['wohnort'] . ' und arbeite als ' $rows[0]['beruf'] . '!';
 


Ich glaube eine Arrayabfrage sollte schneller sein als die gleiche Abfrage einer DB-Tabelle, oder?

Kommt drauf an was du machst. Hast du eine Tabelle mit sehr vielen Datensätzen, kann der Query schneller sein, den PHP ist auch nicht gerade Speedy Gonzales ...
Aber meistens ist es echt sinnvoller, die Daten in ein Array zu werfen und sie da heraus immer wieder abzufragen, anstatt immer neu aus der DB auszulesen, also ja.

Aber wie genau kann ich einem mehrdimensionalen Array sagen: finde alle Zeilen wo Spalte Wohnort = berlin und pack dann den kompletten Daten satz (also die ganze zusammenhängende "Zeile" nr, name, beruf, wohnort in einen Array (damit ich die Zeile wiedergeben kann)??

In dem Fall, würde ich eher doch immer neu auf die DB zugreifen. Ist vorallem einfacher und schneller ... (Weil du mit PHP hier das Array mehrfach durchlaufen müsstest).
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Nobbie » 25. March 2009 21:12

Im Prinzip mußt Du das ganze Array abdackeln und nach Treffern fahnden - ob Du das nun selbst komplett ausprogrammierst (was nicht sonderlich aufwändig ist) oder Dich beispielsweise der Funktion array_filter (siehe http://de.php.net/manual/de/function.array-filter.php) bedienst, ist reine Geschmackssache.

Mit dem array_filter ist das natürlich in wenigen Zeilen erschlagen, es bleibt nur der unangenehme Beigeschmack, dass Du den zu suchenden Wert (und ggf. auch dessen Key, je nach Flexibilität) nicht als Parameter an die Callback-Funktion übergeben kannst, weswegen Du den unschönen Umweg über globale Variablen gehen mußt (aber erlaubt ist, was gefällt, wenn es denn nicht anders geht - dafür hat man blitzschnell eine Lösung programmiert).

Von der Performance her erwarte ich keine großen Unterschiede, ob Du nun selbst einen Loop programmierst oder Dich des array_filter() bedienst.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Wiedmann » 25. March 2009 21:54

Ja, aber da macht er doch auch immer wieder die mysql Abfrage mit.

Der HTTP-Request bei jedem Tatstendruck auf das PHP-Script dürfte wohl länger dauern, als die darin enthaltene DB Abfrage.

Genau das will ich ja vermeiden.

Warum benutzt du dann überhaupt eine Datenbank.

Die komplette Datenbanktabelle erst in ein Array speichern. Und anschließend bei jedem Tastendruck das Array abfragen

Dann stellt sich die Frage:
- wo du das Array zwischen den Scriptaufrufen bei Tastenanschlag zwischenspeicherst.
- um welche Datenmenge es überhaupt geht
- oder gleich alles im ersten Request in einem JavaScript mitschickst, und so auch schon keine weiteren HTTP-Requests benötigst.

Für so eine Livesuche gibt's jedenfalls schon eine Menge fertiger Klassen in PHP oder JavaScript oder beides mit Ajax.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Nobbie » 25. March 2009 21:59

@Wiedmann: genau die Fragen habe ich mir auch gestellt.

Man könnte natürlich das Array als Session speichern, aber ich glaube auch, dass der HTTP Request der Bottleneck ist und nicht die Datenbank.

P.S.: Wahrscheinlich läuft das ganze im Moment noch auf localhost, weswegen der Request nicht sonderlich auffällt. Das wird sich bei realem Einsatz deutlich ändern.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Xardas der Dunkle » 26. March 2009 06:59

Man könnte natürlich das Array als Session speichern,

Nicht dein ernst!?
Ich erinnere mich an ein tolles Newslettersystem das sich tot gefressen hat, weil die Programmierer auf die glorreiche Idee gekommen waren das Objekt mit alle 4000 Empfängern in die Session zu schmeißen.
Ich habe es danach so umgeschrieben das bei jedem Aufruf ein Query mit LIMIT-Clause gemacht wird und siehe da es funktioniert problemlos.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: Datenbanktabelle im Array speichern und dann auslesen

Postby Nobbie » 26. March 2009 10:08

Xardas der Dunkle wrote:
Man könnte natürlich das Array als Session speichern,

Nicht dein ernst!?


Vollständig. Wenn man ein Array zu speichern hätte über Transaktionsgrenzen (weil es das System so erfordert), so würde ich das selbstverständlich in Sessions ablegen. Inwiefern man das Sessionhandling ggf. selbst steuert und zu Performancezwecken dann auf SQL-System legt oder wie auch immer, steht auf einem anderen Blatt.

Speziell in diesem Fall hat "Wiedmann" außerden schon alle Aspekte genannt, die grundsätzlich gegen diese Art von Programmierung sprechen. Mein Hinweis war rein theoretischer Natur, dass PHP für die Anforderung "Array speichern" eine eloquente Lösung anbietet - aber Dein Einwand überrascht mich wenig, Du beweist immer wieder, dass Du (nicht nur meine) Beiträge inhaltlich nicht richtig verstehst.
Nobbie
 
Posts: 8779
Joined: 09. March 2008 13:04


Return to PHP

Who is online

Users browsing this forum: No registered users and 4 guests