mysqli oder PDO – Unterschiede beim prepare Statement

      0
mysqli vs. PDO: Prepare-Statements

Ich hatte gestern das erste Mal mit mysqli zu tun und war verwundert, dass sich die Verwendung, zumindest beim Prepare-Statement, doch sehr von der von PDO unterscheidet. Ich dachte immer die beiden Technologien seien komplett gleich auf. Zugegebenermaßen habe ich mich da aber auch nie weiter mit beschäftigt, da wir auf der Arbeit eigentlich alle PDO verwenden, auch in Bezug auf symfony2.

PDO

Bei PDO gibt es so gesehen vier Möglichkeiten ein Prepare-Statement auszuführen.

1. Als numerisches Array

$statement = $connection->prepare("INSERT INTO table_foo (id, title, active) VALUES (?, ?, ?));
$statement->execute(array($id, $title, $isActive));

2. Als assoziatives Array

$statement = $connection->prepare(
    "INSERT INTO table_foo (id, title, active) VALUES (:id, :title, :isActive)
);
$statement->execute(array(
    ':id' => $id,
    ':title' => $title,
    ':isActive' => $isActive,
));

In diesen beiden Fällen werden alle Parameter als String übergeben.
Wenn ihr den Datentyp dazu angeben wollt, könnt ihr folgende Notation verwenden:

3. Einzelne unbenannte Parameter

$statement = $connection->prepare("INSERT INTO table_foo (id, title, active) VALUES (?, ?, ?));
$statement->bindValue(1, $id, PDO::PARAM_INT);
$statement->bindValue(2, $title, PDO::PARAM_STR);
$statement->bindValue(3, $isActive, PDO::PARAM_BOOL);
$statement->execute();

4. Einzelne benannte Parameter

$statement = $connection->prepare("INSERT INTO table_foo (id, title, active) VALUES (:id, :title, :isActive));
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->bindValue(':title', $title, PDO::PARAM_STR);
$statement->bindValue(':isActive', $isActive, PDO::PARAM_BOOL);
$statement->execute();

mysqli

Nun schauen wir uns das Ganze bei mysqli an.
Dort gibt es keine Benennung der übergebenen Parameter. Die Datentypen werden in einem String als erster Parameter übergeben. „s“ steht dabei für String, „i“ für Integer etc.
Das Prepare Statement sähe also folgendermaßen aus:

$statement = $connection->prepare("INSERT INTO table_foo (id, title, active) VALUES (?, ?, ?));
$statement->bind_param("isi", $id, $title, $isActive);
$statement->execute();

Der Vorteil gegenüber der 4. Möglichkeit bei PDO ist, dass nur eine Zeile für bindValue() benötigt wird. Allerdings finde ich die Variante mit mysqli weniger lesbar. Wer noch nie mit mysqli zu tun hatte, wird über den String „isi“, der wie gesagt für die einzelnen Datentypen steht, stolpern und zuerst denken, dass dies der Wert für die Spalte „id“ wäre. Dann fällt auf, dass in diesem Falle aber ein Parameter zu viel übergeben werden würde, da es ja nur drei Fragezeichen im SQL-String sind.

Fazit

Ich bevorzuge daher definitiv die PDO Variante Nummer zwei, da auch bei vielen Parameter sofort ersichtlich ist, um was für Werte es sich handelt. Natürlich ist es letztlich aber jedem selbst überlassen, welche Technologie man verwenden möchte.

Schreibe einen Kommentar

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