【问题标题】:Output Buffering: Easy way to make string out of HTML-Code输出缓冲:用 HTML 代码制作字符串的简单方法
【发布时间】:2018-09-01 23:30:45
【问题描述】:

我目前正在使用 Chatfuel 打开我网站的 index.php 文件,该文件会将 html 代码发送到用户的浏览器中。他可以在那里注册并设置他的帐户。 示例 URL 可能如下所示:

https://my.domain.com?key_value='123456789'

根据该用户是新用户还是现有用户,我想向他展示不同的表单。为了检查这一点,我对 MySQL 数据库进行了一个简单的查询,看看传递的 key_value 是否已经在数据库中,并且对于布尔值是安全的 true 或 false。显而易见:如果他不是现有用户,则应该显示没有值的“空”表单。如果他注册了,他应该会看到他上次填写的信息。

我的想法: 在我的 index.php 顶部,我检查他是否是现有客户(注意:这已经有效)。然后我想使用 outputbuffering 来根据布尔值更改 html 代码,然后再将其发送到客户端。

我的问题: 我用纯 html 开发了网站的蓝图(见下面的代码)。如果它在字符串中,OB 只会将其捕获为输出。由于我在文档中使用"',字符串每隔几行就会中断一次。有一个简单的解决方法吗?因为 OB 功能无法访问 <html>...</html> 标签内的任何内容。 还是我需要在检查后使用重定向(在我的 index.php 中)并为编辑客户数据和添加新客户数据创建单独的表单 + 脚本?

<?php

//Connection stuff


// Prepare statment: !TODO: string needs to be escaped properly first
$query_string = "SELECT * FROM tbl_customer WHERE unique_url = '$uniqueurl'";
$query_rslt = mysqli_query($conn, $query_string);

if($query_rslt == FALSE)
{
    // Failure
    echo "<br> Oops! Something went wrong with the querying of the db. " . $conn->connect_error;
    //Handle error
}
else
{
    if ($query_rslt->num_rows > 0)    
    {
        // Set boolean
        $existing_customer = TRUE;

        // Create an array called row to store all tuples that match the query string
        while($row = mysqli_fetch_assoc($query_rslt)) {
            //...
        }
    }
}

// Custom post processing function
function ob_postprocess($buffer)
{
    // do a fun quick change to our HTML before it is sent to the browser
    $buffer = str_replace('Testing', 'Working', $buffer);

    // Send $buffer to the browser
    return $buffer;
}

// start output buffering at the top of our script with this simple command
// we've added "ob_postprocess" (our custom post processing function) as a parameter of ob_start
if (!ob_start('ob_postprocess'))
{
    // Failure
    echo "<br> Oops! Something went wrong with output buffering. Check that no HTML-Code is sent to client before calling this start function.";
    // Handle error
}
else
{
    // Success
    // This is where the string should get accessed before sending to the client browser
    echo "Testing OB.";
}

?>

<!--DOCTYPE html-->
<html lang="en">
    <head>
        <meta charset="utf-8">
        //...
</body>
</html>

<?php

// end output buffering and send our HTML to the browser as a whole
ob_end_flush();

?>

输出: "Working OB."

编辑:我添加了源代码示例。此代码无法编译。

【问题讨论】:

  • 显示一些示例代码,您可以在其中处理该纯 html 字符串以及该 html 的字符串或文件内容。你会得到更好的答案,因为你要求解决的问题可能比它阻止你的问题更早开始,更进一步的解决方案是修补错误而不是删除它。
  • 代码已添加。您要求的功能是ob_postprocess。它目前只是一个占位符,用于将使用真正的 html 代码完成的操作(一旦它工作)。它作为参数传递给ob_start('ob_postprocess'),并在调用ob_end_flush() 时立即发送给客户端(参见代码cmets 或object buffering)。 “我要问的问题......”是什么意思?对不起,我没有得到那部分。
  • 你不能通过file_get_contents()从文件中读取你的html吗?由于您可能希望在某个时候从数据库调用或其他任何内容中输入动态值,因此请使用令牌或占位符,然后通过对其中一个字符串替换函数的一系列调用来运行它
  • 好吧,所以你建议我在他的回答中转义像 Cik Irvan 这样的字符串,然后将其放入一个名为 content 的变量中?或者这个代码$form_content = file_get_contents($file_name,FALSE,NULL,62,157); 会成功吗(这意味着它会自动转义我的html代码)?我会对此进行一些研究。 Ty fth(int) : 意外的文字游戏
  • 唯一的问题是字符串替换hack,可以用直接的变量显示替换(如果数组键不存在,您可以使用字符串数组和带有空字符串后备的转义函数)。那是您在报价方面遇到麻烦的地方吗?尝试用硬编码的 html 字符串替换部分输出?

标签: php html string output-buffering


【解决方案1】:

因为,我无法发表评论,所以我会在这里提出一些问题。

我真的不明白这一点,但试一试,你的意思是escaping 字符串吗?您可以使用反斜杠\ 转义字符串。

喜欢这个"select from ".$dbname." where id = \"".$id."\""


在将变量添加到sql 之前,您可以轻松地使用addslashes($var)。像这样

$id = addslashes($_POST['id']);
$sql = "select form db where id = '$id'";

如果您的意思是检查用户的存在以选择在页面中显示哪个表单,为什么不这样做呢?

if(userCheck()) {
  ?>
    // here write the html code if user passed
  <?php
} else {
  ?>
    // here write the html code if user not passed
  <?php
}

你可以把userCheck()作为全局函数或者放在任何地方,只要你想在显示form之前检查用户时使用它。

【讨论】:

  • 这可能已经成功了。对string escaping and what it does 进行了快速研究,它看起来像是我需要的东西。尽管在几百行 html 中手动添加反斜杠会很麻烦...
  • 问题是,表格非常相似。目前,用户将无法编辑他们的抄送信息,因为它是使用 API 保护和处理的。表单的其余部分将是相同的(除了一个在表单字段中保存从数据库读取的数据)。执行userCheck() 会创建一个巨大的 index.php 文件,并且对最喜欢的 html 所做的每次更改都需要执行两次。我不熟悉 php 及其最佳实践,但这对于长期解决方案来说似乎非常混乱。
  • 经过测试,这是最简单的方法。如果至少只是少数情况。但是,在大型“硬编码”html 文档中,这将需要数百个突变。您可以使用文本编辑工具 ofc 的替换功能轻松完成此操作。但是代码会很乱。我们不希望这样。转义字符串的提示给了我一个方向,人们应该真正了解它。一旦我睡了,我将编辑问题并添加我的解决方案。谢谢。
  • 但是 userCheck() 可以放在其他文件中,例如您创建一个包含在index.php 中的新check.php 或使用object,如classes
  • 你绝对可以这样做。但是这样做有什么意义呢?拆分代码并提高可重用性?还有其他优点吗?请证明你的观点。
【解决方案2】:

tl;dr:我正在寻找的东西是 file_get_contents() 和对象缓冲的组合。

file_get_contents() 返回您选择的纯 html 文件的字符串。我可以在这里发布大量解释,或者简单地将您链接到phppot.com。本文为您提供了一个带有源代码 (Download here) 的直接可执行演示。如果您想使用自己的 html 文件进行尝试,只需更改文件路径即可。

因此,一旦将整个 html 转换为字符串,如果是现有用户来更改他的数据,我就会使用 OB 的后处理功能来更改字符串(= 基本上是我的 html)。然后使用ob_end_flush() 将所有html 代码(此时仍为字符串)发送到客户端。我会尽快贴出实际代码:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多