Einzelnen Beitrag anzeigen
Alt 06.09.09, 17:05   #1 (permalink)
easteregg
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard datenbankgestütztes,serverübergreifendes array

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->md5($name);
          
$query str_replace("{name}",$this->t,$this->query);

          
$this->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->."'";
          
$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 ;)
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61