Исключение одиночной кавычки в 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('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')");
Ответы
Ответ 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()
.
Ответ 2
Для тех, кто находит это решение в 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()
Ответ 3
Вы должны сделать что-то вроде этого, чтобы помочь вам отладить
$sql = "insert into blah blah....";
echo $sql;
Вы, вероятно, обнаружите, что в рабочем запросе одиночная кавычка экранирована обратной косой чертой. Это может быть сделано автоматически PHP через настройку magic_quotes_gpc, или, может быть, вы сделали это самостоятельно в какой-то другой части кода (добавочные и полосы могут быть функциями для поиска).
Смотрите магические цитаты
Ответ 4
У вас есть пара вещей, сражающихся в ваших строках.
- отсутствие правильного цитирования MySQL (
mysql_real_escape_string()
)
- потенциальная автоматическая "магическая цитата" - проверьте настройки gpc_magic_quotes
- встроенные строковые переменные, что означает, что вы должны знать, как PHP правильно находит переменные
Также возможно, что однокабельное значение отсутствует в параметрах для первого запроса. Ваш пример - это правильное имя, в конце концов, и только второй запрос, похоже, имеет дело с именами.
Ответ 5
Вы можете сделать следующее, которое ускользает как от 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 обратного слэша-обратного слэша вместе с обратным слэшем-апострофом для достижения этого.
\\\'
Ответ 6
Вы должны просто передать переменную (или данные) внутри "mysql_real_escape_string (trim ($ val))"
где $val
- это данные, которые вас беспокоят.
Ответ 7
У меня была такая же проблема, и я решил ее так:
$text = str_replace("'", "\'", $YourContent);
Возможно, есть лучший способ сделать это, но это сработало для меня, и это должно сработать и для вас.
Ответ 8
Функция mysql_real_escape_string() или str_replace() поможет вам решить вашу проблему.
http://phptutorial.co.in/php-echo-print/