Array filtern

Array filtern

am 30.10.2004 10:52:40 von dont"replay

Servus Beinander,
habe hier eine Abfrage auf eine mysql DB.
nach der klassischen Anweisung:
while($row = mysql_fetch_assoc($_query))
baue ich dann sich wiederholende Tabellenzeilen auf.

_Vorher möchte ich gerne, anhand von $_GET übergebenen Parametern, das
Array $row filtern.
Hintergrund ist die Verschachtelung von Filtern, die ich aus
Performancegründen nicht mit verschiedenen DB Abfragen lösen möchte.

Die $_GET Parameter frage ich also vorher ab und dann ... fehlt mir der
Ansatz.
Wie kann ich vorher auf das komplette Array zugreifen?
Trenne ich while von $row, zeigt mir var_dump ($row) nur einen Datensatz


Danke für jeden produktiven Ansatz.
Hoffe, ich bin mit meiner Fragestellung hier richtig.
Grüße,
Christian G.

Re: Array filtern

am 30.10.2004 11:32:30 von Michael Rittweger

Hallo, Christian!

> Wie kann ich vorher auf das komplette Array zugreifen?

Nicht.

> Trenne ich while von $row, zeigt mir var_dump ($row) nur einen Datensatz

Und wie man an dem passend gewählten Namen der Variablen erkennen kann: Das
ist auch korrekt so.

Du holst Dir das Ergebnis zeilenweise (row = Zeile) und nicht komplett.

Wenn Du wirklich nicht mit einer WHERE-Klausel filtern kannst oder willst,
dann muß Dein Filter nach dem Holen jeder einzelnen Zeile ansetzen.

Was daran dann allerdings performanter sein soll, versteh ich nicht.

> Christian G.

Gruß, Michael

Re: Array filtern

am 30.10.2004 13:39:30 von dont"replay

Hallo Michael,
Danke für die Antwort.

> Hallo, Christian!
>
> > Wie kann ich vorher auf das komplette Array zugreifen?
>
> Nicht.
Hab ich mir gedacht :-(
>
> > Trenne ich while von $row, zeigt mir var_dump ($row) nur einen
Datensatz
>
> Und wie man an dem passend gewählten Namen der Variablen erkennen
kann: Das
> ist auch korrekt so.

>
> Du holst Dir das Ergebnis zeilenweise (row = Zeile) und nicht
komplett.
>
> Wenn Du wirklich nicht mit einer WHERE-Klausel filtern kannst oder
willst,
> dann muß Dein Filter nach dem Holen jeder einzelnen Zeile ansetzen.
>
> Was daran dann allerdings performanter sein soll, versteh ich nicht.
>
ok, das sieht nach Holzweg aus.
Die Idee war, eine eh' schon belasteten DB nicht mit
nice-to-have-Abfragen zu belästigen, sondern nur einmal eine Abfrage auf
Alles zu machen und dann mit dem gefüllten Array weiterzuarbeiten. Was
gibt's da für Möglichkeiten?

Grüße,
Christian

Re: Array filtern

am 30.10.2004 14:22:11 von Niels Braczek

Christian G. schrieb:

> nach der klassischen Anweisung:
> while($row = mysql_fetch_assoc($_query))
^^^^^
Entweder ist die Variable falsch bezeichnet, oder das heir funktioniert
nicht. An diese Stelle gehört ein Resultset, keine Query

> baue ich dann sich wiederholende Tabellenzeilen auf.
> [...]
> Die $_GET Parameter frage ich also vorher ab und dann ... fehlt mir
> der Ansatz.
> Wie kann ich vorher auf das komplette Array zugreifen?
> Trenne ich while von $row, zeigt mir var_dump ($row) nur einen
> Datensatz

Lies erst alle Datensätze in ein Array.

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

Wahrscheinlich wird der Server aber weniger belastet, wenn du nur die
tatsächlich benötigten Datensätze holst. Probiere es einfach mal aus.

MfG
Niels

--
Je korrupter ein Staat, desto zahlreicher seine Gesetze. [Tacitus}

Re: Array filtern

am 30.10.2004 15:32:01 von Michael Rittweger

Hallo, Christian!

> Die Idee war, eine eh' schon belasteten DB nicht mit
> nice-to-have-Abfragen zu belästigen, sondern nur einmal eine Abfrage auf
> Alles zu machen und dann mit dem gefüllten Array weiterzuarbeiten.

Sicher kannst Du zuerst alle Datensätze in ein Array holen und damit
weiterarbeiten. Aber was macht es für einen Sinn, eine komplette Tabelle in
den Speicher zu kopieren und dann, je nach Situation, wieder alle möglichen
Datensätze wegzuwerfen?

Fang an mit "SELECT $feldnamen FROM $tabelle WHERE ($filter) ORDER BY
$sortierung;" oder etwas in der Art. Setz entsprechend die Variablen
$feldnamen, $tabelle und $sortierung. Das ist noch der einfachste Task.

Wandel jetzt Deine IF-Abfragen in eine passende Syntax für eine
WHERE-Klausel um und das war's. (Trifft keine Filter-Bedingung zu, setz
$filter="1".)

Mal als Beispiel: Deine Datenbank hat 500 Datensätze, Deine IF-Abfragen
würden 450 davon verwerfen und nur 50 für die Anzeige übrig lassen.

Du müßtest, wenn Du es so machst, wie Du es bisher vor hast, in jedem Fall
alle 500 Datensätze auslesen. Das alleine kostet schon Rechenzeit genug, vor
allem vor dem Hintergrund, daß 90% der $row-Holungen unnötig wären. Kopierst
Du die komplett in ein Array, kostet es zusätzlich auch noch entsprechend
Speicher. Dann muß jede Zeile mit IF überprüft werden, was weitere
Rechenzeit kostet.

Bastelst Du Dir einmal eine WHERE-Klausel zurecht, kostet es genau einmal
Rechenzeit, bevor die Query abgeschickt wird. Durch das Ausfiltern (durch
den Server) der nicht passenden Datensätze wird weitere Rechenzeit
eingespart, da die unnötigen Datensätze gar nicht erst aus der Tabelle
ausgelesen werden müssen.

Das dürfte letztendlich in jedem Fall bedeutend performanter sein, als "von
Hand" zu filtern.

Solltest Du alle 500 DS in ein Array kopiert haben, und nicht nur die 50
benötigten, stellt sich außerdem noch das Problem, daß eine
"Blättern"-Navigation (10 DS / Seite oder so) ebenfalls nur noch sehr, sehr
umständlich zu realisieren wäre.

> Christian

Gruß, Michael

Re: Array filtern

am 30.10.2004 17:55:08 von dont"replay

Hi Michael,
Deine Argumentation hat mich überzeugt, die DB wird jetzt wohl oder übel
mit den zusätzlichen Abfragen leben müssen. .-)

Danke,
Christian G.

Re: Array filtern

am 30.10.2004 17:57:12 von dont"replay

> Entweder ist die Variable falsch bezeichnet, oder das heir
funktioniert
> nicht. An diese Stelle gehört ein Resultset, keine Query

Hi Niels,
...ist ein falscher Bezeichner. Hast Recht.:-)
Grüße,
Christian G.