Вывести рассчитанное значение переменной до ее вычисления - PullRequest
1 голос
/ 18 мая 2019

Это сложный вопрос для поиска, поэтому мой пост здесь. У меня есть заголовок, который отображает сумму всех значений в столбце таблицы, которая печатается под ним. Однако таблица генерируется из таблицы MYSQL, и сумма значений столбца вычисляется по мере ее создания. Так или иначе, мне нужно напечатать переменную, но только после того, как таблица сгенерирована, и я не уверен, как передать переменные обратно в оператор print, чтобы он не всегда выводил 0

Мне кажется, что решение состоит в том, что сумма должна вызывать скрипт (Javascipt), который генерирует и печатает таблицу, возвращающую сумму столбцов для последующей печати. Но я не уверен, как бы я это сделал

echo "
    <h3>EPL</h3>
    <h5>Total Score: $total</h5>
    <table class='table table-bordered'>
        <tr>
            <th>#</th>
            <th>Name</th>
            <th>Score</th>
        </tr>
        <tbody class='row_position'>"?>
        <?php

        require('db_config.php');
        $tablename = $_SESSION['username'] . "_epl";
        $_SESSION['tablename'] = $tablename;
        $sql = "SELECT * FROM $tablename ORDER BY position_order";
        $users = $mysqli->query($sql);
        while($user = $users->fetch_assoc()){
        $con = mysqli_connect('localhost', 'root', 'root', 'predictions');
        $sql1 = "SELECT * FROM `predictions`.`".$tablename."` WHERE (CONVERT(`title` USING utf8) LIKE '%".$user['title']."%')";
        $sql2 = "SELECT * FROM `predictions`.`epl` WHERE (CONVERT(`title` USING utf8) LIKE '%".$user['title']."%')";
        $result = mysqli_query($con, $sql1);
        $row = $result->fetch_assoc();
        $position1 = $row['position_order'];
        $result->close();
        $result = mysqli_query($con, $sql2);
        $row = $result->fetch_assoc();
        $position2 = $row['position_order'];
        $total += abs($position1-$position2);



        ?>
            <tr  id="<?php echo $user['id'] ?>">
                <td><?php echo $user['position_order'] ?></td>
                <td><?php echo $user['title'] ?></td>
                <td><?php echo abs($position1-$position2); ?></td>
            </tr>
        <?php } ?>
        </tbody>
    </table>

Чтобы объяснить таблицу далее, у каждого пользователя есть своя собственная таблица с тем же форматом username_league, поэтому я использую некоторый php-код для захвата таблицы. Кроме того, у меня есть таблица базового варианта в этом случае «epl», в которой я сравниваю таблицы и вычисляю баллы на основе абсолютной разницы в столбце «position_order».

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Вы всегда должны стремиться к разделению вашего кода и презентации.Кроме того, код вашей базы данных крайне неэффективен.Вы заново создаете объект базы данных для каждого экземпляра исходного запроса.

Просто поместите код PHP перед HTML или, что еще лучше, в отдельный файл.

<?php

$total = 0;

require('db_config.php');
$tablename = $_SESSION['username'] . "_epl";
$_SESSION['tablename'] = $tablename;
$sql = "SELECT id, position_order, title FROM `$tablename` ORDER BY position_order";
$users_result = $mysqli->query($sql);
while($user = $users_result->fetch_assoc()) {
    $users[] = $user;
}

foreach ($users as $user) {
    $sql1 = "
        SELECT position_order FROM `$tablename` WHERE CONVERT(`title` USING utf8) LIKE '%$user[title]%' LIMIT 1
        UNION
        SELECT position_order FROM `epl` WHERE CONVERT(`title` USING utf8) LIKE '%$user[title]%' LIMIT 1
    ";
    $result = $mysqli->query($sql1);
    $row = $result->fetch_assoc();
    $position1 = $row['position_order'];
    $user["position1"] = $position1;

    $row = $result->fetch_assoc();
    $position2 = $row['position_order'];
    $user["position2"] = $position2;

    $total += abs($position1 - $position2);
}
?>

Вот ты где;используя один объект базы данных, на треть меньше запросов, все ваши значения в массиве.Они готовы к использованию позже в файле или в вашем отдельном представлении HTML:

<h3>EPL</h3>
<h5>Total Score: <?=$total?></h5>
<table class='table table-bordered'>
    <tr>
        <th>#</th>
        <th>Name</th>
        <th>Score</th>
    </tr>
    <tbody class='row_position'>

    <?php foreach($users as $user):?>
        <tr  id="<?=$user['id'] ?>">
            <td><?=$user['position_order'] ?></td>
            <td><?=$user['title'] ?></td>
            <td><?=abs($user["position1"]-$user["position2"]); ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>

Я не знаю достаточно о структуре здесь, но я был бы очень удивлен, если бы вы не смоглисделать это запрос к базе данных.

1 голос
/ 18 мая 2019

Буферизация вывода - ваш друг!Просто вызовите ob_start перед выводом таблицы, т. Е.

ob_start();
echo "
<table class='table table-bordered'>
    <tr>
        <th>#</th>
        <th>Name</th>
        <th>Score</th>
    </tr>
    <tbody class='row_position'>"?>
...

, а затем, как только вы закончите генерацию таблицы, вы можете собрать вывод содержимого таблицы, используя ob_get_clean, выведите заголовок и затем содержимое таблицы:

...
$table = ob_get_clean();
echo "<h3>EPL</h3>
<h5>Total Score: $total</h5>";
echo $table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...