Über Project Five
_project -> Five ist ein ÜK-Projekt. Die Aufgabe lautet, per PHP mit Dateien zu interagieren. Dieser Blog ist aus dieser Aufgabe enstanden. Es handelt sich um ein Blog, welcher nicht auf Datenbanken zugreift, wie man das vielleicht vermuten würde, sondern auf Dateien, in denen alle Daten gespeichert sind.
Da ich bereits einige Jahre Erfahrung mit PHP und Datenbanken (mysql) habe, fand ich das eine leichte Aufgabe. Deshalb habe ich mir überlegt, ein schönes Design und Funktionalitäten, wie eine OOP Klasse "fileDB" einzubauen. Man kann zum Beispiel neue Benutzer hinzufügen oder bestehende Daten ändern.
Da ich ein Freund von OpenSource bin und mir diese Philosophie gefällt, möchte ich hier einen Teil des Codes zeigen. Am interessantesten ist dabei die Klasse, da ich zum ersten Mal mit einer Klasse in PHP gearbeitet habe.
class.php:
<?php
// scripted by Michael Tanner
// mit Hilfe von Claudio Götz
class fileDB {
// fileDB Klasse
// scripted by Michael Tanner
// Definition der benötigten Variabeln
// private, da man nicht unbedingt einen Zugriff haben muss
private $file = false; // String
private $newArray = array(); // Array
private $subArray = array(); // Array
private $aiID = false; // Int
private $rechte = array(1=>'Root', 2=>'Admin', 5=>'Moderator', 10=>'Benutzer');
// public, da ich das auch ausserhalb der class aufrufen möchte
public $data = array();
// Ende der Definition
public function __construct($requestedFile) {
// construction Funktion
$this->file = $requestedFile;
$this->loadFile();
}
// Inhalt der Datei wird mit Hilfe von unserialize() in Arrays geladen
private function loadFile() {
// Wenn die Datei nicht exisitert, wird sie erstellt werden
if(!file_exists($this->file)) file_put_contents($this->file, $this->data);
// Lese Inhalt nach $data
$this->data = unserialize(base64_decode(convert_uudecode(base64_decode(file_get_contents($this->file)))));
// Auto Increment Integer neu zählen
$this->aid();
}
// Auto Increment Integer zählen
private function aid() {
$row = false; // Instanzieren von Variable row
if(!is_array($this->data)) { // wenns kein Array ist
$this->aiID = 1;
return false;
}
foreach($this->data as $zuweisung => $row) {
// die aktuelleID ist am Schluss die vom letzten Element
$aktuelleID = $zuweisung;
}
$ai_int = $aktuelleID + 1; // eins dazugezählt, da es fürs
// nächste Element ja die nächste Zahl braucht
// vorsetzen des nächstkorrekten Integers
$this->aiID = $ai_int;
}
// Hinzufügen eines neuen Datensatzes ins Array
public function mkLine($input = '') {
if($input == false) return false; // Abbruch der Funktion wenn Inhalt sowieso leer ist
// Konvertierung eines Strings in ein Array, damit sauberes Abspeichern gegeben ist
if(is_array($input)) $this->data[$this->aiID] = $input;
else $this->data[$this->aiID] = array($input);
// Auto Increment Integer neu zählen
$this->aid();
}
// Löschen einer bestimmten Zeile des Datensatzes
public function rmLine($lineInt = '', $range = '') {
if($lineInt == false) return false; // Abbruch der Funktion wenn Inhalt sowieso leer ist
// Überprüfung, ob Input auch wirklich eine Zahl ist
if(!is_int($lineInt)) return false;
// Löschen des angefragten Eintrages
if($range == false) unset($this->data[$lineInt]);
else {
$max = $this->aiID - 1;
if($range > $max) $range = $max;
// Löschen eines ganzen Ranges von Einträgen
for($i = $lineInt; $i <= $range; $i++) {
unset($this->data[$i]);
}
}
// Auto Increment Integer neu zählen
$this->aid();
return true;
}
// Updaten einer Datenreihe -> ganzes Replace davon
public function rpLine($updateID = '', $inputArray = '') {
if(empty($updateID) or empty($inputArray)) return false;
// Zu einem Array machen, wenns nur ein String ist
if(is_array($inputArray) == false) $update = array($inputArray);
else $update = $inputArray;
// Überprüfung, ob der neue Wert gleich viele Arrayelemente hat
// nur dann wärs ein gültiges Update
if(count($update) != count($this->data[$updateID])) return false;
$this->data[$updateID] = $update;
}
// Updaten eines einzigen Satzes in der Reihe -> Einzelnes Replace der Values
public function updateValue($rowID = '', $elementID = '', $newValue = '') {
if(empty($rowID) or empty($elementID) or empty($newValue)) return false;
$calced = $elementID - 1;
// Aktualisierung eines Wertes
if($this->data[$rowID] == false) return false;
if($this->data[$rowID][$calced] == false) return false;
$this->data[$rowID][$calced] = $newValue;
}
// Auslesen von nur einem Arrayelement oder auch Wert, wenn gewünscht
public function getLine($lineID, $valueInt = '') {
if(intval($lineID) == 0) return false;
// Rückgabe des Arrays der gewünschten Datenreihe
if($this->data[$lineID] == true) {
$realInt = $valueInt - 1;
if($valueInt >= 1) return $this->data[$lineID][$realInt];
else return $this->data[$lineID];
}
}
// temporäres Sortieren unabhängig der $data Variable
public function numSort() {
$newArray = array();
// Zur Sicherheit in ein neues Array füllen
foreach($this->data as $key => $element) {
$newArray[$key] = $element;
}
// Sortieren
arsort($newArray);
foreach($newArray as $assign => $subarr) {
$newArrayIDs[] = $assign;
}
return $newArrayIDs;
}
// generieren einer Tabelle zur benutzerfreundlichen Ansicht
public function mkTable($options = '', $excludeString = '', $specialUser = '', $userRight = '') {
$row = 0;
$daten = $this->data;
if($excludeString == true) {
$excludeArray = explode(',', $excludeString);
}
$return = '<table>';
foreach($daten as $assign => $row) {
$return .= '<tr>';
foreach($row as $key => $col) {
if(!in_array($key, $excludeArray)) {
$return .= '<td>';
if($specialUser == true and $key == 3) $return .= $this->rechte[$col];
else $return .= $col;
$return .= '</td>';
}
}
if($options == true) {
$return .= '<td>';
if($specialUser == true and $key == 3 and $col >= $userRight) $return .= '<a href="?p5=verwaltung&editUser='.intval($assign).'"><img src="view/img/edit.png" alt="Bearbeiten" /></a> ';
if($specialUser == true) {
if($specialUser == true and $key == 3 and $col >= $userRight) $return .= '<a href="?p5=verwaltung&pwUser='.intval($assign).'"><img src="view/img/lock.png" alt="Passwort ändern" /></a> ';
}
if($specialUser == true and $key == 3 and $col >= $userRight) $return .= '<a href="?p5=verwaltung&delUser='.intval($assign).'"><img src="view/img/del.png" alt="Löschen" /></a>';
$return .= '</td>';
}
$return .= '</tr>';
}
$return .= '</table>';
return $return;
}
// Finden von einem String
public function find($searchFor) {
$pattern = '/^'.$searchFor.'/';
$foundCol = false;
foreach($this->data as $assignKey => $row) {
foreach($row as $key => $col) {
preg_match($pattern, $col, $matches);
if(count($matches) >= 1 and $foundCol == false) $foundCol[] = array($assignKey, $key);
}
}
return $foundCol;
}
// Speichern des Datenarrays
public function save() {
if(file_put_contents($this->file, base64_encode(convert_uuencode(base64_encode(serialize($this->data)))))) return true;
else return false;
}
}
?>
functions.php:
<?php
// scripted by Michael Tanner
// verschiedene Functions kommen hier herein
function get($var) { // XSS Prevention
if(!isset($_GET[$var])) return false;
$toClean = $_GET[$var];
$cleaned = trim($toClean);
$cleaned = strip_tags($cleaned);
$cleaned = htmlentities($cleaned);
return $cleaned;
}
function post($var) { // XSS Prevention
if(!isset($_POST[$var])) return false;
$toClean = $_POST[$var];
$cleaned = trim($toClean);
return $cleaned;
}
?>