• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

abfrage ohne while schelife als komplettes array

  • Ersteller Ersteller FoXMorayn
  • Erstellt am Erstellt am
F

FoXMorayn

Guest
kann ich im folgendem code die while schleife entfernen? ziel soll die anbindung an template systeme sein. d.h. ich möchte alle datenoperationen vor der ausgabe durchführen. habe nichts passendes finden können. EDIT: sorry, leider kann ich hier keinen code posten, da das forum mal wieder alles durcheinander bringt...
Code:
 $sql_alleFilme = "SELECT * FROM `filme` ORDER BY `name` ASC"; if($mysql->query($sql_alleFilme)) { 	while($result = $mysql->fetchRow()) 	{ 		$film[] = $result; 	} }
gruß
 
Code:
$sql_alleFilme = "SELECT * FROM `filme` ORDER BY `name` ASC"; 
$result = $mysql->query($sql_alleFilme);
if( $result != false) {
 $filme = mysql_fetch_assoc($result);
}
 
Die beiden letzten Lösungen verzögern das Problem doch nur. Will man auf die Fetch-Ergebnisse zugreifen, dass muss man die Result-Arrays auch wieder irgendwie durchlaufen.
 
Bei meinem Beispiel wird die Rückgabe von mysql_fetch_assoc() als assoziatives Array gespeichert auf das man danach normal und mehrfach zugreifen kann. Verzögert wird dabei imho nichts.
 
Wenn du durch alle Elemente eine Arrays gehen willst, dann musst auch irgendwie eine Schleife bilden. Ob man die nun im Array macht oder im Resultset des Queries ist doch letztendlich egal. Prinzipiell würde ich bei großen Tabellen immer durch die Tabelle loopen, zumindest wenn die verwendete API serverseitige Cursor unterstützt.
 
Code:
$sql_alleFilme = "SELECT * FROM `filme` ORDER BY `name` ASC"; 
$result = $mysql->query($sql_alleFilme);
if( $result != false) {
 $filme = mysql_fetch_assoc($result);
}
funktioniert leider nicht, da nur eine zeile abgefragt wird.

mysqli verwende ich nicht, wobei das warscheinlich die lösung wär.
performance technisch ist das ganze natürlich etwas doppelt, der nutzen liegt für mich einfach in der einfacheren templalte erstellung und in der lesbarkeit vom code.

habe mich dazu entschlossen die while schleife in meine mysql klasse als fetchAll zu integrieren()
 
ich lege in letzter zeit viel wert auf code-design. der sinn und zweck der sache ist, dass ich die komplette datenverarbeitung, also das abfragen aus der datenbank und aufbereiten der daten komplett von der ausgabe trennen möchte.
im endeffekt erhällt man so einen sauberen schnitt im code und kann leicht templatesysteme anbinden und ist hinterher auch um einiges fexibler. mache informationen erhällt man erst nach dem abfragen aller relevanter daten aus der datenbank.

also weg von:

while($result = fetchRow())
{
echo "<li>".$result."</li>";
}

hin zu:

$result = fetchAll();
//hier ist die klare trennung von datenoperationen und ausgabe
foreach($result AS $key => $value)
{
echo "<li>".$value."</li>";
}
 
Mit dem Nachteil, dass du im ersten Fall nur eine Schleife hast, im zweiten Fall aber zwei.

Das macht sicher nichts aus, wenn du sowas drei- oder viermal im Code nutzt. Und macht es vielleicht auch lesbarer für dich. Erfahrungsgemäß kommen solche Abfragen aber schnell hundertfach vor und dann können die doppelten Schleifen performancekiller werden.
 
Außerdem musst du so sämtliche Result-Zeilen aller Abfragen gleichzeitig im Arbeitsspeicher des Scripts vorhalten.
 
