Recent Changes - Search:

Hauptmenue (edit)

Php /

MysqlUrlWrapper

<< MagicQuotes | PhpSchnipsel | PasswortGenerator >>

Wofür das Ganze?

Manch einer wird sagen: "Oje, das gehört zu den Dingen, die die Welt nicht braucht!". Aber andere werden es faszinierend finden z.B. PHP Code in Datenbanken abzulegen und dann per include einzubinden. Dieser Wrapper funktioniert z.Z. mit folgenden Dateisystem Funktionen:

Es mag noch mit weiteren Funktionen klappen, ist aber ungetestet.

(noch) Nicht unterstützte Funktionen:

  • flock()
  • glob()

und viele mehr....

Voraussetzungen um den Wrapper betreiben zu können

Um diesen verwenden zu können, muß in der php.ini "allow_url_fopen" eingeschaltet sein. Auch, wie sollte es anders sein, muß die MysqlWrapper.php VOR der Verwendung per include eingebunden werden. Natürlich wird ein MySQL Server incl. Zugangsdaten benötigt. Auch eine Datenbank und darin eine Tabelle mit min. 2 Spalten. Dieser Wrapper ist für PHP4 geschrieben. Wenn man ihn mit PHP5 betreibt, können je nach "error_reporting" Einstellung "Strict Standards: var: Deprecated" Meldungen erscheinen. Ersetzen sie dann bitte alle "var" in der mysql_url_wrapper.php durch "private". Das sind wenige und die stehen ganz am Anfang der Datei, dann ist Ruhe!

Wie wird es gemacht?

include './MysqlWrapper.php';// einbinden erforderlich!!

$cachedir = realpath('./cache'); // zum Beispiel
define('MYSQLWRAPPER_CACHE_DIR',$cachedir); // optional
// wenn die Konstante MYSQLWRAPPER_CACHE_DIR definiert ist,
// sollte das Verzeichnis schon existieren
// wenn die Konstante nicht gesetzt ist, wird auch nicht gecached

MysqlWrapper::register();
// ab jetzt ist der Wrapper in PHP eingebunden
//und kann verwendet werden

So, Jetzt kanns los gehen!

Pfad Schema

Der Zugriff auf die Datenbank erfolgt nach folgendem Schema:
mysql://user:pass@server/db/tabelle/idspalte/codespalte/id

Einige Funktionen erwarten kürzere Pfadangaben:
opendir(),mkdir(): mysql://user:pass@server/db/tabelle/idspalte/codespalte
rmdir(): mysql://user:pass@server/db/tabelle

Url PartBedeutung
mysql://Dieses erzwing den Aufruf unseres Wrappers
userMySQL Username
passPasswort des MySQL Users
serverName des MySQL Servers
dbName der Datenbank
tabelleName der Tabelle in der unsere Codes stecken
idspalteName der Spalte anhand wir unseren Code identifizieren
codespalteName der Spalte, in der unser Code steckt
idDamit identifizieren wir unseren Code

Beispiele

Der folgende Beispielcode basiert auf der weiter unten stehende Tabellendefinition und den zugehörigen Testdaten.

$dir = "mysql://test:test@localhost/test/code_tabelle/phpid/phpcode/";
include $dir."echotest.php";

echo htmlentities(file_get_contents($dir."zweitertest.php"));

$fd = fopen($dir."drittertest.php",'w');
fwrite($fd,"<?php \n");
fwrite($fd,"echo __FILE__.'<br>' \n");
fwrite($fd,"?"."> \n");
fclose($fd);

require $dir."drittertest.php";

Der Cache

Die Verwendung des eingebauten Caches beschleunigt die Zugriffe um ca. 30% wenn der MySQL Server auf dem gleichen Rechner läuft. Mit einem externen Server dürfte der Performancegewinn deutlich höher ausfallen. Einige php.ini Einstellungen können die Verwendung des Caches verhindern, z.B. "save_mode". Der Cache wird NICHT automatisch bereinigt! Also nach dem Restore einer Datensicherung oder nach dem "händischen" rumfummeln an der Tabelle muß der Cache von Hand geleert werden.

MysqlWrapper::clear_cache();

Erledigt dieses aus einem PHP Script heraus. Natürlich muß die Klasse vorher geladen werden und auch die MYSQLWRAPPER_CACHE_DIR Konstante definiert sein!

PHP4 Workaround

Einige Funktionen stehen unter PHP4 über den Url-Wrapper nicht direkt zur Verfühgung. Bei PHP5 ist das Behoben. Das betrifft z.B.: unlink(), mkdir(), rmdir(), rename()

Es 2 Varianten, diesen Missstand zu umgehen:

// variante1 eine Instanz vom Wrapper erzeugen
$wrapper = @ new MysqlWrapper();
$wrapper->rmdir($dir);

// variante2 statisch aufrufen
MysqlWrapper::rmdir($dir);

Beide Methoden sind auch mit PHP5 anwendbar

Beispiel Tabellen Struktur:

# Datenbank: `test`
# Tabellenstruktur für Tabelle `code_tabelle`
CREATE TABLE `code_tabelle` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `phpid` varchar(255) NOT NULL DEFAULT '',
  `phpcode` text NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `phpid` (`phpid`)
) TYPE=MyISAM ;

Auf die id Spalte kann verzichtet werden. Die Benamungen der DB, Tabelle und Spalten ist frei wählbar, es sollte allerdings möglich sein, diese Namen, in Pfaden zu verwenden. Umlaute, Leerzeichen und sonstige Sonderzeichen können u.U. zu Schwierigkeiten führen. In diesem Beispiel wird Text als Datentype für die phpcode Spalte verwendet, das macht natürlich nur für Texte Sinn. Sollen Bilder oder andere Binärdaten gespeichert werden, dürfte Blob der richtige Type sein.

Beispieldaten:

INSERT INTO `code_tabelle` VALUES (1, 'echotest.php',
   '<?php\r\necho \'<br>Hello World<br>\';\r\n\r\n?>');
INSERT INTO `code_tabelle` VALUES (2, 'zweitertest.php',
   '<?php \necho \'Schreiben klappt<br>\' \n?> \n \r\n');
INSERT INTO `code_tabelle` VALUES (3, 'drittertest.php',
   '<?php \necho __FILE__.\'<br>\' \n?> \n');

Diese Beispieldaten dienen zum testen des Wrappers in Verbindung mit dem Php include() Befehl.

<< MagicQuotes | PhpSchnipsel | PasswortGenerator >>

Edit - History - Print - Recent Changes - Search
Page last modified on June 30, 2007, at 08:50 PM