Как вставить специальные символы в базу данных?

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

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


person Joey Morani    schedule 06.04.2010    source источник
comment
Можете ли вы просто вставить часть кода, в которую обрабатывается и вставляется партикулярная переменная?   -  person OM The Eternity    schedule 06.04.2010


Ответы (12)


$insert_data = mysql_real_escape_string($input_data);

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

person Anthony    schedule 06.04.2010
comment
Это научит меня не писать простой однострочный пример. - person zaf; 06.04.2010
comment
Я знаю! Я чуть не удалил свой ответ, когда увидел, что ты меня опередил. - person Anthony; 06.04.2010
comment
Эта функция считается устаревшей, начиная с PHP 5.5. Вместо нее следует использовать mysqli_real_escape_string. - person ssergei; 07.07.2014

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

person zaf    schedule 06.04.2010
comment
+1 за то, что меня опередили. Я обнаружил, что получаю больше голосов, когда использую обратную кавычку для форматирования своего встроенного кода, если это помогает. - person Anthony; 06.04.2010
comment
Сочувствие, так как вы ответили первым, но не привели пример. Как будто на этот вопрос нельзя было ответить быстрее с помощью PHP.net. - person dscher; 06.04.2010
comment
@dscher Спасибо! Если бы таких людей было больше! ;) - person zaf; 06.04.2010
comment
@zaf Два года спустя, я хочу извиниться. : P В то время я был глупым и полным новичком в PHP. Когда я увидел ответ Энтони с примером кода, я сразу же проверил его как ответ, даже не взглянув на ваш, потому что это требовало меньше усилий. Теперь я знаю лучше, так что снова извините. :) - person Joey Morani; 19.10.2012
comment
@JoeyMorani Все в порядке, спасибо за сообщение. Ты больше не новичок. - person zaf; 19.10.2012

Скорее всего, вы экранируете строку 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() сделает это за вас.

person Paul Lammertsma    schedule 06.04.2010

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

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

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

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

person Peter Parker    schedule 06.04.2010
comment
Очередная дурацкая статья, автор которой понятия не имеет. Та же старая история про дроп-таблицы (хорошо, чтобы напугать новичков, да, но никогда не работает), та же функция stupidQuery, которая следит за волшебными кавычками. И ни слова о нестроковых значениях, как обычно. и лучшая защита $ badWords за всю историю - person Your Common Sense; 06.04.2010
comment
хорошо, это не самая лучшая статья, но она должна познакомить вас с основами (я откопал ее из быстрого поиска в Google). Вы можете дать ссылку на лучшую статью, если она есть. - person Peter Parker; 06.04.2010
comment
Ну, я кое-что написал, это форма ТАК-ответа. stackoverflow.com/questions/2589820/ - person Your Common Sense; 07.04.2010

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

person Community    schedule 06.04.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 ''=''

т.е. проверки безопасности полностью игнорируются.

C.

person symcbean    schedule 06.04.2010

Наверное "mysql_real_escape_string()" подойдет тебе

person OM The Eternity    schedule 06.04.2010

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

Только хватит. Это для специального персонажа:

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

person Soyab Badi    schedule 16.07.2016

Например:
$ 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. Найдите свой фреймворк и внедрите OR mysql_real_escape_string() в Core 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
person Community    schedule 16.04.2018

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

$abc = $POST['xyz'];

$abc = htmlspecialchars($abc);
person Solomon Sudhir    schedule 21.08.2018

Я поместил это здесь для использования в будущем. Потратив 20 минут, я решил добавить специальные символы в базу данных. нам не нужно использовать mysql_real_escape_string($holdvalue) так. мы должны сделать это таким образом. $db->real_escape_string($holdvalue). Где $db - сведения о подключении к базе данных. $db = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);.

person xcoders    schedule 31.10.2020

person    schedule
comment
Это рабочий пример для обработки специальных символов в php mysql. Вы можете заменить & на 'он будет работать нормально - person amarjit singh; 16.11.2012