Выходная буферизация: простой способ сделать строку из 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(), Я поставлю реальный код как можно скорее:)

Другие вопросы по тегам