Allgemein PHP Snippets Tipps und Tricks Tutorials

[PHP][TUTORIAL] Sinnvolle Nutzung von Datenobjekten

Guten Abend 🙂

Nachdem ich mich jetzt länger mit Objektorientierter Programmierung(Datenobjekten etc.) in PHP beschäftigt habe,
habe ich nun dazu ein Tutorial geschrieben.

Was beinhaltet dieses Tutorial?

Was sind Datenobjekte und wozu nutzt man sie?

Datenobjekte sind, wie der Name schon sagt, Objekte in denen Daten gespeichert, verwaltet und geladen werden können.
Das Anwendungsgebiet von Datenobjekten ist vielfältig, darum gehe ich in diesem Tutorial „nur“ auf das Nutzen in Kombination mit MySQL-Datenbanken ein.

Vor- und Nachteile von Datenobjekten

Vorteile

Einfache Nutzung

Wenn man die Klassen von Datenobjekten sauber und schlau programmiert, bieten Datenobjekte schnellen und einfachen Zugriff auf Informationen.

Sicherheit & Fehlerquellen

Gerade wenn man Datenbanken benutzt muss man auf Mögliche Gefahrenstellen achten und sie absichern, beispielsweise gegen SQL-Injection.
Dadurch dass in Datenobjekten überwiegend Getter und Setter vorhanden sind, kann man optimal Sicherheit gewährleisten und Fehlerquellen super ab sichern.

Nachteil(e) 🙂

Viel zu schreiben…

Wenn man größere oder aufwendigere Objekte hat, hat man eine Menge Schreibarbeit vor sich, allerdings lohnt es sich, allein schon wegen der Sicherheit, mit Datenobjekten zu arbeiten.

Tutorial

Als Beispiel nehme ich heute ein Datenobjekt welches das verwalten von Benutzern ermöglicht.
Nehmen wir an, wir haben eine Benutzertabelle Users welche die Felder ID, username, passwort und email behinhaltet.

Die Klasse beginnen

Nun erstellen wir eine Klasse user und legen für jedes Datenbankfeld eine protected-Klassenvariable fest und erstellen den Konstruktor mit dem optionalen Übergabeparameter $ID der den Standartwert false hat.
Im Konstruktor setzen wir die Klassenvariable $ID auf den Wert des Übergabeparameters $ID:

<?php
	/**
	* Benutzerklasse
	*/
	class User
	{
		protected $ID;
		protected $username;
		protected $passwort;
		protected $email;
 
		function __construct($ID = false)
		{
			$this->ID = $ID;
		}
	}
?>

Warum benutzen wir den Übergabeparamter $ID? Ganz einfach, die Variable $ID wird später in der Load-Methode gebraucht, dazu aber gleich mehr.

Getter und Setter

Als nächstes erstellen wir die Getter und Setter der Klassenvariablen:

<?php
	/**
	 * Getter / Setter
	 */
	function getID()
	{
		return $this->ID;
	}
	function setID($ID)
	{
		$this->ID = $ID;
	}
	function getUsername()
	{
		return $this->username;
	}
	function setUsername($username)
	{
		$this->username = $username;
	}
	function getPasswort()
	{
		return $this->passwort;
	}
	function setPasswort($passwort)
	{
		$this->passwort = $passwort;
	}
	function getEmail()
	{
		return $this->email;
	}
	function setEmail($email)
	{
		$this->email = $email;
	}
?>

existUser()

Ok, jetzt haben wir die Minimalanforderungen der user-Klasse. Als nächstes ziehen wir die Datenbank ran um unseren User zu „beleben“ 😀
Dafür brauchen wir erst einmal die Methode existUser() um später einfach prüfen zu können ob ein User bereits existiert:

<?php
	function existUser()
	{
		// Prüfe ob überhaupt eine ID festgelegt ist
		if(self::getID() !== false)
		{
			/**
			 * Es ist eine ID festgelegt.
			 * Nun prüfen wir ob es in der Datenbank einen User mit dieser ID gibt 
			 */
			$query = "SELECT * FROM users WHERE id='".self::getID()."' LIMIT 1";
			$query = mysql_query($query);
			return mysql_num_rows($query) > 0 ? true : false;
		}
		return false;
	}
