Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[PHP] serverübergreifendes datenbankgestütztes array
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #1
[PHP] serverübergreifendes datenbankgestütztes array
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->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 :D das wären dann eben auch 1000 queries, das kann man ja aber noch optimieren, wenn mans braucht ;D

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
06.09.2009 15:50
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #2
[PHP] serverübergreifendes datenbankgestütztes array
ArrayAccess kanntest du nicht? Gibt auch noch andere lustige Interfaces, für Iteratoren oder zählbare Objekte, enorm praktisch für eigene Datenstrukturen. Aber auch enorm gefährlich, prinzipiell verstecken derartige Templates nur Komplexität.

In deinem Fall würd ich sogar empfehlen Iterator und Coutable ebenfalls zu implementieren, dann kann man auch foreach() und count() drüberjagen.
06.09.2009 16:24
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #3
[PHP] serverübergreifendes datenbankgestütztes array
nope, dass es die vorgefertigten interfaces gibt wusst ich nicht.
aber was soll daran konkret gefährlich sein? wegen der performance oder was?

die iterator und countable sollte ja nicht das problem sein, wenn ich die tage nochmal muse und zeit find, sollte das kein big deal sein!

ich frag mich nur grad, was passiert, wenn da jetzt nen count drüber jagt?

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
06.09.2009 16:47
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #4
[PHP] serverübergreifendes datenbankgestütztes array
ggeretsae schrieb:  wegen der performance oder was?
Ja - wenn der Programmierer nicht weiss, dass bei dem Array-Aufruf nen Shitload an Funktionen aufgerufen werden, kann sowas gerne mal in die Hose gehen.

Bei C++, wo die Idee ja von den PHP-Leuten geborgt wurde, findest du im Internet sicherlich ein paar Beiträge über Templates und wie man sich damit in den Fuss schiessen kann.
06.09.2009 16:52
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
ggeretsae Offline
Erfahrener Benutzer

Beiträge: 621
Registriert seit: Apr 2009
Beitrag #5
[PHP] serverübergreifendes datenbankgestütztes array
nuja, bei großen projekten ist das sicherlich relevant, aber für diese klasse kannste das kaum sagen. du weist ja genau was passiert und wenn du da quark baust isses nur gerecht, dass du dir innen fuss schiesst ;D

» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
06.09.2009 17:03
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chrisi1512 Offline
Benutzer

Beiträge: 104
Registriert seit: Sep 2009
Beitrag #6
[PHP] serverübergreifendes datenbankgestütztes array
Alt aber weiße: "Aus Fehlern lernt man!"

Chris
06.09.2009 20:26
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #7
[PHP] serverübergreifendes datenbankgestütztes array
chrisi1512 schrieb:  Alt aber weiße: "Aus Fehlern lernt man!"

Chris
Zusammenhang?
06.09.2009 20:28
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.217
Registriert seit: Jul 2008
Beitrag #8
[PHP] serverübergreifendes datenbankgestütztes array
gandro schrieb:  Zusammenhang?
Kein direkter, sieh dir seine IRC-Beiträge und anderen Beiträge an.

Erinnerst du dich an #whfclassics? Es ist zurück! In Pog-Form.
06.09.2009 20:30
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chrisi1512 Offline
Benutzer

Beiträge: 104
Registriert seit: Sep 2009
Beitrag #9
[PHP] serverübergreifendes datenbankgestütztes array
Da steht bislang nur Spam! Das wird sich dann aber hoffentlich noch ändern...

Der Spruch war auf den Post obendrüber gedacht. Werd das vlt überarbeiten sollte da Müll von mir geposted worden sein...

Chris
06.09.2009 20:49
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 7 Gast/Gäste