Путаница между bindValue() и bindParam()?
Я путаю эти две функции Bindvalue()
и BindParam()
- Я читаю дальше php.net он не экранирует
%
и_
, поэтому будьте осторожны при использованииLIKE
. Поэтому я думаю, чтоBindValue()
не используется, когда мы используем запрос LIKE. - когда мы используем
LIKE
, используется запросBindParam()
. Потому что, как я знаю, bindParam может избежать этих%
и_
. -
BindValue()
не обеспечивает защиту от внедрения sql. Я не уверен в этом, это правда?
Друзья рассказывают, что я упоминание в этих 3 пунктах является правильным или неправильным. я новичок в PDO, поэтому, пожалуйста, объясните это четко..
2 answers
Не должно быть никакой разницы в том, как значения экранируются или не экранируются. bindParam
отличается от bindValue
тем, что он ссылается на переменную, связывая значение только при выполнении инструкции. bindValue
немедленно принимает значение . Для иллюстрации:
$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');
$foo = 'foo';
$stmt->bindValue(':foo', $foo);
$foo = 'bar';
$stmt->execute();
Описанное выше выполняется следующим образом SELECT * FROM table WHERE foo = 'foo'
;
$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');
$foo = 'foo';
$stmt->bindParam(':foo', $foo);
$foo = 'bar';
$stmt->execute()
Описанное выше выполняется следующим образом SELECT * FROM table WHERE foo = 'bar'
.
Это правда, что ни один из них не заботится о _
или %
как о специальных символах, потому что, вообще говоря, они не являются особенными символы в том, что касается синтаксиса, и драйвер базы данных не может проанализировать контекст, чтобы выяснить, имеете ли вы в виду %
быть подстановочным знаком или фактическим символом "%" в контексте запроса LIKE
.
Оба защищают от внедрения SQL.
Ну, ты все неправильно понял.
Bindvalue()
и BindParam()
равны в любом случае, за исключением типа аргумента.
- Bindvalue() связывает только значение, это похоже на печатную копию.
- bindParam() связывает переменную, и когда переменная была изменена, привязанное значение также будет изменено.
Оба они не избегают % и _, что не имеет большого значения. Такое ускользание влияет только на надежность возвращаемых результатов, а не на что бы то ни было "инъекции".