(edit)
Unwichtige Korrekturen ausblenden - Änderungen im Wiki Quelltext
(:redirect 'http://docs.studip.de/develop/Entwickler/HowToDB':)
(:redirect 'http://docs.studip.de/develop/Entwickler/HowtoDB':)
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.
Stud.IP verwendet standardmäßig die MySQL-Datenbank.
Bitte nur noch PDO benutzen!
TODO
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:
$results = DBManager::get()->query(SQL)->fetchAll(PDO:FETCH_ASSOC); @]
$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.
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.
< Orientierung in der Datenbank | Entwicklungs-HOWTO | HTML-Ausgaben erzeugen >
$db = DBManager::get(); $results = $db->query(SQL)->fetchAll(PDO:FETCH_ASSOC); @]
Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei studip/lib/phplib_local.inc.php befindet. Diese muss nicht explizit eingebunden werden. DB_Seminar ist abgeleitet von DB_Sql (studip/lib/phplib/db_mysql.inc).
Die Klasse DB_Seminar enthält Methoden zur Kommunikation mit einer MySQL-Datenbank. Hierfür erzeugt man eine Instanz der Klasse und übergibt als Parameter die MySQL-Abfrage, woraufhin, falls noch nicht vorhanden, eine Verbindung zur Datenbank erzeugt wird. Nachdem die Abfrage erfolgreich ausgeführt wurde, stehen verschiedene Methoden zum Abruf der Daten zur Verfügung.
Es gibt unterschiedliche Möglichkeiten, die von der Datenbank erhaltenen Daten auszulesen.
(:source lang=php:)[@ $sql =& new DB_Seminar('SELECT * FROM tabelle');
while ($sql->next_record()) {
echo _($sql->Record['spalte']); echo _($sql->Record[0]); echo _('<br />');
}
$results = DBManager::get()->query(SQL)->fetchAll(PDO:FETCH_ASSOC);
$results = $db->query(SQL)->fetchAll(PDO:FETCH_ASSOC)
$results = $db->query(SQL)->fetchAll(PDO:FETCH_ASSOC);
{-Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei studip/lib/phplib_local.inc.php befindet. Diese muss nicht explizit eingebunden werden. DB_Seminar ist abgeleitet von DB_Sql (studip/lib/phplib/db_mysql.inc).-}
$db = DBManager::get(); $results = $db->query(SQL)->fetchAll(PDO:FETCH_ASSOC)
{-* DB_Seminar::Record: Die Eigenschaft ist ein Array und enthält die aktuelle Zeile des Datensatzes, der aus der MySQL-Tabelle ausgelesen wurde. Die Daten sind sowohl in der Standardform als auch der assoziativen Variante hinterlegt.
{-* DB_Seminar::next_record(): Die Methode schreibt den Datensatz in die Eigenschaft DB_Seminar::Record und inkrementiert die Zeilenzahl DB_Seminar::Row mit jedem Aufruf um eins. So lange noch Daten vorhanden sind, gibt die Methode true zurück, ansonsten false.
Es gibt unterschiedliche Möglichkeiten, die von der Datenbank erhaltenen Daten auszulesen.-}
DB_Seminar ist abgeleitet von DB_Sql (studip/lib/phplib/db_mysql.inc).
DB_Seminar ist abgeleitet von DB_Sql (studip/lib/phplib/db_mysql.inc).-}
@]-}
@]
Stud.IP verwendet standardmäßig die MySQL-Datenbank. Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei studip/lib/phplib_local.inc.php befindet. Diese muss nicht explizit eingebunden werden.
{-Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei studip/lib/phplib_local.inc.php befindet. Diese muss nicht explizit eingebunden werden.
Stud.IP verwendet standardmäßig die MySQL-Datenbank. Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei \textit{studip/lib/phplib_local.inc.php} befindet. Diese muss nicht explizit eingebunden werden.
Stud.IP verwendet standardmäßig die MySQL-Datenbank. Um Transaktionen mit der Datenbank durchzuführen, stellt Stud.IP eine eigene Bibliothek (DB_Seminar) mit Funktionen dafür bereit, die sich in der Datei \textit{studip/lib/phplib_local.inc.php} befindet. Diese muss nicht explizit eingebunden werden. DB_Seminar ist abgeleitet von DB_Sql (studip/lib/phplib/db_mysql.inc).
$sql =& new DB_Seminar('SELECT * FROM tabelle'); while ($sql->next_record()) { echo _($sql->Record['spalte']); echo _($sql->Record[0]); echo _('<br />'); }
Quelle: Basis-Wiki-Hilfe | Letzte Änderung: 01.04.2011 23:02 Uhr, tthelen | Local view: Basis-Hilfe