Экранирование одинарной кавычки в PHP при вставке в MySQL [дубликат]



этот вопрос уже есть ответ здесь:




  • Как я могу предотвратить SQL-инъекций в PHP?

    28 ответов



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



у меня есть два SQL-запроса:
- Первый вводит информацию из формы в базу данных.
- второй берет данные из базы данных, введенной выше, отправляет электронное письмо, а затем регистрирует детали транзакции



проблема в том, что кажется, что одна кавычка вызывает ошибку MySQL только на второй записи!!! Первый экземпляр работает без проблем, но второй экземпляр вызывает mysql_error().



данные из формы обрабатываются иначе, чем данные, полученные в форме?



запрос № 1 - это работает без выпуск (и не выходя из одинарной кавычки)



$result = mysql_query("INSERT INTO job_log 
(order_id, supplier_id, category_id, service_id, qty_ordered, customer_id, user_id, salesperson_ref, booking_ref, booking_name, address, suburb, postcode, state_id, region_id, email, phone, phone2, mobile, delivery_date, stock_taken, special_instructions, cost_price, cost_price_gst, sell_price, sell_price_gst, ext_sell_price, retail_customer, created, modified, log_status_id)
VALUES
('$order_id', '$supplier_id', '$category_id', '{$value['id']}', '{$value['qty']}', '$customer_id', '$user_id', '$salesperson_ref', '$booking_ref', '$booking_name', '$address', '$suburb', '$postcode', '$state_id', '$region_id', '$email', '$phone', '$phone2', '$mobile', STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', '$special_instructions', '$cost_price', '$cost_price_gst', '$sell_price', '$sell_price_gst', '$ext_sell_price', '$retail_customer', '".date('Y-m-d H:i:s', time())."', '".date('Y-m-d H:i:s', time())."', '1')");


запрос#2-это не удается при вводе имени с одной кавычкой (т. е. О'Брайен)



$query = mysql_query("INSERT INTO message_log 
(order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status)
VALUES
('$order_id', '".date('Y-m-d H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')");
791   8  

8 ответов:

вы должны экранировать каждую из этих строк (в обоих фрагментах) с помощью mysql_real_escape_string().

http://us3.php.net/mysql-real-escape-string

причина, по которой ваши два запроса ведут себя по-разному, скорее всего, потому что у вас есть magic_quotes_gpc включен (что вы должны знать, это плохая идея). Это означает, что строки, собранные из $_GET, $_POST и $_COOKIES, экранируются для вас (т. е. "O'Brien" -> "O\'Brien").

после того, как вы сохраните данные, а затем получить его опять же, строка, которую вы получите обратно из базы данных будет не быть автоматически экранированы для вас. Ты вернешься "O'Brien". Итак, вам нужно будет пройти через mysql_real_escape_string().

для тех, кто находит это решение в 2015 году и движется вперед...

The является устаревшей начиная с версии PHP 5.5.0.

см.:php.net

предупреждение

Это расширение является устаревшей начиная с версии PHP 5.5.0, и будет удалено в будущем. Вместо этого следует использовать расширение MySQLi или PDO_MySQL. См. также MySQL: выбор руководства API и связанных FAQ для получения дополнительной информации. Альтернативы этой функции включают в себя:

mysqli_real_escape_string()

PDO::quote()

вы должны сделать что-то вроде этого, чтобы помочь вам отладить

$sql = "insert into blah blah....";
echo $sql;

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

посмотреть http://php.net/manual/en/security.magicquotes.php

у вас есть несколько вещей, сражающихся в ваших строках.

  • отсутствие правильного цитирования MySQL (mysql_real_escape_string())
  • потенциальные автомат магические кавычки-проверьте gpc_magic_quotes задание
  • встроенные строковые переменные, что означает, что вы должны знать, как PHP правильно находит переменных

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

вы можете сделать следующее, которое экранирует как PHP, так и MySQL.

<?
$text = '<a href="javascript:window.open(\\'http://www.google.com\\');"></a>';
?> 

это будет отражать MySQL как

<a href="javascript:window.open('http://www.google.com');"></a>

как это работает?

мы знаем, что как PHP, так и MySQL apostrophes могут быть экранированы с обратной косой чертой, а затем Апострофом.

\'

поскольку мы используем PHP для вставки в MySQL, нам нужно, чтобы PHP все еще писал обратную косую черту в MySQL, чтобы он тоже мог ее избежать. Поэтому мы используем PHP escape-символ обратная косая черта-обратная косая черта вместе с обратной косой чертой-Апостроф для достижения этой цели.

\\'

вы должны просто передать переменную или данные внутри " mysql_real_escape_string(trim ($val))"

где $val = данные, которые вас беспокоят.

У меня была такая же проблема и я решил ее так:

$text=str_replace("'","\'",$YourContent);

вероятно, есть лучший способ сделать это, но это сработало для меня, и это должно сработать и для вас тоже.

функция mysql_real_escape_string() или str_replace () поможет вам решить вашу проблему.

http://phptutorial.co.in/php-echo-print/

Comments

    Ничего не найдено.