Gedankenquerbeet
Vor 3 Jahren

Umstieg auf PDO - Crashkurs

Gib mysql_ und mysqli_ keine Chance!

Im Netz kursieren noch unzählige Skripte, Anleitungen und Beiträge, in welchen der inzwischen längst veraltete prozedurale Stil mit mysql_ und mysqli_ verwendet wird. Aus diesem Grund verwenden und lernen vor allem PHP Neueinsteiger genau diesen Stil und stellen sich so mit der Zeit nur selbst ein Bein.

Was ist überhaupt PDO?

PDO ist eine objektorientierte Schnittstelle für den Zugriff und das Arbeiten mit Datenbanken. PDO ist konsequent. Es kann nur rein objektorientiert verwendet werden, kein Mischmasch möglich. Strukturierter. Übersichtlicher. Schöner. Und ab PHP 5 standardmäßig vorhanden.

Warum nicht mysql_?

Es mag sein, dass manche immer noch den prozeduralen Stil bevorzugen, aber warum man trotzdem PDO verwenden sollte, wird ganz schnell deutlich, wenn man sich folgendes Beispiel ansieht.

Insert Abfrage mit mysql_

mysql_query("INSERT INTO comment (commentID, userID, text, date) VALUES(".mysql_escape_string($commentID).", ".mysql_escape_string($userID).", '".mysql_escape_string($_POST['text'])."', ".time().")");

echo mysql_last_insert_id();

 

Selbe insert Abfrage mit PDO

$db = Database::getInstance();

$q = $db->prepare("INSERT INTO comment (commentID, userID, text, date) VALUES (?, ?, ?, ?)");
$q->bindValue(1, $commentID, PDO::PARAM_INT);
$q->bindValue(2, $userID, PDO::PARAM_INT);
$q->bindValue(3, $_POST['text'], PDO::PARAM_STR);
$q->bindValue(4, time(), PDO::PARAM_INT);
$q->execute();

// Resultierende ID dieser INSERT Abfrage
echo $db->lastInsertId();

 

Natürlich ist das ein einfaches Beispiel und der mysql_ Teil hätte auch noch etwas "schöner" sein können. Aber oft ist genau das dass Problem als Programmierer, dass man manchmal aus Faulheit oder weil es schnell gehen soll, die Sachen so hinschreibt. Und ja, die PDO Variante hat mehr Zeilen, aber sobald man sich etwas gewöhnt hat, ist es mit der Zeit sogar viel weniger Aufwand, als bei der mysql_ Variante.

 

Was passiert bei der PDO Variante? Ganz einfach erklärt.

 

Die Abfrage bleibt im Grunde die selbe, dass einzige was anders ist, sind die ?, welche einfach nur als Platzhalter für die Werte dienen. Später, wie oben zu sehen, werden mit bindValue diese Werten den Fragezeichen zugeordnet. Das escapen erledigt die bindValue Methode selbst. Neben der Angabe des Werts, muss man der Methode noch mitteilen ob es sich um eine Ganzzahl oder einen String handelt und welches Fragezeichen zu welchem Wert gehört. (1 = erstes Fragezeichen, 2 = zweites usw.)

 

Mit execute wird dann die Abfrage ausgeführt.

 

Die Vorteile

 

  • Keine ellenlangen Zeilen
  • Geringere Anfälligkeit auf Tippfehler oder das Vergessen von escape Zeichen => 'string'
  • Sicherer und um ein vielfaches schneller als mysql_
  • Man ist gezwungen sich an den Stil zu halten. Kein Mischmasch möglich.

 

Wer überzeugt ist und sein Projekt umschreiben oder in seinem nächsten Projekt PDO verwenden möchte, den könnte vielleicht diese einfache PDO PHP Klasse dabei weiterhelfen.

PDO PHP Datenbank Klasse

define("DB", "dbname");
define("DB_USERNAME", "dbusername");
define("DB_PASSWORD", "dbpassword123");

class Database extends PDO
{
	private static $instance = null;
	
	public function __construct()
	{
		$this->connect(DB, DB_USERNAME, DB_PASSWORD);
	}
	
	public function connect($db, $username, $password)
	{
		parent::__construct("mysql:host=localhost;dbname=$db;charset=utf8mb4", $username, $password);
		parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		parent::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
	}
	
	public static function getInstance()
	{
		if(self::$instance === null) 
		{
			self::$instance = new self;
		}

		return self::$instance;
	}

	private function __clone() {}
}

 

Mit dieser Klasse kann dann bequem und schnell über PDO auf die Datenbank zugegriffen werden, wie in dem obigen PDO Beispiel. Die Klasse erstellt lediglich eine statische Datenbank Instanz, die sich einmal in dem Skript mit der Datenbank verbindet. Werden dann die Funktionalitäten von PDO benötigt, muss einfach nur die statische Datenbank Instanz abgeholt werden.

 

$db = Database::getInstance();

 

Vielleicht ist noch ein SELECT Beispiel ganz interessant.

SELECT Beispiel

$db = Database::getInstance();

// Alle Benutzernamen, die ein a enthalten
$q = $db->prepare("SELECT username FROM user WHERE username LIKE ?");
$q->bindValue(1, "%a%", PDO::PARAM_STR);
$q->execute();

// Die Resultate durch iterieren
foreach($q->fetchAll(PDO::FETCH_ASSOC) as $row)
{
   echo $row['username'];
}

 

Mit $q->rowCount() erhält man übrigens auch die Anzahl der Resultate.

Eine Zeile erhalten

$q = $db->prepare("SELECT username FROM user WHERE userID = ?");
$q->bindValue(1, $userID, PDO::PARAM_INT);
$q->execute();

// Wenn der Benutzer mit der übergebenen userID existiert
if($q->rowCount() == 1)
{
   $row = $q->fetch(PDO::FETCH_ASSOC);
   echo $row['username'];
}

 

Und dass wars schon. Hoffentlich wurde etwas ersichtlich warum PDO auf jeden Fall verwendet werden sollte. Falls ich helfen konnte, würde ich mich sehr über ein Kommentar oder ein Klick auf "Gefällt mir" freuen. :)

Kommentar verfassen



Kommentare
uwiaququpapo - 14.05.2020 10:05
http://mewkid.net/when-is-regylia/ - Cialis <a href="http://mewkid.net/when-is-regylia/">Generic Cialis</a> sll.sxhs.gedankenquerbeet.de.wwd.ow http://mewkid.net/when-is-regylia/
Briliabeprife - 11.09.2020 11:11
slot games http://onlinecasinouse.com/# - play slots online free casino <a href="http://onlinecasinouse.com/# ">online casino real money </a> online gambling
Unterschiede mysql_ und PDO Auf PDO umsteigen PDO Crashkurs Schnell PDO benutzen