MySQL Query не вставляется, когда переменная PHP содержит одинарные кавычки - PullRequest
0 голосов
/ 13 февраля 2012

Этот запрос не вставляется, когда переменная $ subject содержит одинарные кавычки. Есть ли возможное решение?

mysql_query("INSERT INTO  table  (to_email_id,subject) values('$to','$subject');");

Ответы [ 7 ]

7 голосов
/ 13 февраля 2012

Рассмотрите возможность использования параметризованных запросов с использованием, например, PDO .

Альтернативно, заключите переменные в скобки {}.

Редактировать:

Я пропустил, что ваша переменная $subject содержит одинарные кавычки.Это означает, что вы должны избежать их.(См. Множество других ответов и mysql_real_escape_string() об этом.) Но, как вы можете видеть, одинарные кавычки внутри переменной - это именно то, как работают инъекционные атаки.Экранирование их помогает предотвратить такие проблемы, а также позволяет вашему запросу сохранить ожидаемые данные.

Ни один ответ об атаках с использованием инъекций не будет полным без ссылки на Таблицы Бобби .

3 голосов
/ 13 февраля 2012

Ваш запрос будет возвращать ошибку 1064, которая является синтаксической ошибкой в ​​вашем запросе.Это происходит потому, что переменные, в частности $ subject, в случае вопроса изменяют формат вашей вложенной строки.Например, предположим, что у нас есть

$subject = "fire's hotter than it looks";

Когда это будет оценено в вашем запросе, ваша строка запроса будет

INSERT INTO  table  (to_email_id,subject) 
     VALUES('the value of the to variable','fire's hotter than it looks');

Если вы посмотрите на второй элемент в значениях, который былесли вы используете $ subject, вы заметите, что теперь у вас есть неравномерное число апострофов, что означает конец вашего запроса ');Открытая строка\ ').говорит mysql интерпретировать их как строковые символы вместо разделителей строк запроса.

3 голосов
/ 13 февраля 2012

Выход из параметров*

2 голосов
/ 13 февраля 2012

Вам нужно использовать mysql_real_escape_string() для ваших значений $to и $subject

Также, если вы не делали этого до того, как открылись для инъекций SQL

1 голос
/ 13 февраля 2012

Ваш запрос имеет большую "дыру" -> SQL-инъекция. Вы должны прочитать больше об этом здесь: http://en.wikipedia.org/wiki/SQL_injection, а также здесь http://php.net/manual/en/function.mysql-real-escape-string.php

Чтобы сделать короткий ответ, вы должны «экранировать» значения, передаваемые в mysql. Лучший способ сделать это - использовать функцию mysql_real_escape_string.

$query = sprintf("mysql_query("INSERT INTO  table  (to_email_id,subject) values('%s', '%s');", mysql_real_escape_string($to),mysql_real_escape_string($subject));
mysql_query($query);

Надеюсь, это поможет вам.

1 голос
/ 13 февраля 2012

ИСПОЛЬЗОВАНИЕ

mysql_real_escape_string

0 голосов
/ 08 февраля 2015

, если вы используете

(все книги доступны) как $ subject, и вы пытаетесь вставить в mysql

используйте это

$disc_str = addslashes($subject);

"INSERT INTO Значение имени таблицы (субъекта) ('$ disc_str')";

у меня это работает в Textarea с tinymce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...