PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : array_push & Serverauslastung


morsche
19.01.2005, 17:15:09
morsche,

ich arbeite derzeit an einer Datenbank mit rund 16.000 Datensätzen. Diese habe ich bisher einfach und direkt mit einer while-Schleife abgefragt und dargestellt.
Nun muss ich aber aus Gründen der Nachbearbeitung die ganzen Daten zwischenspeichern. Ich wollte dies über einen array machen, aber wenn die SQL Abfrage komplett durchgeführt werden muss, d.h. sehr viele Datensätze gespeichert werden sollen kann die Seite nicht angezeigt werden. Mehrere Tests haben ergeben, dass das Abspeichern einer gesamten Zeile ($row) in einem Array-Glied bei 16.000 Zeilen anscheinend zu aufwendig für den Server ist. Kennt Ihr eine Möglichkeit dies zu umgehen?

Zu beachten wäre, dass ich gerne mit der foreach Schleife (o.ä) arbeiten würde, um in der Schleife selbst auf die einzelnen Zeilen über $row['Spaltenname'] zugreifen kann. Dann müsste ich nicht den gesamten Schleifeninhalt umschreiben.

Hier der alte und neue Code:


alt:

while($row = mysql_fetch_array($result))
{
...
Ausgabe
...
}

-------------------

neu:
while($row = mysql_fetch_array($result))
{
array_push($all_results,$row);
}

...
Nachbearbeitung von $all_results
...

foreach ($all_results s $row)
{
...
Ausgabe
...
}


Danke!

c4
20.01.2005, 08:12:12
Warum liest Du die Datensätze nicht Zeile für Zeile aus, bearbeitest sie gleich und gibst sie dann auch gleich direkt aus? Sehe hier keinen Grund, warum das nicht gehen sollte.

Wenn Du sowieso mit $row['name'] arbeiten willst, dann reicht es, wenn Du mysql_fetch_assoc() (http://php.net/mysql_fetch_assoc) nimmst.

In der php.ini gibt es max_execution_time, max_input_time und memory_limit, mit denen Du im Notfall die Lebenszeit und die Ressourcen Deiner Skripte erweitern kannst. Aber lass es lieber sein!

morsche
20.01.2005, 13:47:23
nunja, es ist eben für eine Suchfunktion. Und da mir die Möglichkeiten der SQL Abfragen nicht ausreichen wollte ich das eben in einem Array haben und den dann mit den PHP Funktionen durchsuchen - aber eigentlich hast du recht. Ist total unsinnig das erst in einen Array zu laden und den dann durchzugehen wenn es doch auch viel einfacher und direkter geht. Naja - passiert :)

c4
20.01.2005, 13:49:02
Original geschrieben von morsche
Und da mir die Möglichkeiten der SQL Abfragen nicht ausreichen wollte ich das eben in einem Array haben und den dann mit den PHP Funktionen durchsuchen Ich erlaube mir zu behaupten, dass Du nur nicht weißt wie. Mit MySQL ist weit mehr möglich, als man denken mag!

morsche
20.01.2005, 13:56:04
wenn du mir sagst wie, dann nutze ich auch gerne die SQL Funktionen für folgendes Problem:

Also um generell Felder zu durchsuchen verwende ich " like '%begriff%' ". Das läuft bisher alles optimal. Vorher habe ich aus dem Suchbegriff sämtliche Sonderzeichen entfernt und durch % ersetzt. Dann frage je nach ausgewählter Suchoption (AND/OR) die durch Leertasten getrennten Begriffe unabhängig von einander ab.

Und jetzt kommt das eigentliche Problem:

Habe ich in der Datenbank eine Zahl wie 12345678 und suche nach 1234.5678 (mit Leerzeichen, Sonderzeichen, o.ä.) wird natürlich ein Ergebnis gefunden, da die Sonderzeichen ja durch den SQL Platzhalter ersetzt werden.

Habe ich aber eine Zahl wie 1234.5678 in der Datenbank und suche nach 12345678 wird nichts gefunden, da ich den Punkt aus dem DB Datensatz ja nicht entfernen kann.

