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:
     
$xx = ...;               
$sql = ...;
$result = &$opnConfig['database']->Execute ($sql);
if( $result!==false ){
$yy = $result->fields['yy'];
$result->Close ();
}


Version 2:
     
$xx = ...;               
$sql = ...;
$result = &$opnConfig['database']->Execute ($sql);
if( $result!==false && $result->EOF){
$yy = $result->fields['yy'];
$result->Close ();
}


Version 3:
     
$xx = ...;               
$sql = ...;
$result = &$opnConfig['database']->Execute ($sql);
if( $result!==false && $result->EOF && isset($result->fields['yy']) ){
$yy = $result->fields['yy'];
$result->Close ();
}


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/