Я немного путаюсь, почему нам нужно указать тип данных, которые мы передаем в функции 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
.