Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Php и mysql форматирование таблицы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Уважаемые форумчане, не кидайте пожалуйста тряпками, лучше толкните носом, но хоть убей не могу понять почему то что вылетело из 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>
 

Есть стиль
 
.lesson {border:1px solid #cccccc; width:100%; border-collapse:collapse; vertical-align:top;}
 
Но проблема вся в том, что я не могу выставить вывод ровно, то есть что бы номер был под номером, должность под должностью и так далее. а у меня только выходит это:
Помогите пожалуйста, я новиче в этих делах, только познаю, жисть заставила. Спасибо всем.

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 07:21 06-05-2016 | Исправлено: kolka88, 07:39 06-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kolka88
тему видите - MySql/PHP: общие вопросы?
Вот в ней и следовало спрашивать.
 

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

потому, что вы каждую строку рисуете в отдельной таблицы, а значит ширина столбцов в каждой считаетс динамически и не зависит от ширины столбцов другой таблицы.
 
либо выводите все строки в одной таблице, либо задаете в лоб ширину столбцов в таблицах (через css класс, к примеру)
 
у вас сейчас
<table><tr>... одна строка ...</tr></table>
<table><tr>... другая строка ...</tr></table>
 
а должно быть, по видимому
<table><tr>... одна строка ...</tr>
<tr>... другая строка ...</tr></table>
тогда столбцы разных строк будут "связаны" одинаковой шириной

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 07:57 06-05-2016 | Исправлено: Mavrikii, 07:57 06-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо за ответ, но честно говоря я не совсем это понимаю, мне необходимо что бы в каждой строке выводилась информация которую я вытаскиваю из sql, соответственно я создал таблицу с 1 строкой и 5 колонками. Как тогда мне необходимо переделать? Понимает ли printf если в %s выводить сразу несколько данных из массива? Подскажите как сделать правильно? Повторюсь, я только как дня 3 изучаю это все, и очень много непонимания еще... Спасибо!.

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 08:01 06-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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>";

 
и вместо  
do {
} while()
 
используйте просто  
while() {
 
}
убрав $myrow = mysql_fetch_array ($result); до цикла.. зачем лишние телодвижения? а если SQL ничего не вернет? тогда код выдаст ошибку.

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 08:04 06-05-2016 | Исправлено: Mavrikii, 08:07 06-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да вот вроде нашел решение в части динамических столбцов, можно делать ячейке просто width 100px. И вроде все выравнивается. Спасибо большое за советы.

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 09:39 06-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kolka88

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

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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 09:55 06-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Так как я в этом деле вообще новичек то Ваш ответ мне пока не очень был понятен без do кстати выводится только одна строка... Имею ввиду то что я оставил только while. В общем мне просто еще многому надо подучиться...

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 10:37 06-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 11:00 06-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
оставил щас блок:  
 

Код:
 
<?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>";
?>      
 

Вывод 0. Вообще чистый лист где я что не так понял?)

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 11:14 06-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kolka88

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

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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 19:51 06-05-2016 | Исправлено: Mavrikii, 19:51 06-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Да нет, все нормально), вполне не грубо, я примерно так же тыкаю когда по моим вопросам мне порят ахинею но не суть, посмотрел еще раз, поправил код на следующий:

Код:
 
<?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>"
?>      
 

При таком раскладе выводится пост оянно только первая строка из таблицы.... То есть 12 одинаковых строк...

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 02:15 10-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

и что выделенное должно означать?
 
при  
while ($myrow = mysql_fetch_array ($result))
 
цикл будет работать до тех пор, пока mysql_fetch_array будет возвращать построчно результаты запроса. одновременно результаты присваиваются переменной, которая и используется внутри цикла для вывода этих результатов.

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 02:29 10-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
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>"
?>      
 

 
Далее в коде sql запросов я делаю второй запрос и ложу его в переменную myrow2^
 

Код:
 
$result2 = mysql_query ("SELECT num,dol,fio,mobile,email FROM filial WHERE otd='spec'",$db);
$myrow2 = mysql_fetch_array($result2);
 

 
и привожу его соответственно в положенный вид:
 

Код:
 
<?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 ($result2))  
{
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>", $myrow2["num"], $myrow2["dol"], $myrow2["fio"], $myrow2["mobile"], $myrow2["email"]);
  }
 
echo "</table>"
?>      
 

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

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 02:36 10-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kolka88

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

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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 03:50 10-05-2016 | Исправлено: Mavrikii, 03:50 10-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

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

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 04:08 10-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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);

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 04:11 10-05-2016 | Исправлено: Mavrikii, 04:14 10-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Я так понял, я получу единый список, без разделяющей строки отдела. Но как вы наверное уже догадываетесь, все должно быть более юзабельно отдел, под ним список кто в данном отделе сидит, и так далее. Но то что вы написали, для меня вообще не понятно, имею ввиду  

Код:
 
$data = array();
 
// запрос с получением данных  
// SELECT num, dol, fio, mobile, email, otd FROM filial ORDER BY otd, fio
// начинаем цикл
{
  $data[$row['otd']][] = $row;
}
 
и все. после этого в массиве $data будет список в виде
$data['отдел_как_в_базе']  
 

 
Просто не хватает еще знаний...

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 04:25 10-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 04:29 10-05-2016 | Исправлено: Mavrikii, 04:34 10-05-2016
kolka88



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
дает ошибку
 
Что сейчас имеется:

Код:
 
<?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'];  
?>      
 

При таком коде, дает ошибку:

Код:
 
ruk
Warning: Invalid argument supplied for foreach() in Z:\home\sait1\addrbook\index2.php on line 32
 

32 линия соответственно:

Код:
 
foreach($data['ruk'] as $employee)
 

голова закипает... подскажите плз.
 
Добавлено:

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

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

Всего записей: 24 | Зарегистр. 05-11-2006 | Отправлено: 04:58 10-05-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kolka88
ну думайте, это самое важное в программировании - не слепо копировать код, а думать над тем что он делает и почему.
 
видно же, что при наброске кода я копировал куски из предыдущих постов и сделал опечатку
 
 

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

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

Всего записей: 15099 | Зарегистр. 20-09-2014 | Отправлено: 05:58 10-05-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Php и mysql форматирование таблицы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru