Ru-Board.club
← Вернуться в раздел «Web-программирование»

» Php и mysql форматирование таблицы

Автор: kolka88
Дата сообщения: 06.05.2016 07:21
Уважаемые форумчане, не кидайте пожалуйста тряпками, лучше толкните носом, но хоть убей не могу понять почему то что вылетело из sql ни как не поддается форматированию CSS. Вкратце, есть код:

Код:
<?php
include ("blocks/bd2.php"); /* соединяемся с БД */
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Адресная книга</title>
<link href="style_addrbook.css" rel="stylesheet" type="text/css">
</head>
<body>


<?php
$result = mysql_query ("SELECT num,dol,fio,mobile,email FROM filial2 WHERE otd='ruk'",$db);
$myrow = mysql_fetch_array($result);
do {
printf ("<table align='left' class='lesson'>
<tr>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
</tr>
</table>", $myrow["num"], $myrow["dol"], $myrow["fio"], $myrow["mobile"], $myrow["email"]);
}
while ($myrow = mysql_fetch_array ($result));
?>
</body>
</html>
Автор: Mavrikii
Дата сообщения: 06.05.2016 07:57
kolka88
тему видите - MySql/PHP: общие вопросы?
Вот в ней и следовало спрашивать.


Цитата:
то есть что бы номер был под номером, должность под должностью и так далее

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

либо выводите все строки в одной таблице, либо задаете в лоб ширину столбцов в таблицах (через css класс, к примеру)

у вас сейчас
<table><tr>... одна строка ...</tr></table>
<table><tr>... другая строка ...</tr></table>

а должно быть, по видимому
<table><tr>... одна строка ...</tr>
<tr>... другая строка ...</tr></table>
тогда столбцы разных строк будут "связаны" одинаковой шириной
Автор: kolka88
Дата сообщения: 06.05.2016 08:01
Спасибо за ответ, но честно говоря я не совсем это понимаю, мне необходимо что бы в каждой строке выводилась информация которую я вытаскиваю из sql, соответственно я создал таблицу с 1 строкой и 5 колонками. Как тогда мне необходимо переделать? Понимает ли printf если в %s выводить сразу несколько данных из массива? Подскажите как сделать правильно? Повторюсь, я только как дня 3 изучаю это все, и очень много непонимания еще... Спасибо!.
Автор: Mavrikii
Дата сообщения: 06.05.2016 08:04
kolka88
ну логично же.. вынести тег <table> и </table> за пределы цикла.
тут даже языка знать не нужно - элементарная логика


Код: echo "<table align='left' class='lesson'>";
do {
printf ("<tr>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
<td><p>%s</p></td>
</tr>", $myrow["num"], $myrow["dol"], $myrow["fio"], $myrow["mobile"], $myrow["email"]);
} while ($myrow = mysql_fetch_array ($result));
echo "</table>";
Автор: kolka88
Дата сообщения: 06.05.2016 09:39
Да вот вроде нашел решение в части динамических столбцов, можно делать ячейке просто width 100px. И вроде все выравнивается. Спасибо большое за советы.
Автор: Mavrikii
Дата сообщения: 06.05.2016 09:55
kolka88

Цитата:
можно делать ячейке просто width 100px

лучше сделать все в одной таблице.. но, как хотите. я подробно описал что не так и как исправить.
Автор: kolka88
Дата сообщения: 06.05.2016 10:37
Так как я в этом деле вообще новичек то Ваш ответ мне пока не очень был понятен без do кстати выводится только одна строка... Имею ввиду то что я оставил только while. В общем мне просто еще многому надо подучиться...
Автор: Mavrikii
Дата сообщения: 06.05.2016 11:00
kolka88

Цитата:
без do кстати выводится только одна строка... Имею ввиду то что я оставил только while.

разницу между
do {


} while()

и просто
while() {

}

замечаете? курите мануал
http://php.net/manual/ru/control-structures.do.while.php
http://php.net/manual/ru/control-structures.while.php
Автор: kolka88
Дата сообщения: 06.05.2016 11:14
оставил щас блок:


Код:
<?php
echo "<table align='center' class='lesson'>";
while ($myrow = mysql_fetch_array ($result)); {
printf ("<tr>
<td width='80px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='150px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
</tr>", $myrow["num"], $myrow["dol"], $myrow["fio"], $myrow["mobile"], $myrow["email"]);
}

echo "</table>";
?>
Автор: Mavrikii
Дата сообщения: 06.05.2016 19:51
kolka88

Цитата:
где я что не так понял?)

не хочется показаться грубым, но у вас нет проблем со зрением?

ну сравните, разве не видно, что точка с запятой является лишней? она "закрывает" тело цикла после while, поэтому то, что в фигурных скобках, не выполняется циклически, а только один раз после всего цикла.
Автор: kolka88
Дата сообщения: 10.05.2016 02:15
Да нет, все нормально), вполне не грубо, я примерно так же тыкаю когда по моим вопросам мне порят ахинею но не суть, посмотрел еще раз, поправил код на следующий:

Код:
<?php
echo "<table align='center' class='lesson'>";

while ($myrow <= mysql_fetch_array ($result)) {
printf ("<tr>
<td width='80px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='150px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
</tr>", $myrow["num"], $myrow["dol"], $myrow["fio"], $myrow["mobile"], $myrow["email"]);
}

echo "</table>"
?>
Автор: Mavrikii
Дата сообщения: 10.05.2016 02:29

Цитата:
while ($myrow <= mysql_fetch_array ($result))

и что выделенное должно означать?

при
while ($myrow = mysql_fetch_array ($result))

цикл будет работать до тех пор, пока mysql_fetch_array будет возвращать построчно результаты запроса. одновременно результаты присваиваются переменной, которая и используется внутри цикла для вывода этих результатов.
Автор: kolka88
Дата сообщения: 10.05.2016 02:36

Цитата:
while ($myrow <= mysql_fetch_array ($result))

и что выделенное должно означать?

при
while ($myrow =mysql_fetch_array ($result))

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

Я прошу прощения, это все результаты экспериментов. Спасибо, сейчас все выводится как положено. Осталось только в рамки эти дела заключить, но это уже совсем другая история. А Вам просто огромное спасибо.


Добавлено:
А можно задать еще такой вопрос. Получается что в моей таблице в Mysql есть и руководители и специалисты и прочие. Как необходимо сделать правильно, что бы мне их вытаскивать в отдельные массивы? Как вижу это я:
1) Вытаскиваю руководителей:


Код:
<?php
echo "<table align='center' class='lesson'>";
echo "<tr class='pstyle'>
<td align='center'></td>
<td align='center'></td>
<td align='center'>Руководство</td>
<td align='center'></td>
<td align='center'></td>
</tr>";
while ($myrow = mysql_fetch_array ($result))
{
printf ("<tr>
<td width='80px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
<td width='150px'><p>%s</p></td>
<td width='300px'><p>%s</p></td>
</tr>", $myrow["num"], $myrow["dol"], $myrow["fio"], $myrow["mobile"], $myrow["email"]);
}

echo "</table>"
?>
Автор: Mavrikii
Дата сообщения: 10.05.2016 03:50
kolka88

Цитата:
Или есть более правильное решение?

есть, одним запросом можно вытащить и одно и другое (правда могут быть особенности).
нужно знать структуру таблиц и как должны выглядеть выводимые данные.

если все скопом в одной таблице, то можно просто вытащить все, отсортировав по типу.. ну и уже после этого обработать массив данных.
Автор: kolka88
Дата сообщения: 10.05.2016 04:08

Цитата:
есть, одним запросом можно вытащить и одно и другое (правда могут быть особенности).
нужно знать структуру таблиц и как должны выглядеть выводимые данные.

Тут вопрос какой, делаю адресную книгу, ибо в екселе вести не вариант уже. Имеем несколько отделов, больше 10, соответственно я их в БД разделяю отдельной ячейкой которая уникальна для каждого отдела, вывод требуется типа такого, идет строка на ширину всей таблицы и внутри название отдела, а ниже построчно показываются кто в этом отделе сидит, и так далее. Так вот как правильно тогда необходимо сделать? Если вытащить абсолютно все, то как потом разделять данные? сейчас я разделяю запрос по уникальному названию отдела и мне все ясно, а вот как быть с большой выборкой... Туут увы...
Автор: Mavrikii
Дата сообщения: 10.05.2016 04:11
kolka88

Цитата:
сейчас я разделяю запрос по уникальному названию отдела и мне все ясно, а вот как быть с большой выборкой... Туут увы...

отсортировать данные по полю с отделом, к примеру.
тогда при выводе все будут сгруппированы по отделам

SELECT num,dol,fio,mobile,email,otd FROM filial ORDER BY otd, fio

можно просто выбрать всех и потом уже в цикле раскидать в php массив как хочется.

просто как пример
$data = array();

// запрос с получением данных
// SELECT num, dol, fio, mobile, email, otd FROM filial ORDER BY otd, fio
// начинаем цикл
{
$data[$row['otd']][] = $row;
}

и все. после этого в массиве $data будет список в виде
$data['отдел_как_в_базе']

проще всего посмотреть результат сделав
var_dump($data);
Автор: kolka88
Дата сообщения: 10.05.2016 04:25
Я так понял, я получу единый список, без разделяющей строки отдела. Но как вы наверное уже догадываетесь, все должно быть более юзабельно отдел, под ним список кто в данном отделе сидит, и так далее. Но то что вы написали, для меня вообще не понятно, имею ввиду

Код:
$data = array();

// запрос с получением данных
// SELECT num, dol, fio, mobile, email, otd FROM filial ORDER BY otd, fio
// начинаем цикл
{
$data[$row['otd']][] = $row;
}

и все. после этого в массиве $data будет список в виде
$data['отдел_как_в_базе']
Автор: Mavrikii
Дата сообщения: 10.05.2016 04:29
kolka88

Цитата:
Но то что вы написали, для меня вообще не понятно, имею ввиду

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

при выборе одним запросом записи будут сгруппированы по отделам
сотрудник1 отдел1
сотрудник2 отдел1
сотрудник3 отдел2
сотрудник4 отдел2
и так далее..
уже при отображении полученной информации можно выводить ее как только захочется.

но, если вам проще и понятнее отдельными запросами - ваше дело. оптимальнее делать минимум запросов (про время их выполнения это уже отдельная тема)


Цитата:
$data = array();

// запрос с получением данных
// SELECT num, dol, fio, mobile, email, otd FROM filial ORDER BY otd, fio
// начинаем цикл
{
$data[$row['otd']][] = $row;
}


имелось в виду

$data = array();

$result = mysql_query ("SELECT num, dol, fio, mobile, email, otd FROM filial GROUP BY otd, fio",$db);
while ($myrow = mysql_fetch_array ($result))
$data[$row['otd']][] = $row;

все, все данные в массиве $data сгруппированы по отделам, что в нем можно посмотреть просто сделав
var_dump($data);

далее просто

echo 'Отдел №1';
foreach($data['отдел1'] as $employee)
echo $employee['fio'];

echo 'Отдел №2';
foreach($data['отдел2'] as $employee)
echo $employee['fio'];

и так далее.
'отдел1' и 'отдел2' - то, чему равны значения в столбце otd
Автор: kolka88
Дата сообщения: 10.05.2016 04:58
дает ошибку

Что сейчас имеется:

Код:
<?php
include ("blocks/bd2.php"); /* соединяемся с БД */
$data = array();
$result = mysql_query ("SELECT num, dol, fio, mobile, email, otd FROM filial GROUP BY otd, fio",$db);
$myrow = mysql_fetch_array($result);
?>
<?php
while ($myrow = mysql_fetch_array ($result))
$data[$row['otd']][] = $row;
echo 'ruk';
foreach($data['ruk'] as $employee)
echo $employee['fio'];
?>
Автор: Mavrikii
Дата сообщения: 10.05.2016 05:58
kolka88
ну думайте, это самое важное в программировании - не слепо копировать код, а думать над тем что он делает и почему.

видно же, что при наброске кода я копировал куски из предыдущих постов и сделал опечатку



Цитата:
while ($myrow = mysql_fetch_array ($result))  
$data[$row['otd']][] = $row;

не видно, что ли, очевидной опечатки?

если вы не начнете думать логически, то и не нужно вообще заниматься программированием - здесь важно не знание синтаксиса и так далее, нужно думать что и как работает.
Автор: kolka88
Дата сообщения: 10.05.2016 06:06

Цитата:
ну думайте, это самое важное в программировании - не слепо копировать код, а думать над тем что он делает и почему.

Спасибо, пойду думать

Страницы: 1

Предыдущая тема: Задание JS


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.