Máte pravdu, že první případ je nejistý. Je však důležité pochopit, že příprava příkazu má hodnotu pouze v případě, že používáte proměnná data a/nebo opakovaně provádíte stejný dotaz. Pokud provádíte prosté příkazy bez proměnných , můžete jednoduše udělat toto:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
A skončit s PDOStatement
objekt, se kterým chcete pracovat, stejně jako když používáte PDO::exec()
.
Ve vašem druhém případě máte opět z velké části pravdu. Co se děje, je proměnná předaná do databáze escapována a uvedena do uvozovek (pokud neurčíte jinak s třetím argumentem PDOStatement::bindParam()
, je odeslán jako řetězec, což je ve většině případů v pořádku.) Dotaz tedy "neselže", pokud jsou odeslána špatná data. Chová se přesně tak, jako byste předali platné číslo, které jako ID v databázi neexistuje. Existují samozřejmě některé okrajové případy
kde jste stále zranitelní i se správně připraveným prohlášením.
Také, abyste si usnadnili život, můžete použít připravené příkazy, jako je tento, k provedení implicitní vazby:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
Nebo dokonce takto, s nepojmenovanými parametry:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
Přirozeně, většina z toho byla vysvětlena v komentářích, když jsem psal odpověď!