Выходная буферизация: простой способ сделать строку из HTML-кода - PullRequest
0 голосов
/ 02 сентября 2018

В настоящее время я использую Chatfuel, чтобы открыть index.php-файл моего сайта, который отправляет пользователю html-код в его браузер. Там он может зарегистрироваться и настроить свой аккаунт. Пример URL может выглядеть следующим образом:

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

В зависимости от того, является ли этот пользователь новым или существующим, я хочу представить ему другую форму. Чтобы проверить это, я делаю простой запрос к базе данных MySQL и проверяю, находится ли переданное key_value уже в базе данных и безопасно ли true или false для логического значения. Утверждение очевидного: если он не существующий пользователь, должна появиться «пустая» форма без значений. Если он зарегистрирован, он должен увидеть информацию, которую он заполнил в прошлый раз.

Моя идея: Вверху моего index.php я проверяю, является ли он существующим клиентом или нет (Примечание: это уже работает). Затем я хочу использовать выходной буфер для изменения 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 ]

0 голосов
/ 03 сентября 2018

tl; dr: Я искал комбинацию file_get_contents() и буферизации объектов.

file_get_contents() возвращает строку простого html-файла по вашему выбору. Я мог бы опубликовать тонну объяснений здесь или просто связать вас с phppot.com . Статья предлагает вам непосредственно исполняемый демонстрационный пример с исходным кодом ( Скачать здесь ). Если вы хотите попробовать это с вашим html-файлом, просто измените путь к файлу.

Поэтому, когда весь html был преобразован в строку, я использовал функцию постобработки OB, чтобы изменить строку (= в основном мой html), если это существующий пользователь, который пришел, чтобы изменить его данные. Затем весь html-код (в строке еще в этой точке) отправляется клиенту с помощью ob_end_flush(). Я поставлю актуальный код как можно скорее :)

0 голосов
/ 02 сентября 2018

С тех пор, как я не могу комментировать, я поставлю здесь несколько вопросов.

Я не совсем понял, но попробуй, ты имеешь в виду 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.

...