我是一个新的提问者,但是很长时间的读者,我似乎无法找到我的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”哪个
即
<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>
任何?谢谢。
答案 0 :(得分: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);