Как вставить специальные символы в базу данных? - PullRequest
16 голосов
/ 06 апреля 2010

Может кто-нибудь сказать мне, как вставить специальные символы в базу данных MySQL? Я сделал PHP-скрипт, который предназначен для вставки некоторых слов в базу данных, хотя, если слово содержит ', оно не будет вставлено.

Я могу нормально вставлять специальные символы при использовании PHPmyAdmin, но он просто не работает при вставке их через PHP. Может ли быть так, что PHP превращает специальные символы во что-то еще? Если так, есть ли способ заставить их вставлять правильно?

Ответы [ 11 ]

27 голосов
/ 06 апреля 2010
$insert_data = mysql_real_escape_string($input_data);

Предполагая, что у вас есть данные, хранящиеся как $input_data

9 голосов
/ 06 апреля 2010

Ты убегаешь? Попробуйте функцию mysql_real_escape_string (), и она будет обрабатывать специальные символы.

6 голосов
/ 06 апреля 2010

использовать mysql_real_escape_string

Так что же делает mysql_real_escape_string ?

Эта функция библиотеки PHP добавляет обратную косую черту к следующим символам: \ n, \ r, \, \ x00, \ x1a, ‘и«. Важной частью является то, что одинарные и двойные кавычки экранированы, потому что именно эти персонажи чаще всего открывают уязвимости.

Пожалуйста, сообщите о sql_injection. Вы можете использовать эту ссылку в качестве начала

5 голосов
/ 06 апреля 2010

Возможно, вы вставляете их прямо в запрос. Вместо этого вы должны «экранировать» их, используя функцию-член - mysql_real_escape_string , mysqli_real_escape_string или PDO :: quote в зависимости от используемого расширения.

5 голосов
/ 06 апреля 2010

Скорее всего, вы экранируете строку SQL, например:

SELECT * FROM `table` WHERE `column` = 'Here's a syntax error!'

Вам необходимо экранировать кавычки, например:

SELECT * FROM `table` WHERE `column` = 'Here\'s a syntax error!'

mysql_real_escape_string() обрабатывает это для вас.

3 голосов
/ 06 апреля 2010

Обратите внимание, что, как отмечали другие, mysql_real_escape_string () решит проблему (как и добавление косой черты), однако вы всегда должны использовать mysql_real_escape_string () по соображениям безопасности - учтите:

SELECT * FROM valid_users WHERE username='$user' AND password='$password'

Что если браузер отправит

user="admin' OR (user=''"
password="') AND ''='"

Запрос становится:

SELECT * FROM valid_users 
WHERE username='admin' OR (user='' AND password='') AND ''=''

т.е. проверки безопасности полностью обойдены.

С

2 голосов
/ 06 апреля 2010

Вероятно, "mysql_real_escape_string()" будет работать для вас

0 голосов
/ 21 августа 2018

Функция htmlspecialchars - лучшее решение для товарищей. Сегодня я искал, как вставить строки со специальными символами, и Google бросил так много списков Stackoverflow. Ни один из них не дал мне решения. Я нашел это на странице w3schools. Да, я мог бы решить мою проблему с помощью этой функции следующим образом:

$abc = $POST['xyz'];

$abc = htmlspecialchars($abc);
0 голосов
/ 16 апреля 2018

Например:
$ parent_category_name = Мужская одежда
Рассмотрим здесь SQL-запрос

$sql_category_name = "SELECT c.*, cd.name, cd.category_id  as iid FROM ". DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = '" .  $this->db->escape($parent_category_name) . "' AND c.parent_id =0 "; 

Ошибка:

Static analysis:

1 errors were found during analysis.

Ending quote ' was expected. (near "" at position 198)
SQL query: Documentation

SELECT c.*, cd.name, cd.category_id as iid FROM oc_category c LEFT JOIN oc_category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = 'Men's Clothing' AND c.parent_id =0 LIMIT 0, 25

MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Clothing' AND c.parent_id =0 LIMIT 0, 25' at line 1

Попробуйте реализовать:

$this->db->escape($parent_category_name)

Вышеуказанный метод работает на платформе OpenCart. Найдите свой фреймворк и внедрите ИЛИ mysql_real_escape_string() в ядре PHP

Это станет мужской одеждой, т.е. в моем случае

$sql_category_name = "SELECT c.*, cd.name, cd.category_id  as iid FROM ". DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = '" .  $this->db->escape($parent_category_name) . "' AND c.parent_id =0 "; 

Таким образом, вы получите четкую картину запроса, реализовав escape () как

SELECT c.*, cd.name, cd.category_id as iid FROM oc_category c LEFT JOIN oc_category_description cd ON (c.category_id = cd.category_id) WHERE cd.name = 'Men\'s Clothing' AND c.parent_id =0
0 голосов
/ 16 июля 2016

Используйте это: htmlentities($_POST['field']);

Достаточно только. Это для специального символа:

Использовать для CI htmlentities($this->input->post('control_name'));

...