Ich hat in einem Anflug langer weile etwas in den phpdocs rumgelesen und bin auf das ArrayAccess Interface gestoßen. Bisschen rumgelesen und dann kam mir ne praktische Idee, was man damit umsetzen kann. Eben ein datenbankgestützt array, was ich von zwei gänzlich getrennten webserver einfach ansteuern kann. damit sind geschichte wie zb ein projektübergreifendes sessionsystem schnell gebaut und umgesetzt. sicherlich wäre da noch etwas feintuning an der klasse von nöten, zb dass man mit tablelocks oder transaktionen arbeitet. auch wäre es bestimmt sinvoll, nicht für jedes set die datenbank einzeln zu penetrieren.
aber für eben mal fix geschrieben fand ich es recht praktisch und wollte das ganze mit euch teilen ;)
hier der code:
PHP-Code:
<?php
class WWA implements arrayaccess {
private $u = "";
private $d = "";
private $p = "";
private $h = "db.kosmos";
private $c = null;
private $t = null;
private $query = "CREATE TABLE `wwa`.`{name}` (`value` VARCHAR( 40 ) NOT NULL ,`data` BLOB NOT NULL ,UNIQUE (`value`)) ENGINE = MYISAM";
public function __construct($name) {
if (empty($name)) {
die("no array name specified");
}
$this->t = md5($name);
$query = str_replace("{name}",$this->t,$this->query);
$this->c = mysql_connect($this->h,$this->u,$this->p);
mysql_select_db($this->d);
$sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->d."' AND table_name = '" . $this->t ."'";
$res = mysql_query($sql);
if (mysql_num_rows($res) == 0) {
mysql_query($query);
}
}
public function __destruct() {
mysql_close($this->c);
}
public function offsetExists($value) {
$value = sha1($value);
$sql = "SELECT value FROM {$this->t} WHERE value = '{$value}'";
$res = mysql_query($sql);
if (mysql_error()) die(mysql_error());
if (mysql_num_rows($res) == 0) {
return false;
}
return true;
}
public function offsetSet($value,$data) {
$sql = "REPLACE INTO {$this->t} (`value`,`data`) VALUES ('". sha1($value) ."','". base64_encode($data) ."')";
mysql_query($sql);
}
public function offsetGet($value) {
$sql = "SELECT data FROM {$this->t} WHERE value='". sha1($value) ."'";
$res = mysql_query($sql);
if (mysql_num_rows($res) == 1) {
return base64_decode(mysql_result($res,0,"data"));
}
return false;
}
public function offsetUnset($value) {
mysql_query("DELETE FROM {$this->t} WHERE `value` = '".sha1($value)."'");
}
public function destroy() {
mysql_query("DROP TABLE `{$this->t}`");
}
}
?>
genutzt wird das ganze dann wie folgt:
PHP-Code:
$arrayname = new WWA("arrayname");
$arrayname["value"] = "läuft";
echo $arrayname["value"];
// zum löschen aus der db
$arrayname->destroy();
man sollte in der derzeitigen fassung es allerdings vermeiden, da ne riesige schleife draufzulegen, dass man da eben 1000 einträge reinschreibt das wären dann eben auch 1000 queries, das kann man ja aber noch optimieren, wenn mans braucht ;D
für meinungen über sinn und unsinn und/oder codeverbesserungen bin ich offen ;)