Вывод результата запроса к БД в несколько столбцов

dirol

Новичок
Вывод результата запроса к БД в несколько столбцов

Приветствую.
Существует такой скрипт, который возвращает результат запроса к базе в виде таблицы.
В данном виде скрипт возвращает результат в виде одной строки, могу сделать в виде одного столбца, но, чтобы в виде двух столбцов - никак не получается.
Что здесь нужно применить? В какую сторону думать?
Я предполагаю так, ввести какую-то переменную, которая будет отвечать за подсчет ячеек, если ячеек в строке больше, например 2х, то создаем новую строку. Правильно?
PHP:
$query = "SELECT * FROM `rec_cat`";
				$result = mysql_query($query);
						echo "<table>";
						echo "<tr>";
						while ($row = mysql_fetch_array($result)) :
							echo "<td><$row[namecategory]</td>"; 
						endwhile;
						echo "</tr>";
						echo "</table>";
 

kruglov

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

dirol

Новичок
Вот кое что нахимичил из своих же старых работ, столбцы формирует, но одни и теже значения повторяются 3 раза

PHP:
$query = "SELECT * FROM `rec_cat`";
				$result = mysql_query($query);
				$colls=2;
				$i=0;
					echo "<table border=1><tr>";
						while ($row = mysql_fetch_array($result)) :
							foreach($row as $key => $values) {
							
							if($i%$colls==0)
							echo "</tr><tr>";
							echo "<td>$row[namecategory]</td>";
							$i++;
							} 
						endwhile;
						echo "</table>";
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
повторяются 3 раза
Ага, полей в таблице у тебя тоже 3...

