Mysql + php со специальными символами, такими как '(Апостроф) и "(Кавычка) - PullRequest
10 голосов
/ 11 января 2011

Некоторое время я боролся с небольшой проблемой. Это было там в течение многих лет, но это была просто раздражающая и не серьезная проблема, и я только что обошел ее. Но теперь я хочу выяснить, может ли кто-нибудь мне помочь. Я поработал с Google, но безуспешно.

Если я сделаю пост в форме из текстовой области html в php-файле следующим образом:

<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>

и, конечно, есть кнопка отправки и т. Д.

Значение является проблемой: <a href="http://google.com">google's site</a> Значение текстовой области имеет как "(кавычка), так и '(Апостроф).

Чтобы сохранить это в базе данных mysql, я делаю это:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());

А теперь я получаю сообщение об ошибке:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'site' 'в строке 1

Ответы [ 7 ]

19 голосов
/ 11 января 2011

Ваша строка sql будет:

INSERT INTO `table` (`row1`) VALUES ('google's site')

Что не является действительным утверждением. Как написала Нанн, по крайней мере, экранируйте строку с помощью mysql_real_escape_string: http://php.net/manual/en/function.mysql-real-escape-string.php

И почитай про sql впрыск http://en.wikipedia.org/wiki/SQL_injection

Подумайте немного: если кто-то публикует это: $_POST['text'] со значением: ');delete from table;....

Вы можете попрощаться со своими данными:)

Всегда фильтровать / экранировать ввод!

РЕДАКТИРОВАТЬ: Начиная с PHP 5.5.0 mysql_real_escape_string и расширение mysql устарели. Пожалуйста, используйте вместо этого расширение mysqli и функцию mysqli :: escape_string

9 голосов
/ 11 января 2011

Всегда, по крайней мере, используйте mysql_real_escape_string при добавлении пользовательских значений в базу данных.Вы должны посмотреть параметры привязки или mysqli, чтобы ваш запрос стал:

INSERT INTO `table` (`row1`) VALUES (?)

И?будет заменено фактическим значением после очистки входных данных.

В вашем случае используйте:

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());

Читайте об SQL-инъекции.Это стоит делать как можно скорее!

3 голосов
/ 11 января 2011
2 голосов
/ 26 сентября 2012

вы можете использовать функцию addlashes ().Это цитата строки с косой чертой.так что это будет очень полезно для вас, когда вы добавляете апостроф в свое поле.

$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
1 голос
/ 11 января 2011

вместо использования старых функций mysql *, используйте PDO и пишите параметризованные запросы - http://php.net/pdo

0 голосов
/ 31 мая 2019

Просто используйте готовые операторы, и вам не придется беспокоиться об экранировании или внедрении SQL.

$con = <"Your database connection">;
$input = "What's up?";
$stmt = $con->prepare("insert into `tablename` (`field`)values(?)");
$stmt->bind_param("s",$input);
$stmt->execute();
0 голосов
/ 09 октября 2015

Я также боролся за символы, когда обновлял данные в mysql.

Но я наконец-то пришел к лучшему ответу: Вот:

$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm

И когда вы собираетесьобновите базу данных, система не обновит ее, если вы не используете MySQL REAL Escape String.Здесь:

$lastname = mysql_real_escape_string($_POST["lastname"]);  // This Works Always.

Тогда ваш запрос обязательно обновится.

Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.

Для получения дополнительной информации, пожалуйста, проверьте MYSQL_REAL_ESCAPE_STRING

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

...