MySQLi на PHP в цикле While в таблице html, выполняющем итерацию только один раз внутри оператора if

#php #if-statement #mysqli #while-loop #html-table

#php #if-statement #mysqli #цикл while #html-таблица

Вопрос:

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

Когда я запускаю это без оператора if «if ($ nosubs != NULL)», он работает как ожидалось, но когда я добавил оператор if, цикл остановился после одной итерации.

Вот PHP:

 <?php
require "core.php";
require "connection.php";
$output = NULL;

if (empty($_SESSION['userID'])) {
    header('Location: index.php');
} else {

    if (isset($_SESSION['userID'])) {

    $userID = $_SESSION['userID'];
    $usergroup = $_SESSION['usergroup'];
    $firstname = $_SESSION['firstname'];
    $lastname = $_SESSION['lastname'];

        if ($usergroup != 3) {
            header('Location: index.php');
            die();

        } else {

        // List unassigned submissions
        $queryopensubs = mysqli_query($dbCon, "SELECT storysubID FROM storysubs WHERE storydecision IS NULL");
        $numberopensubs = mysqli_num_rows($queryopensubs);

            if ($numberopensubs == 0) {

                $nosubs = "You do not have any new submissions";
                break;

            } else {
                $nosubs = NULL;
            }

            // Assign new submissions to first readers
            if ($numberopensubs > 0) {

                $querynewsubs = mysqli_query($dbCon, "SELECT storysubID, storywordcount, 
                    storyfilename, storysubdate, firstreadassignuserID FROM storysubs WHERE 
                    firstreadassigndate IS NULL OR firstreadassigndate=0");
                $newsubs = mysqli_fetch_assoc($querynewsubs);

                $storysubID = $newsubs['storysubID'];
                $storywordcount = $newsubs['storywordcount'];
                $storyfilename = $newsubs['storyfilename'];
                $storysubdate = $newsubs['storysubdate'];
                $firstreadassignuserID = $newsubs['firstreadassignuserID'];
  

И вот html (из нижнего в том же файле):

     <div id="editorunassignedsubs">

        <h4 style="border:3px white inset; width:90%; margin:25px auto 0     auto; padding:15px;">
                    New Submissions To Be Assigned</h4>

        <?php if ($nosubs != NULL) {
                    echo "<h3 style='text-align:center;padding:40px;'>".$nosubs."</h3>";
                } else {                                    
                echo "<table>";
                    echo "<tr>";
                        echo "<th>Submission #</th>";
                        echo "<th>Submission File Name</th>";
                        echo "<th>Word Count</th>";
                        echo "<th>Submission Date</th>";
                        echo "<th>First Reader ID#</th>";
                        echo "<th></th>";
                    echo "</tr>";

                while ($unassignedsubs = mysqli_fetch_assoc($querynewsubs)) :
                    echo "<tr>";
                        echo "<form name='assignfirstreader' method='post' action='upqry-assignfirstreader.php'>";
                            echo "<td>".$newsubs['storysubID']."</td>";
                            echo "<td>".$newsubs['storyfilename']."</td>";
                            echo "<td>".$newsubs['storywordcount']."</td>";
                            echo "<td>".date('M j, Y - g:ia',strtotime($newsubs['storysubdate']))."</td>";
                            echo "<td><input style='width:20px; text-align:center;' 
                                    type=text name='firstreadassignuserID' value='".$newsubs['firstreadassignuserID']."'>";
                            echo "<td><input type='submit' name='assign' value='Assign' style='font-family:Times; font-size:12pt;'>";
                            echo "</form>";
                    echo "</tr>";
                endwhile;
                echo "</table>";
                } ?>

        </div id="editorunassignedsubs">
  

Я попробовал mysqli_data_seek($querynewsubs,0); но он просто вернул одну и ту же строку дважды. Я выполнил var_dump, и запрос определенно возвращает две записи, которые я ожидаю увидеть из моих фиктивных данных. После того, как я заработаю правильно, я добавлю запрос на обновление, чтобы назначить читателей для отправлений в БД.

Что я сделал не так и почему это было неправильно?

* ПРИМЕЧАНИЕ: я еще не добавил никаких мер предосторожности — я все еще работаю над базовой структурой. Я вернусь и добавлю его после того, как изучу вопрос безопасности.

Комментарии:

1. О чем if ты говоришь?

2. RTFM: php.net/manual/en/mysqli-stmt.data-seek.php он ожидает оператор mysqli, которого у вас нет. вы не подготовили инструкцию. Таким образом, ваш поиск завершается неудачей, и ваша строка, которую вы использовали при первом вызове выборки, просто ИСЧЕЗАЕТ.

3. Как вы думаете, какое if, по вашему мнению, останавливает итерацию? можете ли вы echo или var_dump что-то в каждом if?

4. @u_mulder Извините, я обновил свой вопрос, чтобы отразить, что это ($ nosubs != NULL) оператор if в разделе html.

5. В цикле while у вас есть объявленная переменная $unassignedsubs , но внутри цикла, который вы используете $newsubs :-/

Ответ №1:

Фактической ошибкой была новая переменная в цикле while. Имя переменной выборки запроса должно было остаться прежним. Я изменил его на новое имя переменной, когда получал только вторую итерацию, но не изменил его обратно, когда добавил в mysqli_data_seek.

Спасибо, теперь я понимаю теорию присваивания переменных, поскольку она относится к функциям mysqli_fetch_xxx! Я действительно не понимал этого раньше, я просто следовал инструкциям, но не понимал, что я делаю.