1

mail()PHPの関数を使用するときに、文字がどのようにエスケープされるかの背後にあるロジックを理解するのに問題があります。私は PHP 5.2 を使用しており、magic_quotes_qpc をオンにし、runtime/sybase をオフにしています。これが問題です。

  1. テキスト入力を受け取るフォームがあり、次のmysqli_real_escapeような SQL ステートメントで使用するために特殊文字をエスケープするために使用します。

    $text = mysqli_real_escape_string($dbc, $_GET['text']);
    
  2. 次のコメントを入力すると、「私はそれを食べません!」フォームに入力すると、データベースに次のように表示されます-「私はそれを食べません!」、これは私が期待するものです. キャリッジ リターン/改行を追加すると、phpMyAdmin のデータベース フィールドに表示されるのは、特殊文字のないキャリッジ リターンと改行だけです (つまり、"\r\n" などはありません)。

  3. 関数を使用しmailてメッセージを送信すると (つまりmail($to, $subject, $text, $headers))、電子メールの本文に次のような奇妙なものが表示されます。

    I wouldn\\\'t eat that\r\nI couldn\\\'t eat that
    

結局のところ、メール出力をフォーム入力とまったく同じようにフォーマットしたいだけです。つまり、次のようになります。

I wouldn't eat that
I couldn't eat that

アポストロフィの前にトリプル エスケープがある理由と、\r\n がメールに表示される理由がわかりません。

4

2 に答える 2

2

魔法の引用符は悪い. それらを使用しないでください。

http://www.php.net/manual/en/security.magicquotes.whynot.php

マジック クォートmysqli_real_escape_string を使用している場合は、文字列が二重にエスケープされる理由が説明されています。

$text = mysqli_real_escape_string($dbc, $_GET['text']); // $_GET['text'] is already escaped

...

mail($to, $subject, $text, $headers); // Now $text contains a doubly escaped string

マジック クォートをオフにして (アプリがそれを処理できることを確認してください)、データベースに挿入するときだけエスケープします (パラメーター化されたクエリ、つまり PDO や mysqli を使用している場合は、エスケープする必要はありません! )。

最後の手段として、文字列にストリップスラッシュを使用してみることができます。

于 2011-04-18T22:53:06.973 に答える
0

MySQL データベースから結果を取得する場合stripslashes()、出力で を使用する必要があります。そうしないと、何らかの理由でエスケープ スラッシュが含まれます。

編集:

$theOutput = str_replace("\\r\\n", "\r\n", $theOutput);次に、改行を修正することができます。

于 2011-04-18T22:56:48.657 に答える