0

私は新しい質問者ですが、長年の読者であり、PHP コードの解決策を見つけることができないようです。

フォームの連絡先が送信された後、メールを送信しようとしています。HTMLメールをフォームプロセスのphpファイル内で文字列として定義するのではなく、別のファイルに保存することを決定するまでは簡単でした。この方法でメッセージのレイアウトを編集する方がはるかに簡単だと言わざるを得ません。しかし、それは簡単な作業ではありません。

「contact-form-process.php」があります

  • フォームから送信された情報の解析;
  • その情報を配列に追加し、

すなわち

$formdata = array( 
  'first-name' => $_POST['first-name'], 
  'last-name' => $_POST['last-name'], 
  'email' => $_POST['email'], 
  'message-subject' => filter_var($_POST['message-subject'], FILTER_SANITIZE_STRING), 
  'message-body' => filter_var($_POST['message-body'], FILTER_SANITIZE_STRING), 
);

および「sender-copy.php」

  • 私が送信している実際のhtmlメールです。
  • 「contact-form-process.php」で定義された変数を使用していくつかの簡単な操作を実行し、

すなわち

<p>
  Dear <?php $value = (isset($formdata['first-name']) ? $formdata['first-name'] : 'NOT-SET'), 
</p>

ここで「contact-form-process.php」に戻ります。ここでは、HTML メール本文を文字列 ( $message = file_get_contents('sender-copy.php', TRUE);) として含め、それを処理して、含まれている PHP コード スニペットを評価します。

$message = preg_replace_callback    (
                            '/<\?php(.+)\?>/', 
                            function ($match) {
                                eval($match[1]); 
                                return $value; 
                            }, 
                            $message
                        );

そのため、「sender-copy.php」文字列で評価された PHP スニペットから $formdata 配列の値を取得するのが困難になりました。これが私の出力のコピーです:

<p>
  Dear NOT-SET, 
</p>

誰?ありがとうございました。

4

1 に答える 1

0

JavaScript とは異なり、PHP は親スコープから変数を継承しません。これは、preg_replace_callbackコールバック内に$formdata 存在しないことを意味します。

幸いなことに、それを継承する簡単な方法があります。

function($match) use ($formdata) { ... }

とはいえ、アプローチを変えることを強くお勧めします。次のようなことができます。

ob_start();
require("sender-copy.php");
$message = ob_get_contents();
ob_end_clean();

または、より安全に、「送信者コピー」を次のように変更できます。

<p>Dear {first-name},</p>

そして、この置換方法を使用してください:

$message = preg_replace_callback("/\{([^}]+)\}/",function($m) use ($formdata) {
    if( isset($formdata[$m[1]])) return $formdata[$m[1]];
    return "NOT-SET";
},$message);
于 2013-11-03T14:16:58.533 に答える