输出缓冲:用 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 代码(此时仍在字符串中)发送到客户端。我会尽快贴出实际代码:)
我目前正在使用 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 代码(此时仍在字符串中)发送到客户端。我会尽快贴出实际代码:)