У меня есть недоумение, что я не могу понять … Я надеюсь, что кто-то здесь сможет указать мне в правильном направлении …
У меня есть два оператора 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 могут быть функциями для поиска).
У вас есть пара боевых действий в ваших струнах.
mysql_real_escape_string()
) Также возможно, что однокабельное значение отсутствует в параметрах для первого запроса. В конце концов, ваш пример – это правильное имя, и только второй запрос, похоже, имеет дело с именами.
Вы можете сделать следующее, которое ускользает как от 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 () поможет вам решить вашу проблему.
У меня была та же проблема, и я решил это так:
$text=str_replace("'","\'",$YourContent);
Вероятно, есть лучший способ сделать это, но это сработало для меня, и оно должно работать и на вас.