Forum

Moderiert von:
Forum: Entwicklungs Support
Sie schreiben eine Antwort zum Thema: PHP und OPN
Gehe zu: OpenPHPNuke - das Open Source CMS Forum Index


über den Beitrag: Auch anonyme Benutzer können in diesem Forum neue Themen eröffnen und Antworten schreiben.
Benutzername:
Nachrichtensymbol:
                                                                                                                       

more...


HTML : An
BBCode : An
 


Klicken Sie auf die Smilies, um diesen in Ihre Nachricht einzufügen:

Very Happy Very Happy Smile Smile Sad Sad Surprised Surprised
Confused Confused Cool Cool Laughing Laughing Mad Mad
Razz Razz Embaressed Embaressed Crying (very sad) Crying (very sad) Evil or Very Mad Evil or Very Mad
Rolling Eyes Rolling Eyes Wink Wink Another pint of beer Another pint of beer ToolTimes at work ToolTimes at work
I have an idea I have an idea

more... 
Einstellungen:







 
Sicherheits-Code
Sicherheits-Code
Neu laden

Thema im Überblick

Autor
xxxxxx

Registriert: 06.08.2008
Beiträge: 38
Wohnort: 88696 Taisersdorf


Sende eine Private Nachricht an xxxxxx Besuche die Homepage von xxxxxx
ICQ
PHP und OPN

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


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Beiträge: 2435
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
PHP und OPN

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


Zitieren Druckerfreundliche Darstellung nach oben
xxxxxx

Registriert: 06.08.2008
Beiträge: 38
Wohnort: 88696 Taisersdorf


Sende eine Private Nachricht an xxxxxx Besuche die Homepage von xxxxxx
ICQ
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


Zitieren Druckerfreundliche Darstellung nach oben