Du har ret i, at den første sag er usikker. Det er dog vigtigt at forstå, at forberedelse af en sætning kun har værdi, hvis du bruger variable data og/eller udfører den samme forespørgsel gentagne gange. Hvis du udfører almindelige sætninger uden variable , kan du blot gøre dette:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
Og ender med en PDOStatement
objekt at arbejde med, ligesom når du bruger PDO::exec()
.
I dit andet tilfælde har du igen stort set ret. Det, der sker, er, at den variabel, der sendes til databasen, escapes og citeres (medmindre du angiver andet med det tredje argument til PDOStatement::bindParam()
, den sendes som en streng, hvilket er fint i de fleste tilfælde.) Så forespørgslen vil ikke "fejle", hvis der sendes dårlige data. Det opfører sig præcis, som om du havde bestået et gyldigt nummer, der ikke fandtes som et ID i databasen. Der er selvfølgelig nogle kantsager
hvor du stadig er sårbar selv med en korrekt udarbejdet erklæring.
For at gøre livet lettere kan du også bruge forberedte udsagn som denne, til at gøre implicit binding:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
Eller endda sådan her, med ikke-navngivne parametre:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
Naturligvis er det meste af dette blevet forklaret i kommentarerne, mens jeg skrev svaret!