?>

loadUser()

Als nächstes wollen wir die loadUser()-Methode schreiben:

<?php
	function loadUser()
	{
		// Prüfe ob der Benutzer existiert
		if(self::existUser())
		{
			// Und lade ggf. die Daten
			$query = "SELECT * FROM users WHERE id='".self::getID()."' LIMIT 1";
			$query = mysql_query($query);
			$obj = mysql_fetch_object($query);
 
			// Setze die Klassenvariablen
			self::setUsername($obj->username);
			self::setPasswort($obj->passwort);
			self::setEmail($obj->email);
			return $query ? true : false;
		}
		return false;
	}
?>

saveUser()

Nun brauchen wir noch eine saveUser()-Methode welche den User speichert und bei der Neuanlage des Users die ID des Objektes festlegt:

<?php
	function saveUser()
	{
		// Prüfen ob User bereits existiert
		$exist = self::existUser();
 
		// Falls Ja mache ein Update ansonsten ein Insert Into
		$query = $exist ? 'UPDATE ' : 'INSERT INTO ';
 
		// Baue Query zusammen
		$sql[] = "`username`='".mysql_real_escape_string(self::getUsername())."'";
		$sql[] = "`passwort`='".mysql_real_escape_string(self::getPasswort())."'";
		$sql[] = "`email`='".mysql_real_escape_string(self::getEmail())."'";
		$query .= " users SET ".implode(",", $sql);
		$query .= $exist ? " WHERE id='".self::getID()."'" : '';
 
		// Führe Query aus
		$query = mysql_query($query);
 
		// Falls ein Insert Into gemacht wird lege nun die ID des Objektes fest
		if(!$exist)
		{
			self::setID(mysql_insert_id());
		}
		return $query ? true : false;
	}
?>

deleteUser()

So, jetzt können wir schonmal einen User anlegen, bearbeiten und speichern. Was jetzt noch fehlt ist die Löschfunktion:

<?php
	function deleteUser()
	{
		// Prüfen ob der User bereits existiert
		if(self::existUser())
		{
			// Baue Query zusammen und führe Abfrage aus...
			$query = "DELETE FROM users WHERE ID='".self::getID()."' LIMIT 1";
			$query = mysql_query($query);
 
			// ... und gib zurück ob die Abfrage erfolgreich war
			return $query ? true : false;
		}
		return false;
	}
?>

Nacharbeiten

Im Grunde ist dies jetzt ein voll Funktionsfähiges Datenobjekt. Allerdings sollten wir den Setter der Variable ID noch anpassen:

<?php
	function setID($ID)
	{
		// Die ID muss immer eine Zahl sein!
		$this->ID = intval($ID);
	}
?>

Kompletter Quellcode

Hier noch einmal der komplette Quellcode:

