Autor | xxxxxx |
Datum | 18.09.2008 17:56 |
Beiträge: | Hallo zusammen!
Wenn ich in OPN eine SQL-Abfrage mache, wie sieht dann der "perfekte" Code dazu aus? Version 1:
Version 2:
Version 3:
Was gibt $opnConfig['database']->Execute bei Fehler,Kein Datensatz gefunden,etc. zurück? Muss man die $result->Close () Funktion aufrufe? Was macht diese genau? Ich vermute der Garbage-Collector räumt auch auf, oder? Vielen Dank, Gregor |
Autor | stefan |
Datum | 18.09.2008 20:39 |
Beiträge: |
Wichtig wäre das du Bestimmte sachen erfüllst. Wie gibt es mehr als eine Möglichkeit. Ich beschreib mal was wichtig ist und weise auf unterschiede hin. $result = $opnConfig['database']->Execute ('SELECT id FROM ' . $opnTables['opn_weiss_nicht']); // Hier wäre auch erst wie in deinem Beispiel die zu weisung des sql Befehls zu einer Variablen möglich // Wenn du allerdings nach Optimal fragst ist die Frage was meint Optimal // wenn es Speicher / Geschwindigkeit meint ist der verzicht auf eine $sql = xxx; natürlich sinnvoll // übersichtlicher ist es aber mit if ($result !== false) { // wenn die Tabelle nicht vorhanden ist dann ist das Objekt === falsche also es gibt es nicht // das !== ist nicht das selbe wie != // Ein Test auf $result->EOF könnte ich mir in meinem Beispiel sparen weil // ja dann die while schleife nicht auf geführt wird // EOF Bedeutet "keine Daten/Daten Ende" denkbar wäre auch hier ein andere Test // In jedem Fall muss man eben Testen ob Daten da sind bzw. geliefert wurden. while (! $result->EOF) { $id = $result->fields['id']; // ein Test auf isset($result->fields['id']) kann ich mir in diesem beispiel sparen // denn wenn dieses Feld nicht daist dann habe ich oben die sql abfrage Falsch gebaut ... $result->MoveNext (); // nächster eintrag ... } $result->Close (); // das Close leert das Objekt und sollte in jedem Fall laufen. Aber // ich kann das hier hin stellen weil wir nur ein Objekt haben // wenn auch die Tabelle da ist // wenn keine Tabelle dann auch kein Objekt } unset ($result); unset ($id); // das entfert die letzten Reste dieser Variable auf dem Speicher. Das ist // an verschiedenen Stellen sinnvoll. Insbesondere wenn z.B. die ID ein großes array wäre // in diesem Beispiel bringt es (ausgehend von $id = 1 Byte) 2 Byte die wieder freigegeben // werden Also ist schwer zu sagen was der Optimale Code ist, es kommt auf die Situation an Anderes Beispiel $sql = 'SELECT COUNT(u.uid) AS counter FROM ' . $opnTables['users'] . ' u, ' . $opnTables['users_status'] . ' us WHERE (u.uid=us.uid) ...'; $justforcounting = $opnConfig['database']->Execute ($sql); if ( (is_object ($justforcounting) ) && (isset ($justforcounting->fields['counter']) ) ) { $reccount = $justforcounting->fields['counter']; } else { $reccount = 0; } Fast alles wichtige auf anderem Weg Sichergestellt. (is_object ($justforcounting) ) Test ob es ein Objekt ist ... (isset ($justforcounting->fields['counter']) ) Hier nötig! weil nicht EOF getestet also auch keine daten kommen können $reccount = 0; Hier default Wert den man haben will wenn nichts kommt. Was hier Fehlt wäre das close ... Das man aber hier eigentlich nicht 100% sauber einbauen könnte weil die Situatiion keine Daten nicht erfassbar ist. Also würde dein Version 1 nicht gehen. Version 2 Standart dastellen. Und 3 Luxus der eine Situation abfängt das man bei dynamischen Tabellen nutzen sollte. Due kannst beim Fehler Fall auch noch if ($opnConfig['database']->ErrorNo ()>0) { ...Hier Fehler ... nutzen. $opnConfig['database']->ErrorMsg () gibt dir den error zurück |
Autor | xxxxxx |
Datum | 18.09.2008 21:08 |
Beiträge: | Vielen Dank für Deine Ausführungen. Dann hab ich wohl alles richtig verstanden, glaube ich.
Viele Grüsse, Gregor |
Diese Seite drucken Diese Seite schließen |
Dieser Artikel kommt von: OpenPHPNuke - das Open Source CMS |
http://www.openphpnuke.info/ |