dem stimm ich absolut zu! aber: die zusätzliche belastung kriegt man schnell wieder durch zusammgefasste sql querys, dem dadurch entstehndem größeren cachigpotential (um das ich mich nicht kümmern brauche, da es von der datenbank übernommen wird) und allgemein besserer übersicht im code zusammen. die eingesparte arbeitszeit kann ich so 1:1 in relevantere überlegungen stecken. also so seh ich das nach dem aktuellen stand der dinge.
 
aber: die zusätzliche belastung kriegt man schnell wieder durch zusammgefasste sql querys, ...
Was hat das damit zu tun, dass du alle Schleifen doppelt ausführen musst und die Daten doppelt im Speicher hast? Dadurch wird deine SQL Abfrage ja nicht verändert
 
stell dir folgende ausgabe in der reihenfolge vor:

{wieviele e-mails sind vorhanden}
{wieviele email von andresse xy}
{liste der e-mail (mal unabhängig davon, dass man dur 20 auf einer seite anzeigen würde)}

variante 1:
für jeden block eine sql abfrage eine schleife, einen eigenen ausgabeblock mit sql. das möchte ich nicht mehr, da es den code aufbläßt und meiner meinung nach unlesbarer macht

variante 2:
alles aulesen und nachträglich per javascript block1 und 2 über block3 schreiben, in masse hat sich diese technik als performance killer herausgestellt

variante 3:
erst alles auslesen, werte berechnen und danach die ausgabe machen. siehe http://www.html.de/datenbanken-z-b-...helife-als-komplettes-array-2.html#post288885
performance zu variante 1 ist nahe zu identisch, wenn man dadurch nicht weitere joins benötigt (also gefühlt, habs jetzt nicht nachgemessen)

könnt ihr euch mit einer der 3 varianten anfreunden, oder ist das wieder mal totalter quatsch, den ich da mache?

jetzt ist mir grad noch etwas aufgefallen:
http://www.html.de/datenbanken-z-b-mysql/35185-query-optimieren.html sieht auch post #5 bei dem thema
Code:
(initialization) 0.000003   checking query cache for query 0.000183   checking permissions 0.00001   Opening tables 0.000023   System lock 0.00001   Table lock 0.000071   init 0.000162   optimizing 0.000035   statistics 0.000054   preparing 0.000038   Creating tmp table 0.000088   executing 0.000006   Copying to tmp table 0.018529   [B]storing result in query cache 47.277711[/B]
hat das etwas damit zu tun, dass man abfragen mit großen datenmengen splitten sollte, oder liegt es wie schon vermutet einfach nur an den joins?
storing result in query cache 47.277711: sagt mir dieser wert, dass diese zeit nur für das cachen gebraucht wird, oder wird die zeit für für das erstellen mit einberechnet? kann man den query cache abschalten? ( Der MySQL Query-Cache - Datenbanken - administrator )
 
Wir reden doch von einer Webanwendung oder?
Da hälst du keine Daten vor, das Skript wird einmal aufgeruifen und zeigt die Daten an - fertig. Willst du dann eine andere Reihenfolge, wird das Skript erneut aufgerufen.

Wenn du die Ergebnisse alle auf einer Seite haben willst, dann ist die Variante 1 die Beste. Nur verstehe ich deinen Bedenken nicht. Du musst natürlich nicht immer die gleiche Schleife ausführen, sondern du kannst ohne Probleme eine Funktion definieren, die aus einer bestimmten Datenbank mit verschiedenen Parametern verschiedene Ergebnisse produziert.
 
jetzt ist mir grad noch etwas aufgefallen:
http://www.html.de/datenbanken-z-b-mysql/35185-query-optimieren.html sieht auch post #5 bei dem thema
Code:
(initialization) 0.000003   checking query cache for query 0.000183   checking permissions 0.00001   Opening tables 0.000023   System lock 0.00001   Table lock 0.000071   init 0.000162   optimizing 0.000035   statistics 0.000054   preparing 0.000038   Creating tmp table 0.000088   executing 0.000006   Copying to tmp table 0.018529   [B]storing result in query cache 47.277711[/B]
Ich weiß nicht, woher du diese Ausgabe hast.
 
Zurück
Oben