输出缓冲:用 HTML-代码制作字符串的简单方法

Output Buffering: Easy way to make string out of HTML-Code

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

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

根据该用户是新用户还是现有用户,我想向他展示不同的表单。为了进行检查,我对 MySQL 数据库做了一个简单的查询,看看传递的 key_value 是否已经在数据库中,并且对布尔值是真还是假。说明显而易见:如果他不是现有用户,则应该显示没有值的 'empty' 表单。如果他注册了,他应该能看到他上次填写的信息。

我的想法: 在我的 index.php 顶部,我检查他是否是现有客户(注意:这已经在工作)。然后我想使用 outputbuffering 根据布尔值改变 html-code,然后再发送给客户端。

我的问题: 我用普通 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."

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

因为我不能评论,所以我会把我的一些问题放在这里。

我不太明白,但试一试,你是说 escaping 字符串吗?您可以使用反斜杠 \ 来转义字符串。

像这样"select from ".$dbname." where id = \"".$id."\"".


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

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

如果你的意思是检查用户是否存在 select 在页面中显示哪个表单,你为什么不这样做?

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

您可以将 userCheck() 作为全局函数或任何您放置它的地方,只要您可以在显示 form 之前检查用户时使用它即可。

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

file_get_contents() returns 您选择的普通 html 文件的字符串。我可以 post 在这里进行大量解释,或者只是 link 你 phppot.com. The article offers you a directly executable demo with source (Download here)。如果您想尝试使用您的 html 文件,只需更改文件路径即可。

所以一旦整个 html 被转换成一个字符串,我使用 OB 的 post 处理函数来改变字符串(= 基本上是我的 html)如果它是一个现有的前来更改其数据的用户。然后使用 ob_end_flush() 将所有 html 代码(此时仍在字符串中)发送到客户端。我会尽快贴出实际代码:)