Вывод всех строк таблицы через while (fetch_object())

Добрый день.
Проблема у меня видимо с непониманием
while ($full = $fullresult->fetch_object())

Подскажите плз, почему такой код выводит только последнюю строку из таблицы:
$mysqli = new mysqli(   $host, 
                        $username, 
                        $password, 
                        $dbname, 
                        $port, 
                        $charset
                    );

$queryfull = "SELECT `Users`.`ID` AS `ID`,
					`Users`.`Name`,
					`Mail`,
					`Position`,
					`Department`,
					`WorkPhone`,
					`Cellphone`,
					((DAYOFMONTH(Birthday) = DAYOFMONTH(NOW()))
					& (MONTH(Birthday) = MONTH(NOW())))
					AS bday
				FROM `erp`.`Users`
				WHERE NOT Fired AND Department != ''
				ORDER BY `Department`, `Name`";

$fullresult = $mysqli->query($queryfull);

    while ($full = $fullresult->fetch_object())
    
    {
            if ($dept != $full->Department)
        {
            $dept = $full->Department;
        }
        $phone = $full->WorkPhone != 0 ? $full->WorkPhone : '';
        $position = $full->Position;
        $id = $full->ID;
        $name = $full->Name;
        $cellphone = $full->Cellphone;
        $mail = $full->Mail;
        
    }

    echo "
        <div class=\"uk-panel uk-panel-box uk-panel-contents uk-container\">";
    echo "
        <div class=\"uk-align-center uk-card uk-card-default uk-card-body uk-card-hover uk-overflow-auto\">";
    echo "
        <table class=\"uk-table uk-table-hover uk-table-small uk-margin-small uk-table-responsive\" border=0 width=\"100%\">";
              
            echo "
                <tr align=\"center\">
                    <td class=\"uk-text-emphasis\" colspan=5> 
                        <h3 class=\"uk-heading-line uk-text-center\"><span>" . $dept . "</span></h1>
                    </td>
                </tr>";

	    echo "
        <tr align=\"left\" onMouseOver=\"className='hilighton';\" onmouseout=\"className='hilightoff';\">
            <td>
                <div uk-lightbox>
                    <a class=\"uk-text-emphasis\" uk-tooltip=\"title: Посмотреть профиль; pos: top-left\" href='[[~3]]?userid=$id' data-type=\"iframe\">" . $name . "</a>
                </div>
            </td>
            <td>" . $position . "</td>
            <td align=\"center\">" . $cellphone . "</td>
            <td>
                <a class=\"uk-text-emphasis\" uk-tooltip=\"title: Позвонить; pos: top-center\" href=callto:" . $phone . ">" . $phone . "</a>
            </td>
            <td>
                <a class=\"uk-icon-link\" uk-tooltip=\"Написать письмо\" uk-icon=\"mail\" href=mailto:" . $mail . "></a>
            </td>
        </tr>";
    echo "
        </table>";
А вот такой, выводит все:
$mysqli = new mysqli(   $host, 
                        $username, 
                        $password, 
                        $dbname, 
                        $port, 
                        $charset
                    );

$queryfull = "SELECT `Users`.`ID` AS `ID`,
					`Users`.`Name`,
					`Mail`,
					`Position`,
					`Department`,
					`WorkPhone`,
					`Cellphone`,
					((DAYOFMONTH(Birthday) = DAYOFMONTH(NOW()))
					& (MONTH(Birthday) = MONTH(NOW())))
					AS bday
				FROM `erp`.`Users`
				WHERE NOT Fired AND Department != ''
				ORDER BY `Department`, `Name`";

