Вывод всех строк таблицы через 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 в снипете?    Комментарии: 19
                Дошел до такого (с такими же результатами к сожалению...)
Сниппет:
                    Сниппет:
$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>            
                Вы точно в MODX работаете?            
                    
                точно. не обращайте внимание на куски из джумлы. я от туда сайт переписываю, это все уйдет в финале.            
                    
                Тогда я вам рекомендую вообще отказаться от этих кусков и использовать MODX API для обращения к базе данных, а также шаблонизатор для вывода информации            
                    
                Вы опишите задачу которую вы пытаетесь решить, если не трудозатратно попробуем решить средствами модх, а не так как вы это делаете.
На счет кода HTML в сниппете, тут нужно использовать parseChunk передавая ему массив данных. И так же рекоменду использовать Fenom, а не стандартный MODX шаблонизатор
                    На счет кода 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>            
                Задача вывести список людей из бд. Попробую, что вы написали.            
                    
                Для работы с SQL запросами MODX предусматривает насколько путей. 
Самый простой «переходный» вот такой
Более расширенный вариант
modzone.ru/blog/2016/02/04/database-queries-using-pdo/
Это то, что касается чистых SQL запросов. Но компоненты и Ядро MODX используют конструктор запросов и XPDO. Это несколько сложнее и требует чтения документации
                    Самый простой «переходный» вот такой
$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. Это несколько сложнее и требует чтения документации
                Я пытался с xpdo разобраться. К сожалению дошел до такого же результата с выводом только 1 записи            
                    
                У вас код просто устанавливает плейсхолдеры последней записи т.к. вы в цикле не сохраняет общий и предыдущий результат
disk.yandex.ru/i/xk1UBRLB8wXLTA
в целом установление плейсхолдеров совсем не нужно.
Ниже код сниппета и чанка, а так же вызов.
Код чанка userChunk пример
ну и все, остается только вызывать сниппет на странице
Ну и совсем простое решение, есть уже готовый сниппет вывода именно пользователей MODX
                    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            
                А почему может быть такая ошибка?
                    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
 in \core\src\Revolution\modParser.php on line 151            
                memory_limit надо повысить через htaccess или напрямую в php настройках            
                    
                теперь так…
                    Fatal error: Uncaught mysqli_sql_exception: Too many connections in...на эту строку ошибка ведет $mysqli = new mysqli            
                слишком много подключений — Это означает, что достигнуто максимальное количество клиентов, которые могут быть подключены к серверу. Либо клиенту придется ждать выхода другого клиента, либо администратору придется увеличить максимальное количество разрешенных подключений.
гугл есть
                    гугл есть
                Потому что вы используете MODX3, а код который вам выше показали для MODX2            
                    
                Тогда я умываю руки) я даже не подумал что модх3            
                    
                Я понял это по вот такой строчке
pdoTools для MODX3 также есть и работает, но там другие классы. Кроме того сервисы в MODX3 вызываются по другому.
Итого вот такой код
                    \core\src\Revolution\modParser.phpПространство имен появилось только в MODX3pdoTools для 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);
}            
                Спасибо. Но ошибка остается.            
                    
                от ошибки удалось избавиться, но теперь выводит кучу пустых строк ((            
                    
                Этот я вариант видел, но не понял, как таким путём вытащить все столбы из таблицы
                    $dept = $full->Department;
$phone = $full->WorkPhone;
$cellphone = $full->Cellphone;
$name = $full->Name;
$position = $full->Position;
$department = $full->Department;
$mail = $full->Mail;
$id = $full->ID;            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.