xxxxxx
Registriert: 06.08.2008
Beiträge:
38
Wohnort: 88696 Taisersdorf
|
PHP un OPN
Geschrieben: 18.09.2008 17:56
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
|
stefan Beiträge:
2435
Wohnort: Münster
|
Geschrieben: 18.09.2008 20:39
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
|
xxxxxx
Registriert: 06.08.2008
Beiträge:
38
Wohnort: 88696 Taisersdorf
|
Geschrieben: 18.09.2008 21:08
Vielen Dank für Deine Ausführungen. Dann hab ich wohl alles richtig verstanden, glaube ich.
Viele Grüsse,
Gregor
|