$fullresult = $mysqli->query($queryfull);

    echo "
        <div class=\"uk-panel uk-panel-box uk-panel-contents uk-container\">";
    echo "
        <div class=\"uk-align-center uk-card uk-card-default uk-card-body uk-card-hover uk-overflow-auto\">";
    echo "
        <table class=\"uk-table uk-table-hover uk-table-small uk-margin-small uk-table-responsive\" border=0 width=\"100%\">";
              
    while ($full = $fullresult->fetch_object())
    {
            if ($dept != $full->Department)
        {
            $dept = $full->Department;
            echo "
                <tr align=\"center\">
                    <td class=\"uk-text-emphasis\" colspan=5> 
                        <h3 class=\"uk-heading-line uk-text-center\"><span>" . $dept . "</span></h1>
                    </td>
                </tr>";
        }
        $phone = $full->WorkPhone != 0 ? $full->WorkPhone : '';
	    echo "
        <tr align=\"left\" onMouseOver=\"className='hilighton';\" onmouseout=\"className='hilightoff';\">
            <td>
                <div uk-lightbox>
                    <a class=\"uk-text-emphasis\" uk-tooltip=\"title: Посмотреть профиль; pos: top-left\" href='[[~3]]?userid=$full->ID' data-type=\"iframe\">" . $full->Name . "</a>
                </div>
            </td>
            <td>" . $full->Position . "</td>
            <td align=\"center\">" . $full->Cellphone . "</td>
            <td>
                <a class=\"uk-text-emphasis\" uk-tooltip=\"title: Позвонить; pos: top-center\" href=callto:" . $phone . ">" . $phone . "</a>
            </td>
            <td>
                <a class=\"uk-icon-link\" uk-tooltip=\"Написать письмо\" uk-icon=\"mail\" href=mailto:" . $full->Mail . "></a>
            </td>
        </tr>";
    }
    echo "
        </table>";
Как это можно решить, не используя куча html в снипете?
Pavel
07 декабря 2022, 13:12
modx.pro
584
0

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

Pavel
10 декабря 2022, 16:00
0
Дошел до такого (с такими же результатами к сожалению...)

Сниппет:
$mysqli = new mysqli(   $host, 
                        $username, 
                        $password, 
                        $dbname, 
                        $port, 
                        $charset
                    );

$queryfull = "SELECT `Users`.`ID` AS `ID`,
					`Users`.`Name`,
					`Mail`,
					`Position`,
					`Department`,
					`WorkPhone`,
					`Cellphone`,
					((DAYOFMONTH(Birthday) = DAYOFMONTH(NOW()))
					& (MONTH(Birthday) = MONTH(NOW())))
					AS bday
				FROM `erp`.`Users`
				WHERE NOT Fired AND Department != ''
				ORDER BY `Department`, `Name`";

$fullresult = $mysqli->query($queryfull);

             
    while ($full = $fullresult->fetch_object())
    
    {
        
            if ($dept != $full->Department)

        {
 
            $dept = $full->Department;
            $phone = $full->WorkPhone != 0 ? $full->WorkPhone : '';
	        $cellphone = $full->Cellphone != 0 ? $full->Cellphone : '';
            $name = $full->Name;
            $position = $full->Position;
            $department = $full->Department;
            $mail = $full->Mail;
            $id = $full->ID;

        }

    }
                $modx->setPlaceholders(array(
                'dept' => $dept,
                'phone' => $phone,
                'cellphone' => $cellphone,
                'name' => $name,
                'position' => $position,
                'mail' => $mail,
                'id' => $id,
                ),'ep.');
