Путаница между bindValue() и bindParam()?


Я путаю эти две функции Bindvalue() и BindParam()

  1. Я читаю дальше php.net он не экранирует % и _, поэтому будьте осторожны при использовании LIKE. Поэтому я думаю, что BindValue() не используется, когда мы используем запрос LIKE.
  2. когда мы используем LIKE, используется запрос BindParam(). Потому что, как я знаю, bindParam может избежать этих % и _.
  3. BindValue() не обеспечивает защиту от внедрения sql. Я не уверен в этом, это правда?

Друзья рассказывают, что я упоминание в этих 3 пунктах является правильным или неправильным. я новичок в PDO, поэтому, пожалуйста, объясните это четко..

Author: Adrian Cid Almaguer, 2013-01-19

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.

 51
Author: deceze, 2013-01-19 10:37:04

Ну, ты все неправильно понял.

Bindvalue() и BindParam() равны в любом случае, за исключением типа аргумента.

  • Bindvalue() связывает только значение, это похоже на печатную копию.
  • bindParam() связывает переменную, и когда переменная была изменена, привязанное значение также будет изменено.

Оба они не избегают % и _, что не имеет большого значения. Такое ускользание влияет только на надежность возвращаемых результатов, а не на что бы то ни было "инъекции".

 5
Author: Your Common Sense, 2013-10-17 11:23:31