Datenbankzugriffe

< Die wichtigsten Klassen und Funktionen | Entwicklungs-HOWTO | HTML-Ausgaben erzeugen >

PDO

Stud.IP verwendet standardmäßig die MySQL-Datenbank. Um auf diese Datenbanken zuzugreifen wurde sowohl die Klasse DBManager angelegt und PDO benutzt. Alle Datenbankzugriffe in Stud.IP sollen ab jetzt direkt über PDO funktionieren. Im Quellcode bedeutet dies konkret, dass ein Datenbankzugriff so ähnlich aussieht:

$db = DBManager::get();
$result = $db->query("SELECT * FROM user_info WHERE Nachname = '".$name."'")->fetchAll();
foreach ($result as $nutzer) {
}

Der DBManager sorgt für die Verbindung zur Datenbank und PDO regelt also die Zugriffe, sobald das Verbindungsobjekt $db erst einmal initialisiert ist.

Weitere Infos zu PDO findet man unter php.net.

Mehr Beispiele und erweiterte Funktionalität findet man hier: StudipPDO

Slave-Zugriffe

Wenn man lesende Zugriffe hat, deren Korrektheit nicht 100% gewährleistet sein muss (autocompleter), kann man zur Steigerung der Performance auch den Slave ansprechen:

$db = DBManager::get("studip-slave");
$result = $db->query("SELECT * FROM user_info WHERE Nachname = '".$name."'")->fetchAll();
foreach ($result as $nutzer) {
}

Wenn die Installation keine Replikation verwendet, werden die Anfragen an den Slave automatisch auf den (einzigen) Master gerichtet.

SQL-Injections

Wichtig um SQL-Injections zu verhindern: Es gibt zwei Methoden, um eklige Datenbankhacks durch Einspeisen von bösem SQL-Code zuvor zu kommen. Das obige Beispiel ist im Grunde noch nicht geschützt.

1.) Wannimmer man eine potentiell gefährliche Variable in ein SQL-Statement einfügt, sollte die Variable über $db->quote($name) geschehen. Der Quellcode dazu sieht dann so aus:

$db = DBManager::get();
$result = $db->query("SELECT * FROM user_info WHERE Nachname = '".$db->quote($name)."'")->fetchAll();
foreach ($result as $nutzer) {
}

2.) Man sollte bei einem System wie Stud.IP immer auch auf die Performance achten. Dazu kann es sehr sinnvoll sein, häufig auftauchende Befehle über prepare vorzubereiten, damit die Datenbank ein- und denselben Befehl nicht jedes mal neu umsetzen muss.

$db = DBManager::get();
$preparation = $db->prepare("SELECT * FROM auth_user_md5 WHERE Nachname = :name", array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$preparation->execute(array('name' => $name));
$result = $preparation->fetchAll();
foreach ($result as $nutzer) {
}

Dies ist im Zweifelsfall die saubere Variante, weil sie der Datenbank das Leben erleichtert und zudem SQL-Injections automatisch verhindert.

Letzte Änderung am March 28, 2015, at 06:53 PM von anoack.