$mysqli->close();
Чанк:
[[!usr1]]  

        <table class="uk-table uk-table-hover uk-table-small uk-margin-small uk-table-responsive">
        <tr align="center">
            <td class="uk-text-emphasis" colspan=5> 
                <h3 class="uk-heading-line uk-text-center"><span>[[+ep.dept]]</span></h1>
            </td>
        </tr>
        <tr align="left" onMouseOver="className='hilighton';" onmouseout="className='hilightoff';">
            <td>
                <div uk-lightbox>
                    <a class="uk-text-emphasis" uk-tooltip="title: Посмотреть профиль; pos: top-left" href='[[~3]]?userid=[[+ep.id]]' data-type="iframe">[[+ep.name]]</a>
                </div>
            </td>
            <td>[[+ep.position]]</td>
            <td align=\"center">[[+ep.cellphone]]</td>
            <td>
                <a class="uk-text-emphasis" uk-tooltip="title: Позвонить; pos: top-center" href=callto:" . $phone . ">[[+ep.phone]]</a>
            </td>
            <td>
                <a class="uk-icon-link" uk-tooltip="Написать письмо" uk-icon="mail" href=mailto:[[+ep.mail]]>[[+ep.mail]]</a>
            </td>
        </tr>
        </table>
    Николай Савин
    10 декабря 2022, 22:43
    0
    Вы точно в MODX работаете?
      Pavel
      12 декабря 2022, 10:34
      0
      точно. не обращайте внимание на куски из джумлы. я от туда сайт переписываю, это все уйдет в финале.
        Николай Савин
        12 декабря 2022, 11:19
        0
        Тогда я вам рекомендую вообще отказаться от этих кусков и использовать MODX API для обращения к базе данных, а также шаблонизатор для вывода информации
      Константин Ильин
      12 декабря 2022, 11:43
      0
      Вы опишите задачу которую вы пытаетесь решить, если не трудозатратно попробуем решить средствами модх, а не так как вы это делаете.

      На счет кода HTML в сниппете, тут нужно использовать parseChunk передавая ему массив данных. И так же рекоменду использовать Fenom, а не стандартный MODX шаблонизатор
      <?
      //про феном 
      {'!usr1' | snippet} а не [[!usr1]]
      В сниппет:
      <?
      $arr = ['name' => 'Вася', 'country' => 'Индия'];
      .....
      $pdo = $modx->getService('pdoTools'); // pdoTools должен быть установлен
      return $pdo->parseChunk('названиеЧанка', $arr);
      Сам чанк примерно
      <div>Имя: {$name}<div>
      <div>Страна: {$country}<div>
        Pavel
        14 декабря 2022, 13:47
        0
        Задача вывести список людей из бд. Попробую, что вы написали.
          Николай Савин
          14 декабря 2022, 14:15
          +1
          Для работы с SQL запросами MODX предусматривает насколько путей.
          Самый простой «переходный» вот такой

          $sql = 'Тут чистый SQL';
          $modx->exec($sql);


          Более расширенный вариант

          $sql = "SELECT * FROM modx_users WHERE active = 1";
          // Вариант 1.
          $statement = $modx->query($sql);
          $users = $statement->fetchAll(PDO::FETCH_ASSOC);
          foreach ($users as $user) {
              print $user['username'] .'
          ';
          }
          // Вариант 2. Если не нужно зачитывать данные в массив
          foreach ($modx->query($sql) as $user) {
              print $user['username'] .'
          ';
          }
          Больше примеров вы можете посмотреть здесь
          modzone.ru/blog/2016/02/04/database-queries-using-pdo/

          Это то, что касается чистых SQL запросов. Но компоненты и Ядро MODX используют конструктор запросов и XPDO. Это несколько сложнее и требует чтения документации
            Pavel
            14 декабря 2022, 17:20
            0
            Я пытался с xpdo разобраться. К сожалению дошел до такого же результата с выводом только 1 записи
              Константин Ильин
              14 декабря 2022, 18:08
              0
              У вас код просто устанавливает плейсхолдеры последней записи т.к. вы в цикле не сохраняет общий и предыдущий результат
              disk.yandex.ru/i/xk1UBRLB8wXLTA
              в целом установление плейсхолдеров совсем не нужно.
              Ниже код сниппета и чанка, а так же вызов.

              <?
              // Допустим вы получаете данные через чистый скл как вам подсказал Николай выше или xpdo
              // далее по теории такой код, проходимся в цикле и сохраняем спарсеный html в переменную 
              
              // используем while или foreach, мне по душе второй
              
              Сниппет usr
              // ранее должен быть получен массив с данными $array в этом же сниппете у вас $fullresult
              $out = '';
              $pdo = $modx->getService('pdoTools');
              foreach($array as $arr){
                  $out .=  $pdo->parseChunk('userChunk', $arr);
              }
              return $out;

              Код чанка userChunk пример
              <tr>
                  <td>{$Department}</td>
                  <td>{$phone}</td>
                  <td>{$mail}</td>
                  ..... и т.д.
              </tr>

              ну и все, остается только вызывать сниппет на странице
              <table>
              так {'!usr' | snippet}
              
              или по стандартному [[!usr]]
              </table>
              по итогу должна вывестись таблица

              Ну и совсем простое решение, есть уже готовый сниппет вывода именно пользователей MODX
              <?
              // pdoTools должен быть установлен
              <table>
              {'!pdoUsers' | snippet : [
                  'tpl' => 'userChunk'
              ]}
              </table>
              Вызовете его с пустым tpl и он вам выведет массивы пользователей disk.yandex.ru/i/VVER1xAv2Pn30A
                Pavel
                14 декабря 2022, 18:55
                0
                А почему может быть такая ошибка?

                Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
                 in \core\src\Revolution\modParser.php on line 151
                  Константин Ильин
                  14 декабря 2022, 19:03
                  0
                  memory_limit надо повысить через htaccess или напрямую в php настройках
                    Pavel
                    14 декабря 2022, 19:20
                    0
                    теперь так…
                    Fatal error: Uncaught mysqli_sql_exception: Too many connections in...
                    на эту строку ошибка ведет

                    $mysqli = new mysqli
                      Константин Ильин
                      14 декабря 2022, 19:48
                      0
                      слишком много подключений — Это означает, что достигнуто максимальное количество клиентов, которые могут быть подключены к серверу. Либо клиенту придется ждать выхода другого клиента, либо администратору придется увеличить максимальное количество разрешенных подключений.

                      гугл есть
                    Николай Савин
                    14 декабря 2022, 19:43
                    +1
                    Потому что вы используете MODX3, а код который вам выше показали для MODX2
                      Константин Ильин
                      14 декабря 2022, 19:56
                      0
                      Тогда я умываю руки) я даже не подумал что модх3
                        Николай Савин
                        14 декабря 2022, 20:02
                        +1
                        Я понял это по вот такой строчке
                        \core\src\Revolution\modParser.php
                        Пространство имен появилось только в MODX3

                        pdoTools для MODX3 также есть и работает, но там другие классы. Кроме того сервисы в MODX3 вызываются по другому.
                        Итого вот такой код
                        $pdo = $modx->getService('pdoTools');
                        foreach($array as $arr){
                            $out .=  $pdo->parseChunk('userChunk', $arr);
                        }
                        мы можем преобразовать примерно вот так
                        use ModxPro\PdoTools\Fetch;
                        /** @var Fetch $pdoFetch */
                        $pdoFetch = $modx->services->get(Fetch::class);
                        foreach($array as $arr){
                            $out .=  $pdoFetch->getChunk('userChunk', $arr);
                        }
                          Pavel
                          19 декабря 2022, 11:11
                          0
                          Спасибо. Но ошибка остается.
                            Pavel
                            19 декабря 2022, 11:47
                            0
                            от ошибки удалось избавиться, но теперь выводит кучу пустых строк ((
                  Pavel
                  14 декабря 2022, 17:59
                  0
                  Этот я вариант видел, но не понял, как таким путём вытащить все столбы из таблицы

                  $dept = $full->Department;
                  $phone = $full->WorkPhone;
                  $cellphone = $full->Cellphone;
                  $name = $full->Name;
                  $position = $full->Position;
                  $department = $full->Department;
                  $mail = $full->Mail;
                  $id = $full->ID;
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              19