Du har rätt i att det första fallet är osäkert. Det är dock viktigt att förstå att att förbereda en sats bara har värde om du använder variabel data och/eller kör samma fråga upprepade gånger. Om du kör vanliga satser utan variabler , kan du helt enkelt göra så här:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
Och sluta med en PDOStatement
objekt att arbeta med, precis som när du använder PDO::exec()
.
I ditt andra fall har du återigen i stort sett rätt. Vad som händer är att variabeln som skickas till databasen escapes och citeras (om du inte anger annat med det tredje argumentet till PDOStatement::bindParam()
, den skickas som en sträng vilket är bra i de flesta fall.) Så, frågan kommer inte att "misslyckas" om dålig data skickas. Det beter sig precis som om du hade passerat ett giltigt nummer som inte fanns som ett ID i databasen. Det finns naturligtvis några kantfodral
där du fortfarande är sårbar även med ett korrekt utarbetat uttalande.
För att göra livet enklare kan du också använda förberedda uttalanden som detta, för att göra implicit bindning:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
Eller till och med så här, med icke-namngivna parametrar:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
Naturligtvis har det mesta av detta förklarats i kommentarerna medan jag skrev in svaret!