Защита происходит от использования связанных параметров, а не от использования подготовленного оператора
Означает, что недостаточно просто использовать prepare (), но держать запрос свсе переменные в нем примерно такие:
$sql = $db->prepare("SELECT * FROM employees WHERE name ='$name'");
$sql->execute();
$rows = $sql->fetchAll();
Кто-то, кто сказал, что это означает, что хотя вы технически используете здесь подготовленное утверждение, вы не привязываете переменные к нему.Таким образом, запрос все равно становится уязвимым.
Чтобы быть защищенным, необходимо заменить все переменные в запросе заполнителями, а затем связать эти переменные:
$sql = $db->prepare("SELECT * FROM employees WHERE name = ?");
$sql->bindParam(1, $name);
$sql->execute();
$rows = $sql->fetchAll();
Но PDOимеет приятное сокращение для привязки, позволяющее вам избежать повторяющихся вызовов pindParam (), выполняющих все эти вызовы внутри себя, когда вы отправляете переменные в execute ():
$sql = $db->prepare('SELECT * FROM employees WHERE name = ?');
$sql->execute(array($name));
$rows = $sql->fetchAll();
По сути, это такое же связывание, какbindParam () делает. Таким образом, ваш код использует привязку и поэтому безопасен
Наконец, bind_param () на самом деле является функцией mysqli и вообще не имеет ничего общего с PDO.