Crashkurs MySQLi
Die MySQL Improved Extension (MySQLi) ermöglicht es ab PHP 5 auf MySQL-Datenbanken zuzugreifen. Neben MySQLi existiert in PHP noch die PHP Data Objects (PDO). Aufgrund der größeren Flexibilität empfiehlt sich unserer Meinung nach die Verwendung von PDO. Eine umfangreiche Einführung in MySQL und PDO erhaltet ihr in unserem MySQL Tutorial. Einen kompakten Crashkurs zu PDO existiert im Artikel Crashkurs PDO.
Inhaltsverzeichnis
Verbindung aufbauen
Eine Verbindung zur Datenbank kann wie folgt aufgebaut werden:
1 2 3 4 5 6 |
<?php $mysqli = new mysqli("localhost", "user", "password", "database"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } ?> |
SQL Query an Datenbank senden
Zum Senden von Queries an die Datenbank wird die Methode query($sql) verwendet:
1 2 3 4 5 6 7 8 9 |
<?php $mysqli = new mysqli("localhost", "user", "password", "database"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } $sql = "UPDATE tabelle SET spalte = 'Wert' WHERE id = 1"; $mysqli->query($sql); ?> |
Prepared Statements
Prepared Statements sind MySQLi sehr umständlich umzusetzen, erheblich umständlicher als in PDO. Ein Beispiel sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $mysqli = new mysqli("localhost", "user", "Password", "database"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } $sql = "UPDATE user SET email = ?, passwort = ? WHERE id = ?"; $statement = $mysqli->prepare($sql); $statement->bind_param('ssi', $email, $passwort, $id); //Variablen Werte zuweisen $id= 1; $passwort = "neues passwort"; $statement->execute(); ?> |
Mittels bind_param() Werten die Parameter im SQL-Query mit den Variablen verbunden. Das erste Argument von bind_param(), im obigen Beispiel mit dem Wert ssi sind die Typen der Parameter. ssi gibt an, dass wir drei Parameter im Query haben, den ersten mit dem Typ string, den zweiten vom Typ string und den dritten vom Typ integer. Für Fließkommazahlen existiert noch der Wert d.
Nachdem die Variablen mit den Parametern verbunden wurden, wird diesen der entsprechende Wert zugewiesen und mittels $statement->execute() wird der Prepared Statement an die Datenbank gesendet.
Im Vergleich zu PDO ist dies doch deutlich komplizierter.
Datensätze abrufen
Zum Abrufen und Ausgeben von Datensätzen existieren die Methoden $result->fetch_assoc() und $result->fetch_object()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $mysqli = new mysqli("localhost", "user", "password", "database"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } $id = 100; $sql = "SELECT * FROM tabelle WHERE id < ?"; $statement = $mysqli->prepare($sql); $statement->bind_param('i', $id); $statement->execute(); $result = $statement->get_result(); while($row = $result->fetch_object()) { echo $row->spaltenname; } //Alternativ mit fetch_assoc(): while($row = $result->fetch_assoc()) { echo $row['spaltenname']; } ?> |
Anzahl der Zeilen
Um die Anzahl der betroffenen Zeilen von UPDATE, DELETE oder INSERT-Anweisungen zu erhalten, existiert das Feld $statement->affected_rows .
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $mysqli = new mysqli("localhost", "root", "", "php-einfach"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } //Prepared statement mit INSERT/DELETE/UPDATE-Anweisung für $statement $statement->execute(); $count = $statement->affected_rows; echo $count; ?> |
Um die Anzahl der Zeilen einer SELECT-Anweisung zu erhalten, existiert das Feld $result->num_rows
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $mysqli = new mysqli("localhost", "root", "", "php-einfach"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } //Prepared statement mit SELECT-Anweisung für $statement $statement->execute(); $result = $statement->get_result(); $count = $result->num_rows; echo $count; ?> |
Eingefügte ID
Um die vergebene ID für ein Auto Increment-Feld zu erhalten, existiert das Feld $statement->insert_id:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $mysqli = new mysqli("localhost", "user", "password", "database"); if ($mysqli->connect_errno) { die("Verbindung fehlgeschlagen: " . $mysqli->connect_error); } $sql = "INSERT INTO user (email, passwort) VALUES (?,?)"; $statement = $mysqli->prepare($sql); $statement->bind_param('ss', $email, $pw); $pw = "testPW"; $statement->execute(); $new_id = $statement->insert_id; echo $new_id; ?> |
MySQL Fehlermeldung
Sollte ein Query fehlschlagen, so erhalten wir die Fehlermeldung in dem Feld $statement->error:
1 2 3 4 5 6 |
<?php //Prepared statement in $statement if(!$statement->execute()) { echo "Query fehlgeschlagen: ".$statement->error; } ?> |
Autor: Nils Reimers