Wenn du mir sagst, wie ich das mit SQL dennoch lösen kann, wäre ich natürlich erfreut :)

c4
20.01.2005, 14:11:22
Original geschrieben von morsche
Habe ich aber eine Zahl wie 1234.5678 in der Datenbank und suche nach 12345678 wird nichts gefunden, da ich den Punkt aus dem DB Datensatz ja nicht entfernen kann. Wie löst Du das denn in PHP? Mit regulären Ausdrücken? Ist zumindest die Variante, die mir einfällt.

--> http://dev.mysql.com/doc/mysql/en/String_comparison_functions.html (nach REGEXP suchen)
Das Muster könnte dann so aussehen: [0-9]*[.,]?[0-9]*

Oder aber Du entfernst die Dezimalzeichen einfach:
--> http://dev.mysql.com/doc/mysql/en/String_functions.html (nach REPLACE suchen)
Die Zeichen werden natürlich nur für die jeweilige Abfrage entfernt, der Datensatz selber bleibt unberührt.

Damit geht's doch, nicht oder?

morsche
20.01.2005, 14:21:38
Wie ich die ausgegebenen DB Datensätze mit PHP filtere und vergleiche ist mir bewusst. Daher ja die Sache, dass ich es schon gerne mit SQL lösen würde. Im Moment bekomme ich die Suchresultate fertig durch meine SQL Abfrage ausgegeben. Da muss ich bei der Ausgabe nichts mehr aussortieren o.ä.. Und das ist ja ansich auch eine gute Sache, die die Suche darüberhinaus doch bestimmt auch etwas schneller macht, als wenn ich erst _alle_ Datensätze aus der DB auslese und dann nochmal komplett mit PHP durchgehe. Das war mein ursprünglicher Gedanke, wegen dem ich auch die komplette Abfrage über SQL und nicht später bei der Ausgabe mit PHP gelöst habe. Das hat nur jetzt leider zur Folge, dass ich das geschilderte Problem nicht lösen kann (mit SQL).

Für die Lösung müsste ich mir alle Daten ausgeben lassen und diese dann mit PHP verarbeiten. Also Suchbegriff und jeweilige Suchergebnisse mit regulären Ausdrücken filtern und anschließend vergleichen.

Momenten filtere ich nur den Suchbegriff und stecke den dann in die SQL Abfrage.

Oder täusche ich mich?

c4
20.01.2005, 14:24:51
Original geschrieben von morsche
Habe ich aber eine Zahl wie 1234.5678 in der Datenbank und suche nach 12345678 wird nichts gefunden, da ich den Punkt aus dem DB Datensatz ja nicht entfernen kann. Das hatte ich so aufgefasst: Du suchst nach 123 und willst auch 1.23 finden, korrekt?
Wenn ja, dann kannst Du doch die genannten Funktionalitäten von MySQL nutzen.
REPLACE() z.B. könntest Du bei SELECT und/oder bei WHERE nutzen. Damit muss PHP nix mehr machen.

morsche
20.01.2005, 14:27:47
OK, ich war wohl etwas zu voreilig. Dass es sich bei den von dir genannten Funktionen tatsächlich um SQL Befehle handelt war mir nicht bewusst.

Ich werde es testen, aber sieht recht vielversprechend aus, Danke! :)

c4
20.01.2005, 14:30:09
Original geschrieben von morsche
Dass es sich bei den von dir genannten Funktionen tatsächlich um SQL Befehle handelt war mir nicht bewusst. Sieht man doch an den Links... ;)

Ich werde es testen, aber sieht recht vielversprechend aus, Danke! :) hehe, interessanter Satz. Klingt wie "Eigentlich mag ich Dich nicht, bist aber trotzdem nicht mein Typ" oder "Das ist heiß, ich verbrenne mich trotzdem daran" ;)

Krass, zwei Smilies in einem Beitrag...

morsche
20.01.2005, 14:34:18
wie gesagt, zu voreilig. Habe mir nur deinen Kommentar in Klammern hinter den Links angeschaut...

EDIT:
zu meinem genialen satz :)
ich werde es testen=ich weiß noch nicht, ob es funktioniert

..., aber es sieht recht vielversprechend aus.

passt doch.