sql >> Databáze >  >> RDS >> Mysql

Porozumění připraveným prohlášením CHOP a závazným parametrům

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ěď!




  1. MySQL vrací pouze jeden řádek

  2. Co je literál Null Character v TSQL?

  3. Jak přeskočit řádky, které porušují omezení při vkládání dat do SQLite

  4. Rozšíření mysql je zastaralé a bude v budoucnu odstraněno:použijte místo něj mysqli nebo PDO