ich hat grad lange weile und was lustiges entdeckt. das arrayaccess interface! damit bissl rumgespielt, kurz drüber gelesen und mal eben was fix zusammen gebastelt.
herraus gekommen ist nen codeschnipsel, was halt ein normalen arrayumgang wie gewohnt in php erlaubt und das ganze eben in einer db gespeichert wird.
damit sind geschichten möglich, das zwei getrennte webserver über eine datenbank permanent den selben array inhalt zur verfügung haben. das könnte man zb für ein projektübergreifendes sessionsystem gebrauchen. dazu müsste man sicherlich das ganze noch etwas ausbauen, mit table lock arbeiten und sone kleinigkeiten. vielleicht interessierts ja den einen oder anderen!
hier mal der fix geschriebene 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