<?php
	/**
	* Benutzerklasse
	*/
	class User
	{
		protected $ID;
		protected $username;
		protected $passwort;
		protected $email;
 
		function __construct($ID = false)
		{
			$this->ID = $ID;
		}
 
		function existUser()
		{
			// Prüfe ob überhaupt eine ID festgelegt ist
			if(self::getID() !== false)
			{
				/**
				 * Es ist eine ID festgelegt.
				 * Nun prüfen wir ob es in der Datenbank einen User mit dieser ID gibt 
				 */
				$query = "SELECT * FROM users WHERE ID='".self::getID()."' LIMIT 1";
				$query = mysql_query($query);
				return mysql_num_rows($query) > 0 ? true : false;
			}
			return false;
		}
		function loadUser()
		{
			// Prüfe ob der Benutzer existiert
			if(self::existUser())
			{
				// Und lade ggf. die Daten
				$query = "SELECT * FROM users WHERE ID='".self::getID()."' LIMIT 1";
				$query = mysql_query($query);
				$obj = mysql_fetch_object($query);
 
				// Setze die Klassenvariablen
				self::setUsername($obj->username);
				self::setPasswort($obj->passwort);
				self::setEmail($obj->email);
				return $query ? true : false;
			}
			return false;
		}
		function saveUser()
		{
			// Prüfen ob der User bereits existiert
			$exist = self::existUser();
 
			// Falls Ja mache ein Update ansonsten ein Insert Into
			$query = $exist ? 'UPDATE ' : 'INSERT INTO ';
 
			// Baue Query zusammen
			$sql[] = "`username`='".mysql_real_escape_string(self::getUsername())."'";
			$sql[] = "`passwort`='".mysql_real_escape_string(self::getPasswort())."'";
			$sql[] = "`email`='".mysql_real_escape_string(self::getEmail())."'";
			$query .= " users SET ".implode(",", $sql);
			$query .= $exist ? " WHERE ID='".self::getID()."'" : '';
 
			// Führe Query aus
			$query = mysql_query($query);
 
			// Falls ein Insert Into gemacht wird lege nun die ID des Objektes fest
			if(!$exist)
			{
				self::setID(mysql_insert_id());
			}
			return $query ? true : false;
		}
 
		function deleteUser()
		{
			// Prüfen ob der User bereits existiert
			if(self::existUser())
			{
				// Baue Query zusammen und führe Abfrage aus...
				$query = "DELETE FROM users WHERE ID='".self::getID()."' LIMIT 1";
				$query = mysql_query($query);
 
				// ... und gib zurück ob die Abfrage erfolgreich war
				return $query ? true : false;
			}
			return false;
		}
		/**
		 * Getter / Setter
		 */
		function getID()
		{
			return $this->ID;
		}
		function setID($ID)
		{
			// Die ID muss immer eine Zahl sein!
			$this->ID = intval($ID);
		}
 
		function getUsername()
		{
			return $this->username;
		}
		function setUsername($username)
		{
			$this->username = $username;
		}
 
		function getPasswort()
		{
			return $this->passwort;
		}
		function setPasswort($passwort)
		{
			$this->passwort = $passwort;
		}
 
		function getEmail()
		{
			return $this->email;
		}
		function setEmail($email)
		{
			$this->email = $email;
		}
	}
?>

Funktionsbeispiel der Klasse

Hier einmal ein Beispiel wie man die Benutzerklasse verwenden kann:

<?php
 
	$config['DB']['HOST'] = 'localhost';
	$config['DB']['USER'] = '';
	$config['DB']['PASS'] = '';
	$config['DB']['NAME'] = '';
 
	mysql_connect($config['DB']['HOST'], $config['DB']['USER'], $config['DB']['PASS']);
	mysql_select_db($config['DB']['NAME']);
 
	// Initialisieren der Userklasse
	$Benutzer = new User();
 
	// Festlegen der Informationen des Benutzers
	$Benutzer->setUsername('Devtronic');
	$Benutzer->setPasswort('12335');
	$Benutzer->setEmail('admin@developer-heaven.de');
 
	// Speichern des Benutzers
	$Benutzer->saveUser();
 
	// Benutzerinformationen anzeigen
	echo "<h1>Benutzer Informationen</h1>";
	print_r($Benutzer);
 
	// BenutzerID auslesen
	$BenutzerID = $Benutzer->getID();
 
	// Benutzervariable löschen und neu deklarieren mit der ausgelesenen ID
	unset($Benutzer);
	$Benutzer = new User($BenutzerID);
 
	// Benutzer laden, Passwort ändern und wieder Speichern
	$Benutzer->loadUser();
	$Benutzer->setPasswort('12345');
	$Benutzer->saveUser();
 
	// Benutzerinformationen anzeigen
	echo "<h1>Aktualisierte Informationen</h1>";
	print_r($Benutzer);
?>

Nachwort

Ich hoffe ich habe es einiger maßen verständlich erklärt.
Bitte Bewertet doch dieses Tutorial mit einem Klick auf die Sternebewertung unter dem Post, oder schreibt einfach ein Kommentar 🙂

Den Beispielcode könnt ihr auch hier herunterladen:

  Benutzer Datenobjekt Beispiel (1,7 KiB, 627 hits)

Schöne Grüße,
Julian

Willst du mehr solcher Tutorials?

Loading ... Loading ...


657x gelesen

Print Friendly, PDF & Email

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.