и зачем ты вывод
echo "<td>$row[namecategory]</td>";
запихнул в
foreach($row as $key => $values) {
-~{}~ 07.02.08 19:34:

dirol
Давай по порядку, не спеша ты словами расскажешь то, что тебе нужно.
Пожалуйста, попонятнее и доступнее.
А то меня терзают смутные сомнения, что мы тебя неправильно поняли.
 

dirol

Новичок
Ага, полей в таблице у тебя тоже 3...
нет, полей 2.
idcategory и namecategory

скрипт приведенный в первом посте выдает вот такую таблицу:
PHP:
<table>
<tr>
<td>Значение1</td><td>Значение2</td><td>Значение3</td>
</tr>
</table>
Т.е. все значения идут в один ряд. Могу сделать, чтобы все значения шли в несколько рядов (строк). Но не могу сделать так, чтобы значения выводились, например, в 2 столбца.
<tr>
<td>Значение1</td><td>Значение2</td>
</tr>
<tr>
<td>Значение3</td><td>Значение4</td>
</tr>
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
ты не ответил на мой вопрос
зачем запихнул в
foreach($row as $key => $values) {
2
if($i%$colls==0)
echo "</tr><tr>";
echo "<td>$row[namecategory]</td>";
Обычно сначала ячейку таблицы выводят, а уж потом закрывают tr по крайней мере в твоем случае.

-~{}~ 07.02.08 19:53:

<td>Значение1</td><td>Значение2</td><td>Значение3</td>
Это значения все твоих $row[namecategory] что есть в таблице?
 

dirol

Новичок
foreach у нас цикл.
проходимся циклом и выводим тот код, который соответствует заданному условию.
Например, если $i=2, то $i делится на $colls без остатка, следовательно выводим </tr><tr> и идем дальше, начинаем выводить <td>$row[namecategory]</td>.

Если $i=1, то $i не делится на $colls без остатка, следовательно сразу же выводим <td>$row[namecategory]</td>

Обычно сначала ячейку таблицы выводят, а уж потом закрывают по крайней мере в твоем случае.
да, пардон

Это значения все твоих $row[namecategory] что есть в таблице?
не понял вопроса, извиняюсь
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
понял вопроса, извиняюсь
Проехали.
у тебя есть таблица
С полями
field1...field2
В них значения
f1-1...f2-1
f1-2...f2-2
f1-3...f2-3
................
f1-N...f2-N

Как ты хочешь вывести эти значения?

-~{}~ 07.02.08 20:10:

В смысле html-ом
 

dirol

Новичок
PHP:
<tr>
<td>f2-1</td>
<td>f2-2</td>
</tr>

<tr>
<td>f2-3</td>
<td>f2-4</td>
</tr>
Именно ТАК вывести у меня вроде как получилось (хотя, проверил, не получилось :) ),
если более подробно, мне нужно следующее:
PHP:
<tr>
<td><a href=index.php?action=f1-1>f2-1</a></td>
<td><a href=index.php?action=f1-2>f2-2</a></td>
</tr>
<tr>
<td><a href=index.php?action=f1-3>f2-3</a></td>
<td><a href=index.php?action=f1-4>f2-4</a></td>
</tr>
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Именно ТАК вывести у меня вроде как получилось, Но, если более подробно, мне нужно следующее:
Молодец.
Ну так допиши в свое
echo "<td>$row[namecategory]</td>";
нужный тебе тег со значением action
foreach тебе здесь не нужен.

-~{}~ 07.02.08 20:24:

ты определись а?
Именно ТАК вывести у меня вроде как получилось (хотя, проверил, не получилось ),
если более подробно, мне нужно следующее:
Как выводил?
<tr>
<td><a href=index.php?action=f1-1>f2-1</a></td>
<td><a href=index.php?action=f1-2>f2-2</a></td>
</tr>
 

coldwind

Новичок
PHP:
<?php
$array = array(1,2,3,4,5,6,7);
$cols = 2;

$i = 0;
echo '<table>';
foreach ($array as $value) {
    if (!$i) {
        echo '<tr>';
        $i = $cols;    
    }
    
    echo '<td>', $value, '</td>';

    if (! --$i) {
        echo '</tr>';
    }
}
if ($i) {
    if ($i > 1) {
        echo '<td colspan="', $i ,'">&nbsp;</td>';
    } else {
        echo '<td>&nbsp;</td>';
    }
    echo '</tr>';
}
echo '</table>';
?>
Цикл foreach меняешь на свой while и массив $array тебе не нужен.

-~{}~ 07.02.08 21:57:

Есть побочный эффект, это если у тебя в выборке нет данных, то будет выводиться пустые тэги <table></table>, но для отправной точки, наверное, подойдет. Далее можно выносить в отдельную функцию, куда передается массив и количество столбцов (по умолчанию можно установить 2, переменная $cols).

Если оформлять как функцию, то получается чуть легче с пустой выборкой: если массив пустой, то возвращаемся из функции (если функция будет возвращать HTML-код, а не выводить его на экран, то возвращаем пустую строку).
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
coldwind
Здесь не принято давать готовые решения.
 

coldwind

Новичок
Mr_Max
Спасибо, учту.

-~{}~ 07.02.08 22:21:

dirol
Сорри, за решение, впредь буду внимательнее.
 

Фанат

oncle terrible
Команда форума
Во-первых, coldwind, твое решение очень длинное. Два вложенных цикла - самое красивое и грамотное решение. Данные из базы дергаются во втором.

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

coldwind

Новичок
*****
Два вложенных цикла - самое красивое и грамотное решение. Данные из базы дергаются во втором.
Насчет длинного решения: все зависит от используемых технологий и абстракций. Например, при использовании XML/XSLT преобразования, можно значительно сократить код (и даже убрать завершающее условие).

А насчет двух вложенных циклов, хотелось бы поподробнее. Особенно о "данные из базы дергаются во втором". Без примера кода сложно судить о красоте и грамотности.
 

Фанат

oncle terrible
Команда форума
Хм. Хоть речь здесь идет явно не об XML, но не затруднит тебя привести здесь код, о котором ты говоришь?
 

TutanXamoN

Новичок
coldwind
ИМХО вот такого решения человеку вполне хватит учитывая то что ето знакомая таблица с заранее подсчитанным кол-вом полей.
 

coldwind

Новичок
*****
PHP:
<?php

$array = array(1,2,3,4,5,6,7);
echo createPseudoTable($array);

function createPseudoTable ($array, $cols = 3)
{
    $dom = new DOMDocument('1.0', 'utf-8');
    $table = $dom->createElement('table');
    $dom->appendChild($table);

    $tr = null;
    $i = 0;
    foreach ($array as $value) {
        if (!$i) {
            $tr = $dom->createElement('tr');
            $table->appendChild($tr);
            $i = $cols;    
        }
        
        $tr->appendChild($dom->createElement('td', $value));
        $i--;
    }
    
    return $dom->saveXML($table);
}

?>
Здесь не используется преобразование (оставляю это на твое усмотрение), и в отличии от предыдущего кода здесь нет добавления пустых ячеек (это либо реализуется после цикла, либо на уровне XSLT преобразования).

Получать же данные из базы данных во вложенном цикле, считаю, не оправданным.

TutanXamoN
Если обратить внимание на фрагмент кода, приведенный автором поста (<td><a href=index.php?action=f1-1>f2-1</a></td>), можно заметить, что выводит он в одной ячейке значение второго столбца, обрамленного ссылкой, где участвует значение первого столбца. В твоем же варианте в первом столбце выводится значение первого столбца таблицы, во втором - второго, что, насколько можно судить по уточнениям, не является конечной задачей.
 
Сверху