Hallo,
damit hoffe ich, dass die Klasse dann so vorerst fertig ist:
<?php
class DBConnection
{
static private $db;
static private $settings;
const NOESCAPE=0;
const NUMBER=1;
const DECIMAL=2;
const LITERAL=3;
const IDENTIFIER=4;
static public function Init($host, $username, $passwd, $dbname, $port=3306)
{
self::$settings=array($host, $username, $passwd, $dbname, $port);
}
static public function query($sql, $values, $types, $resultmode=MYSQLI_STORE_RESULT)
{
if (!isset(self::$db)) self::connect();
for ($i=count($values); $i>=0; --$i)
{
if ($types[$i]==self::NUMBER)
{
$sql=str_replace('?'.$i, intval($values[$i]), $sql);
}
else if ($types[$i]==self::DECIMAL)
{
$sql=str_replace('?'.$i, floatval($values[$i]), $sql);
}
else if ($types[$i]==self::LITERAL)
{
$sql=str_replace('?'.$i, self::quote_expression($values[$i]), $sql);
}
else if ($types[$i]==self::IDENTIFIER)
{
$sql=str_replace('?'.$i, self::quote_identifier($values[$i]), $sql);
}
else
{
$sql=str_replace('?'.$i, $values[$i], $sql);
}
}
$sql=str_replace('??', '?', $sql);
return self::$db->query($sql, $resultmode);
}
static public function quote_identifier($value)
{
return '`'.str_replace('`', '``', &$value).'`';
}
static public function quote_expression($value)
{
return '\''.self::$db->real_escape_string(&$value).'\'';
}
static private function connect()
{
if (!isset(self::$settings)) throw new Exception('not initialized', 1);
self::$db=new MySQLi(self::$settings[0], self::$settings[1], self::$settings[2], self::$settings[3], self::$settings[4]);
if (self::$db->connect_error) throw new Exception('could not connect', 2);
}
}
?>
Ich würde mir aus der Sicht von query() da keine Gedanken weiter machen. Wenn jemand Mist eingibt, kann er nicht erwarten, das was Sinnvolles rauskommt, Hauptsache es entsteht keine Sicherheitslücke. Natürlich kann man sich mit einer Exception beschweren, aber was soll's? Wenn jemand die Eingangsdaten auf fachliche Plausibilität prüfen möchte/muss, dann soll er das vorher tun.
Gut, dann werde ich das so belassen.
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?
Ja, kannst du so lassen.
Habe ich so belassen.
Eigentlich meint ich damit, dass ich dem Administrator mitteile, dass etwas falsch ist. So ähnlich wie die Log-Dateien vom Apache.
Als Idee hätte ich im Angebot, mit den Konfigurationsdaten ein optionales Callback zu übergeben. Beim Feststellen eines Fehlers würde ich zuerst bei is_callable() vom Callback selbiges mit detaillierter Information aufrufen und dann die allgemeine Exception werfen. In der Callback-Funktion kann dann was auch immer zur Admin-Benachrichtigung stehen.
Das muss ich aber nicht implementieren, oder? Sonst würde ich das herauslassen. Ist einfacher ohne, denke ich. Wie sollte denn die Admin-Benachrichtigung ankommen? Einfach in eine Textdatei schreiben?
Ohne Lazy Connect musst du vorher wissen, ob wirklich eine DB-Verbindung gebraucht wird. Kann man so machen. [...]
Habe ich jetzt auch erstmal so gelassen.
Wenn die Verbindung da ist, wunderbar, rausgeben und fertig. Konfigdatencheck brauchen wir nur, wenn sie erst noch aufgebaut werden muss.
Dito. Auch versucht zu übernehmen.
Noch eine letzte Frage: Würde es hier Sinn machen, die Klassen, die ich für mein(e) System(e) erstelle, in einen Namensraum zu packen, oder sollte ich sie einfach global lassen?
Schönen Nachmittag
Rachus