Rachus: MySQL Loginsystem

Beitrag lesen

Hallo,

Die umständliche Variante: call_user_func_array(). Die einfache Variante: vsprintf().

komisch, dass ich sowas immer nicht finde.

Ein query()-Aufruf kann nun so aussehen:
DBConnection::query("SELECT foo FROM bar WHERE bar.foo=?0 AND bar.x=?1", array($_POST['id'], $_POST['name']), array(DBConnection::NUMBER, DBConnection::LITERAL));

Das ist unsicher wenn du nicht garantieren kannst, dass beispielsweise $_POST['id'] wirklich eine Zahl ist. Üblicherweise ist nämlich alles in den EGPCS-Variablen vom Typ String.

Warum das? Ich parse das doch per intval() als Zahl. Wenn das tatsächlich ein String ohne Zahl als erstes Zeichen einlese, dann wird 0 zurückgegeben. Ist damit ein Problem verbunden? Sollte ich dann wohl auch eine Exception werfen, wenn das eigentlich numerisch erwartete Argument nicht numerisch ist?

Was dann bleibt, ist den Unterschied zwischen String und Identifier festzustellen. Ich würde das mit unterschiedlichen Platzhaltern realisieren, zum Beispiel: ?ziffer und ?!ziffer. Jedenfalls so, dass ? weiterhin als Platzhaltereinleitung steht, alle anderen Zeichen sind mehr oder weniger schon als normaler Operator verbraucht.

Dann würde ich aber vsprintf() nicht mehr verwenden können, da der das ganze ja anders handhabt. Damit wäre wohl meine Bearbeitung des Queries korrekt?

Die Exception-Klasse hat schon von sich aus einige Eigenschaften. Im einfachsten Fall kannst du den Text in $message ablegen. Du kannst aber auch die Klasse beerben und eigene Eigenschaften hinzufügen. (Selbst unbeerbt ginge das, PHP legt schließlich alles an, was noch nicht da ist.)

Eigentlich meint ich damit, dass ich dem Administrator mitteile, dass etwas falsch ist. So ähnlich wie die Log-Dateien vom Apache.

static public function query($sql, $values, $types, $resultmode=MYSQLI\_STORE\_RESULT)  
{  
  if (!isset(self::$settings)) throw new Exception('not initialized', 1);  
  if (!isset(self::$db))  
  {  
  	if (!self::connect()) throw new Exception('could not connect', 2);  
  }  

Das würde ich beschränken auf ein self::connect(); und alles andere dort unterbringen. Denn wenn du mal weiterdenkst für später eventuell hinzukommende Methoden, die eine Verbindung brauchen, dann brauchst du dieses Handling genauso, und Copy&Paste-Programmierung ist Mist.

Okay, wird so gemacht. Hatte ich auch erst vor, wusste aber nicht wie eine Exception bei tieferen Funktionsaufrufverschachtelungen reagiert.

Die query() muss einfach nur dafür Sorge tragen, dass die Verbindung besteht. Wie das geschieht und was dafür alles notwendig ist (Konfigdaten) ist nicht ihr Bier, darum kann sich die connect() kümmern.

Dazu würde mich auch noch einmal interessieren, warum das eigentlich per "Lazy Connect" stattfinden soll. Wenn die Init() aufgerufen wird, dürfte doch eigentlich klar sein, dass früher oder später eine DB-Verbindung benötigt wird. Warum dann nicht also gleich die Verbindung aufbauen und später dafür sich nicht mehr darum kümmern müssen?

Schönen Sonntag

Rachus