molily: Programmstruktur bei aufeinander aufbauenden Abläufen

Beitrag lesen

Hallo,

Ich kommentiere mal einige Teile, sowohl zu deinem Konzept als auch allgemeine Dinge.

SELFHTML Forum halt, man bekommt nie das, nach dem man fragt. ;)

private $result;

Eine Datenbankklasse erledigt zwar im Allgemeinen alles über eine einzelne Verbindung, jedoch ist es nicht immer so, dass das Ergebnis vollständig ausgewertet ist, bevor eine neue Abfrage gestartet wird.

Klar, das Beispiel liest ein Result erst komplett aus, bevor eine weitere Abfrage gesendet wird.

Sinnvoller, finde ich, sollte es eine eigene Klasse bilden

Ja, das wäre wohl angebracht, wenn man Results gleichzeitig abfragen will. Im Beispiel läuft noch streng alles nacheinander.

Ein Konstruktor gibt unter PHP5 nur eine Instanz seiner Klasse zurück, nichts anders.

Da habe ich zu sehr in JavaScript gedacht. ;)

Mit return etwas anderes zurückzugeben funktioniert nicht. Das war nur unter PHP4 möglich (möglicherweise auch noch in frühen 5er Versionen). Wenn du unterschiedliche Ergebnisse haben möchtest, verwende das Factory-Pattern.

Im Grunde sollte ja nur überprüft werden, ob der Konstruktor die Datenbankverbindung herstellen konnte, das lässt sich sicher auch über eine status-Eigenschaft lösen.

Im Constructor: $this->connect(...);

Nicht immer ist es sinnvoll, sofort nach Instanziieren der Klasse eine Verbindung aufzubauen

Ist mir klar - diesen Code soll weder universell sein noch will ich ihn wirklich an anderer Stelle weiterverwenden.

while ($rowObject = pg_fetch_object($this->result))
    $objectArray[] = $rowObject;
  foreach ($objectArray as $rowObject) ...

... In dem Konstrukt wirft dir das foreach eine Fehlermeldung um die Ohren, wenn die Query eine leere Ergebnismenge zurückliefert und $objektArray keins ist.

Ja... mir sind PHP-Grundlagen durchaus geläufig. ;) Ist bei dir nicht angekommen, warum ich den Code geschrieben und hier gepostet habe? ;)

$dataArray[] = '"' . pg_escape_string($fieldName) . '" = '' . pg_escape_string($value) . ''';

PHP kennt eine Funktion namens sprintf, mit der man Strings etwas übersichtlicher zusammenstellen kann: $dataArray[] = sprintf('"%s" = '%s'', pg_escape_string($fieldName), pg_escape_string($value));

Kenn ich, find ich aber nicht sonderlich übersichtlicher. Wenn ich das verbessern wollte, würde ich wohl auf PDO mit prepare und bindParam umsteigen.

Mein Vorschlag:

public function analyzePingbacks () {
        try {
            $result = $this->query(...);
            mach;
            was;
            mit;
            result;
            oder
            $this->handleResult($result);
        } catch(Exception $ex) {
            mach;
            was;
            bei;
            fehler;
            oder
            $this->handleError($ex);
        } finally {
            ggf. aufräumarbeiten;
        }
    }

Interessant, das werde ich mal umzusetzen versuchen. Ich fürchte nur, ich habe letztlich überall nur try-catch-Strukturen, wenn ich das Error-Handler-Konzept durch das Exceptions ersetze. Sowas soll natürlich auch nicht herauskommen:

try {  
   a();  
   try {  
      b();  
      try {  
         c();  
      } catch () {}  
   } catch () {}  
} catch () {}

Das ist ja gerade die Crux bei aufeinander aufbauenden Abläufen.

Mathias