2013-02-20 5 views
1

У меня возникает вопрос, почему одиночная кавычка должна использоваться в двойной кавычки при подготовке инструкции insert. Мое понимание переменной, двойные кавычки будут интерпретироваться. переменная с одинарными кавычками не будет интерпретироваться.Одиночные кавычки PHP в двойной кавычки

$var1 = 5; print "$var1"; //output value 5 
$var2 = 'jason'; print '$var2'; //output $var2 

Я не уверен, почему одинарные кавычки используются в разделе значений в приведенном ниже коде. Пожалуйста, объясните мне. Благодаря!

$first_name = $_POST['first_name']; 
$first_name = trim($first_name); 
$last_name = $_POST['last_name']; 

$stmt = $con->prepare("insert into reg_data (first_name, last_name) 
         values('$first_name', '$last_name')"); 
+2

Потому что иначе MySQL будет ошибкой, если бы он не был числом, поскольку вы не разбираете значения в '' '' s. Это будет похоже на создание такой строки PHP: '$ myvar = mytext', и это не сработает. Обратите внимание, что вы готовитесь неправильно и по-прежнему очень уязвимы для инъекций SQL. – h2ooooooo

+0

Вы искали stackoverflow? http://stackoverflow.com/questions/3446216/difference-between-single-quote-and-double-quote-string-in-php – xblitz

+0

Вы не должны использовать одинарные кавычки. Вы должны использовать заполнители и связанные переменные. Как бы то ни было, вы вставляете строки ввода пользователя в свой SQL и подвергаете себя атакам SQL Injection. – Quentin

ответ

4

Ваше использование кавычек верно, но вы неправильно используете подготовленные инструкции - ваш код уязвим для SQL injection! Вместо этого используйте заполнители (без кавычек) в запросе, и передать фактические значения позже, как в the example:

$first_name = $_POST['first_name']; 
$first_name = trim($first_name); 
$last_name = $_POST['last_name']; 

$stmt = $con->prepare("insert into reg_data (first_name, last_name) 
         values(:first_name, :last_name)"); 
$stmt->execute(array(':first_name' => $first_name, ':last_name' => $last_name)); 
+2

Предполагается, что $ con является PDO или подобным объектом. – Chris

+0

@Chris Поскольку 'prepare' - это имя функции PDO, а' $ stmt' - это общее имя переменной для объектов PDOStatement, я думаю, что это безопасно. – phihag

+1

Вы не можете предположить, что MySQLi также имеет метод 'prepare', который не поддерживает имена заполнителей. Я также видел, как люди создают свои собственные классы баз данных, которые имеют метод 'prepare', который далек от совместимости с PDO. – h00ligan

1

ПОЧЕМУ: Одиночные кавычки используются, чтобы получить окончательный запрос как:

insert into reg_data (first_name, last_name) values('Bogdan', 'Burim')

Вообще плохая идея.

SQL-инъекция возможна.

2

Одиночные кавычки буквально одиночные кавычки для SQL. SQL становится:

insert into reg_data (first_name, last_name) values('bob', 'bobowitz')

Буквенные значения в SQL должны быть окружены в одинарные кавычки.

0

Одиночные кавычки являются разделителями для оператора SQL и не имеют ничего общего с PHP. Они сообщают MySQL, где начинается значение для поля и где оно останавливается.

Рассмотрим это:

SELECT * FROM mytable WHERE field=new order by name desc 

Если запрос ограничить, где field = «новый порядок по названию по алфавиту» или он должен ограничивать где field = «новый», а затем упорядочить результаты по полю «имя» в в порядке убывания?

Кавычки сделать что явным:

SELECT * FROM mytable WHERE field='new order by name desc' 

Кроме: это причина, вы должны избежать ваших ценностей в MySQL. Если пользователь ' OR 1 = 1; -- в поле вашего имени пользователя, и ваш запрос для аутентификации:

SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']' 

Вы в конечном итоге с:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd' 

Который действует SQL и выбрать всех пользователей в вашей таблице (потому что вход с $_POST['username'] сделал остальную часть запроса закомментирована Однако, если вы правильно избежать значения, вы в конечном итоге с:.

SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd' 

Это означает, MySQL будет искать пользователя с username = \' OR 1 = 1 -- и подходящим паролем.Вы можете избежать простого mysqli_real_escape_string, однако PDO и параметризованные запросы всегда рекомендуются.

Я настоятельно рекомендую вам ознакомиться с некоторыми учебниками по PDO, параметрам и SQL-инъекции перед работой с базой данных в любом веб-приложении. Вы поблагодарите себя позже.

0

Ребята, которые изложили свои ответы, очень техничны и могут дать очень конкретный ответ, как использование одиночных кавычек в запросе будет приглашать SQL-инъекцию. Но когда вы спросили, что , почему вы должны использовать одинарную кавычку в запросе, я попытаюсь объяснить вам пример.

запросы со статическими значениями:

insert into reg_data (first_name,last_name)values('fn_value','ln_value'); 

вы не можете удалить отдельные цитаты из раздела значения, как если вы сделаете это, вы получите ошибку MySQL в качестве значения являются строками. поэтому для вставки строкового значения в db с переменными вы должны поместить эти переменные в одинарные кавычки, а также для предотвращения ошибки mysql.

Смежные вопросы