在File中,为什么从$ fileB = file_get_content(FileB.php)中提取的求值字符串和在File中定义的处理变量会导致未设置的值?

时间:2013-11-03 14:10:56

标签: php eval

我是一个新的提问者,但是很长时间的读者,我似乎无法找到我的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>

任何?谢谢。

1 个答案:

答案 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);