1. ホーム
  2. php

[解決済み】MySQLへの挿入時にPHPでシングルクォートをエスケープする【重複あり

2022-04-08 19:02:34

質問

どうしても理解できないことがあるのですが......。

2つのSQLステートメントがあります。

  • 1つ目は、フォームからデータベースに情報を入力します。
  • 2番目は、上記で入力されたデータベースからデータを取得し、メールを送信し、トランザクションの詳細をログに記録します。

問題は、シングルクオートで2番目のエントリにだけMySQLエラーが発生することです。最初のインスタンスは問題なく動作しますが、2 番目のインスタンスでは 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')");

解決方法は?

これらの文字列を(両方のスニペットで)それぞれエスケープする必要があります。 mysql_real_escape_string() .

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

2つのクエリの動作が異なるのは、おそらくあなたが magic_quotes_gpc をオンにしています(これは悪い考えだと知っておくべきです)。 これは、$_GET、$_POST、$_COOKIES から集められた文字列が、あなたのためにエスケープされることを意味します (すなわち。 "O'Brien" -> "O\'Brien" ).

一度データを保存し、その後再びデータを取り出すと、データベースから戻ってきた文字列は次のようになります。 ない が自動的にエスケープされます。その結果 "O'Brien" . そこで、それを通すために mysql_real_escape_string() .