Выходная буферизация: простой способ сделать строку из HTML-кода
В настоящее время я использую 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."
РЕДАКТИРОВАТЬ: я добавил пример исходного кода. Этот код не скомпилируется.
2 ответа
Поскольку я не могу комментировать, поэтому я поставлю здесь некоторые вопросы.
Я не совсем понимаю, но дай мне попробовать, ты имеешь в виду escaping
строка? Вы можете использовать обратную косую черту \
чтобы избежать строки.
Как это "select from ".$dbname." where id = \"".$id."\""
,
Вы можете легко использовать addslashes($var)
перед добавлением переменной в sql
, как это
$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
,
tl;dr: то, что я искал, было сочетанием file_get_contents()
и буферизация объекта.
file_get_contents()
возвращает строку простого HTML-файла по вашему выбору. Я мог бы опубликовать тонну объяснений здесь или просто связать вас с phppot.com. Статья предлагает вам непосредственно исполняемый демо с исходным кодом ( скачать здесь). Если вы хотите попробовать это с вашим html-файлом, просто измените путь к файлу.
Поэтому, когда весь HTML был преобразован в строку, я использовал функцию постобработки OB, чтобы изменить строку (= в основном мой HTML), если это существующий пользователь, который пришел, чтобы изменить свои данные. Затем весь HTML-код (в строке еще в этой точке) отправляется клиенту с помощью ob_end_flush()
, Я поставлю реальный код как можно скорее:)