[解決済み】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()
.
関連
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] PHPの文字列で、シングルクオートとダブルクオートの違いは何ですか?
-
[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合
-
[解決済み] PHPでMySQLのdatetimeから別の形式に変換する
-
[解決済み] MySQLのdatetimeに挿入する際のPHPのdate()フォーマット
-
[解決済み】mysqlで複数行の挿入を行う。
-
[解決済み] PHP の sprintf のエスケープ %.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?
-
[解決済み] 警告: mysqli_real_escape_string() は正確に2つのパラメータを期待します、1つは与えられました...私は間違っていますか?[重複]。
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?