0

我正在制作一个小型 CMS 用于练习。我正在使用 CKEDITOR 并试图使其可以在文本中编写类似 %contactform% 的内容,然后我的 PHP 函数将其替换为联系表单。

我已经完成了用表单替换文本。但现在我需要表单的 PHP 代码来发送邮件。我正在使用 file_get_contents(); 但它正在剥离 php 代码。

我用过 include(); 然后从另一个文件中获取 php 代码,现在可以使用。我想用一个文件来做。

那么 - 我可以从包含 php 代码的文件中获取所有内容吗?

*更新*

我会尝试用另一种方式来解释。

我可以在我的 CMS 中创建一个页面,我可以在其中编写标题和一些内容。在内容中我可以写 %contactform%。

当我从数据库中获取内容时,我使用 file_get_contents(); 将 %contactform% 替换为 /inserts/contactform.php 中的内容;我有 HTML 格式的表单和我的 php 代码:

if(isset($_POST['submit'])) {
  echo 'Now my form is submitted!';
}

<form method="post">
  <input type="text" name="email">
  <input type="submit" name="submit">
</form>

现在我期待检索表单和激活的 php 代码。但是如果我在表单中按下我的提交按钮,它不会触发 php 代码。

我不想显示我希望能够使用它的 php 代码。

4

3 回答 3

1

是的...

$content = file_get_contents( 'path to your file' );

用于打印尝试

echo htmlspecialchars( $content );
于 2012-12-30T13:44:39.847 回答
1

我仍然必须猜测,但是从您的更新来看,我认为您最终会得到一个变量,其中包含数据库中的内容,%contactform%替换为file_get_contents('/inserts/contactform.php').

就像是:

$contentToOutput = str_replace(
  '%contactform%',
  file_get_contents('/inserts/contactform.php'),
  $contentFromDatabase
);

如果你echo输出那个变量,它只会按原样发送它的内容。不会执行任何 php。

尽管在许多情况下它是有风险的,但如果您知道自己在做什么,您可以使用eval来解析 php 代码。使用这样的混合代码,您可能希望像下面这样。

ob_start();
eval('; ?>' . $contentToOutput); 
$parsedContent = ob_get_clean();

$parsedContent现在应该包含执行代码后的结果。您现在可以将其发送给用户或以任何您想要的方式处理它。

当然,您必须确保其中的任何内容$contentToOutput都是有效的 php 代码(或 php 与 php-tags 和文本的有效混合)。

是 symfony Templating/PhpEngine类的链接。看一下evaluate在实际代码中查看上述示例的方法。

于 2012-12-30T14:41:02.960 回答
0

通过阅读修改后的问题,我认为答案是“你不能从这里到达那里”。让我试着解释一下我认为你会遇到什么。

首先,考虑 HTTP 的性质和客户端/服务器模型。客户端发出请求,服务器做出响应。每个请求都是原子的、完整的和无状态的,每个响应都是完整的并且通常是即时的。这就是它的结束。服务器断开连接并返回“睡眠”状态,直到客户端发出新请求。

假设我请求一个网页。PHP 脚本运行并准备响应文档(可能是 HTML),然后服务器将文档发送到我的浏览器。如果文档包含 HTML 表单,我可以将表单提交到action=脚本的 URL。但是当我提交表单时,我正在发出一个返回服务器的新请求。

据我了解您的设计,计划是将 HTML 表单和 PHP 操作脚本都放入 CKeditor 的文本区域中 %contactform% 字符串的位置。这将呈现给客户端,客户端会将表单提交回您的服务器,在那里它将运行 PHP 脚本。我只是认为这行不通,如果你找到了让它工作的方法,你基本上是在说,“我将接受外部输入并在 PHP 中运行它。” 这对我来说是不可接受的安全风险。

如果您可以从技术细节中退后一步,只用简单的语言告诉我们您想要实现的目标,我们或许可以提供有关设计模式的建议。

于 2012-12-30T14:00:16.413 回答