Здравствуйте! по началу запросы составлял так: Код (Text): $f_query = "INSERT INTO `articles` (`title`, `content`) VALUES ('%s', '%s')"; $query = sprintf($f_query, mysql_real_escape_string($title), mysql_real_escape_string($content)); mysql_query($query) or die(mysql_error()); после перехода на PDO, прочитал что при использовании подготовленных запросов, метод prepare сам проверяет запрос на SQL инъекции. Вопрос нужно ли все-таки в подготовленных запросах использовать mysql_real_escape_string? Сейчас написано так: Код (Text): $query = "INSERT INTO `articles` (`title`, `content`) VALUES ('$title', '$content')"; $stmt = self::$dbh->prepare($query); $stmt->execute();
Какой для вас смысл использовать метод prepare если вы им не препарируете? -) И да, prepare помогает предотвратить SQL-инъекций, избавляя от необходимости вручную экранировать параметры, но в вашем случае это работать не будет и ваш код подвержен SQL-инъекциям.
$res = $pdo->prepare("INSERT INTO `table` (`column1`, `column2`) VALUES value1, :value2)"); $res->bindParam(':value1', $var1, PDO:ARAM_STR); $res->bindParam(':value2', $var2, PDO:ARAM_INT); $res->execute(); в таком случае mysql_real_escape_string уже не нужен.
Биндить совсем не обязательно, это может сделать самостоятельно execute(), нужно только ему параметры сунуть.
То есть насколько я понял из документации если используешь execute() с параметрами, то константы типа PDO:ARAM_* не используются и все будет безопасно с точки зрения SQL-инъекций, также как и при использовании bindparam ? Код (Text): <?php /* Execute a prepared statement by passing an array of insert values */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->execute(array(':calories' => $calories, ':colour' => $colour)); ?>