2 x Datenbankabfrage oder 2 x Schleife?
Phil
- datenbank
0 suit0 Phil0 MasterMind0 suit
2 Sven Rautenberg
Hallo,
was ist optimaler?
aus einer DB wird eine Navigation 2x abgerufen (Top- und Seitennavi).
Ist es besser, sich das array per PHP verarbeiten zu lassen, oder
mehrere DB-Abfragen zu starten?
a: 2 x DB Abfrage
----------------------------------------------------------
$query = "SELECT ID, name, link FROM nav WHERE stat_nav_lft = 1 ORDER by order_id";
...html...
$query = "SELECT ID, name, link FROM nav WHERE stat_nav_top = 1 ORDER by order_id";
b: 1 x DB Abfrage
----------------------------------------------------------
while($row = mysql_fetch_object($result))
{
if($row->stat_nav_top = 1)
echo '<a class="act" href="'.$row->link.'">'.$row->name.'</a>';
}
...html...
while($row = mysql_fetch_object($result))
{
if($row->stat_nav_lft = 1)
echo '<a class="act" href="'.$row->link.'">'.$row->name.'</a>';
}
Phil
Hallo,
was ist optimaler?
Eine Abfrage und Schleife die beide Menüs erzeugt, warum 2?
»» Hallo,
»»
»» was ist optimaler?
Eine Abfrage und Schleife die beide Menüs erzeugt, warum 2?
-einmal für das Topmenü
-einmal für das Seitenmenü links
Beide befinden sich in der selben Tabelle, werden durch den Status "0" und "1"
unterschieden.
"stat_nav_lft" für Seitenmenü links
"stat_nav_top" Topmenü
Beide befinden sich in der selben Tabelle, werden durch den Status "0" und "1"
Dann liest du alle Daten aus, sortierst entsprechend und splitest dann das Array an der richtigen Stelle.
Damit sparst du dir eine komplette Datenbankabfrage und die Bearbeitung eines Arrays dürfte weniger "kosten".
Prüfe in einer Schleife, obs ins erste oder zweite Menü gehört und bau in dieser Schleife halt zwei Variablen zusammen die du dann anschließend ausgibst.
Es dürfte sich performancemäßig aber nicht viel reissen - aber imho ist eine Abfrage mit zwei Schleifen ziemlich unsinnig.
Entweder zwei Abfragen, zwei Schleifen oder eine Abfrage, eine Schleife. Dein anderer Vorschlag ist imho unklug.
Moin!
was ist optimaler?
Das, was nach vernünftiger Messung durch Benchmarks schnellere Ergebnisse liefert - sofern man die Geschwindigkeit als Optimumskriterium verwenden will.
Außerdem gibt es noch diverse weitere Kriterien, die mal optimieren könnte - beispielsweise Speichernutzung, Code-Klarheit, Code-Wiederverwertbarkeit, etc. Nicht alle Kriterien können gleichzeitig optimiert werden, manche stehen in direktem Widerspruch zueinander.
aus einer DB wird eine Navigation 2x abgerufen (Top- und Seitennavi).
Ist es besser, sich das array per PHP verarbeiten zu lassen, oder
mehrere DB-Abfragen zu starten?
Im Sinne eines OOP-Ansatzes wäre die Vorgehensweise vermutlich, die Navigation in nur einem einzigen Query aus der Datenbank abzufragen, in einem Objekt zu speichern, und auf Anfrage jeweils die entsprechenden Stückchen auszugeben. Wenn dann noch entsprechende Decorator-Klassen zum Einsatz kommen, steht der fast universellen Anpassbarkeit der Navigation fast nichts mehr im Wege.
- Sven Rautenberg
Im Sinne eines OOP-Ansatzes wäre die Vorgehensweise vermutlich, die Navigation in nur einem einzigen Query aus der Datenbank abzufragen, in einem Objekt zu speichern, und auf Anfrage jeweils die entsprechenden Stückchen auszugeben. Wenn dann noch entsprechende Decorator-Klassen zum Einsatz kommen, steht der fast universellen Anpassbarkeit der Navigation fast nichts mehr im Wege.
Vielen Dank
Also so oder ähnlich:
$query = "SELECT ID, name, link FROM nav ORDER by order_id";
$navi = mysql_query($query);
while($row = mysql_fetch_object($navi))
{
if($row->stat_nav_top == 1 && $row->ID == $page_id) <!--Link ist aktiv -->
echo '<div class="act"'.$row->name.'</div>';
elseif($row->stat_nav_top = 1)
echo '<a href="'.$row->link.'">'.$row->name.'</a>';
}
dto. für Navi links
Hallo
Also so oder ähnlich:
... eher ähnlich (die HTML-Ausgabe betreffend).
while($row = mysql_fetch_object($navi))
{
if($row->stat_nav_top == 1 && $row->ID == $page_id) <!--Link ist aktiv -->
echo '<div class="act"'.$row->name.'</div>';
Mal abgesehen, dass der HTML-Kommentar im PHP-Quelltext nix zu suchen hat, hast du die schließende Klammer bei `<div class="act">`{:.language-html} vergessen. Ich vermute mal, im "echten" Quellcode wird der Fehler nicht enthalten sein.
> ~~~php
elseif($row->stat_nav_top = 1)
> echo '<a href="'.$row->link.'">'.$row->name.'</a>';
> }
Den Linktext zum aktuellen Dokument nicht als Link auszuzeichnen, ist richtig, diesen aber, im Unterschied zu den Links selbst, in ein Blockelement zu packen, halte ich nicht für optimal. Das kann man mit CSS, für die Klienten, die das verstehen, zwar alles umbasteln, aber man sollte das einheitlich handhaben. Entweder alle Links (auch, wenn sie keine sind) in Inline- oder alle in Blockelemente. Grundsätzlich wäre zu überlegen, ob eine Liste als Container dafür herhalten sollte, schließlich ist das eine Auflistung von Links.
Tschö, Auge
Hallo
»» Also so oder ähnlich:
... eher ähnlich (die HTML-Ausgabe betreffend).
»» ~~~php
while($row = mysql_fetch_object($navi))
»» {
»» if($row->stat_nav_top == 1 && $row->ID == $page_id) <!--Link ist aktiv -->
»» echo '<div class="act"'.$row->name.'</div>';
>
> Mal abgesehen, dass der HTML-Kommentar im PHP-Quelltext nix zu suchen hat, hast du die schließende Klammer bei `<div class="act">`{:.language-html} vergessen. Ich vermute mal, im "echten" Quellcode wird der Fehler nicht enthalten sein.
>
Ist im "echten" Quellcode nicht enthalten. Funktioniert auch.
> Den Linktext zum aktuellen Dokument nicht als Link auszuzeichnen, ist richtig, diesen aber, im Unterschied zu den Links selbst, in ein Blockelement zu packen, halte ich nicht für optimal. Das kann man mit CSS, für die Klienten, die das verstehen, zwar alles umbasteln, aber man sollte das einheitlich handhaben. Entweder alle Links (auch, wenn sie keine sind) in Inline- oder alle in Blockelemente. Grundsätzlich wäre zu überlegen, ob eine Liste als Container dafür herhalten sollte, schließlich ist das eine Auflistung von Links.
>
Danke, das ist logisch. Ich habe jetzt alles in eine Liste gepackt.
~~~html
<ul>
<li><a href="...">Link1</a></li>
<li class="act">Link2</li>
<li><a href="...">Link3</a></li>
</ul>
Gruß
Philipp