問題の理解
PHP を使用して MySQL にデータを挿入しようとする場合、一重引用符文字は、挿入されたデータにアクセスする後続のクエリでエラーを引き起こす可能性があります。最初のクエリは正しく動作しているように見えますが、データに一重引用符が含まれている場合、2 番目のクエリでは MySQL エラーが発生します。
問題の解決
解決策は次のとおりです。 mysql_real_escape_string() 関数を使用して、挿入された文字列内の単一引用符文字をエスケープします。この関数は、一重引用符をエスケープされた対応する文字 (') に置き換え、それらがクエリ構文の一部ではなくリテラル文字として解釈されるようにします。
差異の理由
2 つのクエリの動作が異なる理由は、magic_quotes_gpc 構成パラメータの設定が原因である可能性があります。この設定を有効にすると、$_GET、$_POST、$_COOKIES から取得した文字列は一重引用符を含めて自動的にエスケープされます。
ただし、データがデータベースに保存されて再度取得されると、エスケープされなくなります。自動的に逃げた。したがって、2 番目のクエリがデータにアクセスしようとすると、エスケープされていない一重引用符が発生し、エラーが発生します。
改訂されたクエリ
この問題を解決するには、次のようにします。両方のクエリで一重引用符をエスケープします。 mysql_real_escape_string():
$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', mysql_real_escape_string('$booking_name'), mysql_real_escape_string('$address'), mysql_real_escape_string('$suburb'), mysql_real_escape_string('$postcode'), '$state_id', '$region_id', mysql_real_escape_string('$email'), mysql_real_escape_string('$phone'), mysql_real_escape_string('$phone2'), mysql_real_escape_string('$mobile'), STR_TO_DATE('$delivery_date', '%d/%m/%Y'), '$stock_taken', mysql_real_escape_string('$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')");
$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', mysql_real_escape_string('$from'), '$row->supplier_id', mysql_real_escape_string('$row->primary_email') ,mysql_real_escape_string('$row->secondary_email'), mysql_real_escape_string('$subject'), mysql_real_escape_string('$message_content'), '1')");
一重引用符をエスケープすることで、両方のクエリで MySQL エラーが発生することなく一重引用符を含むデータが正しく処理されるようになります。
以上がMySQL クエリ エラーを防ぐために、PHP で一重引用符を適切にエスケープするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。