Вывод всех строк таблицы через 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;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.