生成PHP页面的最佳方式?
我最近开始在像网站这样的图像板上工作,当单击“创建线程”按钮时,我偶然发现需要生成一个随机的 PHP 页面,我尝试使用谷歌搜索如何执行此操作,但不幸的是没有找到任何线索,所以我尝试了为了即兴发挥并提出我自己的解决方案,我找到的唯一解决方案是:
<?php
$randomizer = rand(0,30000)*rand(123456,2323232);
$file = fopen("$randomizer.php",'w');
$username = $_POST['user'];
$threadContent = $_POST['content'];
$phpString = " <!DOCTYPE html>
<html>
<head>
<title>Main page</title>
fwrite($file, $phpString);
header("location: $randomizer.php");
$phpString 基本上包含我想要生成的页面的整个 HTML 和 PHP,所以我不能真正将它全部包含在这里,它真的很长。这种方法可以正常工作,所以我只是想知道是否有更好的方法来做到这一点。
回答
正如评论中所说,出于多种原因,这不是一个好主意。我将展示其中的一些,并在最后展示一些关于正确执行此操作的方法和可以提供帮助的框架的概念证明。如果您仍然想以这种方式进行,请检查此 awnser。
服务器所有者维护
每个“线程”创建一个文件会使事情变得很难改变。如果您在线程创建者代码上有一些错误(甚至想要更改一些视觉效果、品牌、添加新功能等),您将不得不更改每个已生成的文件。
安全
一个安全漏洞会成倍增加到 N 个文件,令人头疼。在您的示例中,如果您在threadContent不转义的情况下进行编写,则会导致应该在每个已生成的文件上搜索和修复XSS。
用户管理
要编辑错别字或生成文件的用户想要的任何其他内容,他必须有权在您的服务器上编辑文件,否则您必须创建一个脚本来直接更改文件内容,这很糟糕。
搜索引擎
想象一下,在您的网站上创建一个搜索引擎以在所有文件上按标题、内容等查找某个主题是多么困难。
有趣的事实
如果 StackOverflow 站点使用这种方法并且每个问题文件有大约 10kb,那么它只有大约 206GB 的问题文件需要管理。你可以在这里看到 StackOverflow 有多少问题。
应该怎么做?
有很多方法可以做到这一点,我将展示一种非常易于解释的方法以及一些可以帮助您的框架。
数据可以存储在您的数据库中,例如:
| ID | 用户身份 | 标题 | 内容 |
|---|---|---|---|
| 1 | 1 | 例子 | 逻辑推理... |
然后创建一个用作模板的文件来为所有用户生成的线程提供服务:
线程模板.php
<!DOCTYPE html>
<html>
<head>
<title><?php echo htmlspecialchars($post['title'], ENT_QUOTES, 'UTF-8'); ?></title>
</head>
<body>
<?php echo htmlspecialchars($post['content'], ENT_QUOTES, 'UTF-8'); ?>
</body>
</html>
在渲染模板之前,您需要从数据库中获取数据:
$stmt = $pdo->query("SELECT * FROM posts WHERE id = 1");
$post = $stmt->fetch();
require("thread-template.php");
构架
许多框架可以帮助您轻松完成,使用MVC 方法。
模型
图案的核心组件。它是应用程序的动态数据结构,独立于用户界面。它直接管理应用程序的数据、逻辑和规则。
看法
信息的任何表示,例如图表、图表或表格。相同信息的多个视图是可能的,例如用于管理的条形图和用于会计师的表格视图。
控制器
接受输入并将其转换为模型或视图的命令。
Laravel
代码点火器
蛋糕PHP