Sie haben Recht, dass der erste Fall unsicher ist. Es ist jedoch wichtig zu verstehen, dass das Vorbereiten einer Anweisung nur dann sinnvoll ist, wenn Sie variable Daten verwenden und/oder dieselbe Abfrage wiederholt ausführen. Wenn Sie einfache Anweisungen ohne Variablen ausführen , könnten Sie einfach Folgendes tun:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
Und enden mit einem PDOStatement
Objekt, mit dem gearbeitet werden soll, genau wie bei der Verwendung von PDO::exec()
.
Auch für Ihren zweiten Fall haben Sie weitgehend recht. Was passiert, ist, dass die an die Datenbank übergebene Variable maskiert und in Anführungszeichen gesetzt wird (es sei denn, Sie geben etwas anderes mit dem dritten Argument für PDOStatement::bindParam()
an , es wird als Zeichenfolge gesendet, was in den meisten Fällen in Ordnung ist.) Die Abfrage wird also nicht "fehlschlagen", wenn fehlerhafte Daten gesendet werden. Es verhält sich genau so, als ob Sie eine gültige Nummer übergeben hätten, die nicht als ID in der Datenbank existiert. Es gibt natürlich einige Grenzfälle
wo Sie auch mit einer korrekt erstellten Erklärung noch angreifbar sind.
Um das Leben einfacher zu machen, können Sie auch vorbereitete Anweisungen wie diese verwenden, um eine implizite Bindung durchzuführen:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
Oder sogar so, mit unbenannten Parametern:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
Natürlich wurde das meiste davon in den Kommentaren erklärt, während ich die Antwort eintippte!