dedlfix: MySQL Loginsystem

Beitrag lesen

Hi!

Da ich nicht wusste, wie ich aus Arrays mehrere Funktionsparameter für sprintf() mache, habe ich das ganze etwas anders realisiert.

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

Auf jeden Fall müsste nach meiner Version vor dem vsprintf()-Aufruf noch das Array durchlaufen werden und je nach Typ eine entsprechende Behandlung erfolgen.

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.

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.

Auch weiß ich nicht, wie ich bei Exceptions irgendwo den Fehler "hinlogge".

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.)

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. (Das widerspricht auch nicht dem YAGNI, denn es kommt ja nichts "Überflüssiges" hinzu sondern das Vorhandene wird nur zukunftssicher platziert.)

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.

Wahrscheinlich könnte man die Einstellungen auch anders handhaben, aber das wirst du mir sicher wieder mitteilen.

Kein Einwand meinerseits.

Lo!