Зачем нам нужно указывать тип параметра в bindParam ()?

Я немного путаюсь, почему нам нужно указать тип данных, которые мы передаем в функции bindParam () в PDO в Php. Например, этот запрос:

$calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindParam(1, $calories, PDO::PARAM_INT); $sth->bindParam(2, $colour, PDO::PARAM_STR, 12); $sth->execute(); 

Существует ли риск безопасности, если я не укажу третий параметр. Я имею в виду, если я просто делаю в bindParam ():

 $sth->bindParam(1, $calories); $sth->bindParam(2, $colour); 

Использование bindParam() с типами можно считать более безопасным, поскольку оно позволяет более строго проверять, дополнительно предотвращая инъекции SQL. Тем не менее, я бы не сказал, что существует реальная угроза безопасности, если вы этого не делаете, поскольку это скорее тот факт, что вы делаете подготовленное заявление , защищающее от инъекций SQL, чем проверка типов. Более простой способ добиться этого – просто передать массив функции execute() вместо использования bindParam() , например:

 $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 )); 

Вы не обязаны использовать словарь, вы также можете сделать это так же, как и с вопросительными знаками, а затем поместить его в том же порядке в массиве. Однако, даже если это работает отлично, я рекомендую использовать привычку использовать первый, так как этот метод является беспорядком, когда вы достигаете определенного количества параметров. Для того, чтобы быть полным, вот что это выглядит:

 $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->execute(array($calories, $colour)); 

Если вы не укажете тип, по умолчанию параметр будет привязан как строка. Затем вы можете получить запрос, эквивалентный:

 SELECT foo FROM bar WHERE baz = '42' 

Это может быть или не быть проблемой. Так же, как PHP и другие языки программирования, базы данных имеют типы и правила для литья между типами. MySQL, как правило, неявно бросает числовые строки в числа по мере необходимости. Некоторые базы данных более строгие, чем другие, требующие правильного типа для определенных операций. В большинстве случаев это мало чем отличается. Но если вам действительно нужно передать 42 как 42 а не '42' , вам нужно явно привязать его как INT .