Сброс одиночной кавычки в PHP при вставке в MySQL

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

У меня есть два оператора 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('Ymd H:i:s', time())."', '".date('Ymd 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('Ymd H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '$message_content', '1')"); 

Вы должны избегать каждой из этих строк (в обоих фрагментах) с помощью 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 году и продвигается вперед …

Функция mysql_real_escape_string() устарела с 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, или, возможно, вы сделали это сами в какой-либо другой части кода (addlashes и 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 могут быть экранированы с обратной косой чертой и затем апострофом.

 \' 

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

 \\\' 

Вы должны просто передать переменную ИЛИ данных внутри «mysql_real_escape_string (trim ($ val))»

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

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

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

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

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

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