Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите, пожалуйста, дополнить запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Помогите, пожалуйста, дополнить запрос

Страниц (2): [1] 2 »
 

1. __Lina__ - 26 Апреля, 2009 - 17:19:38 - перейти к сообщению
Подскажите, пожалуйста! Сама я оч долго буду пробовать и вряд ли смогу сделать. Непосредственно с php малое время работаю, а тут такие умнички сидят, всегда поддержат дельным советом Улыбка
есть база с марками сталей- набор таблиц с разными свойствами.Есть вот такой скрипт для выборки всех нужных данных из таблицы с каким-либо свойством для определенной марки сталей и отрисовки html-таблицы

PHP:
скопировать код в буфер обмена
  1. <?
  2. // коннект к базе
  3. $conn = oci_connect("user", "pass", "database");
  4.  
  5. // выполнение запроса
  6. $sql = "SELECT * FROM tab";
  7. $res = OCIParse($conn, $sql);
  8. oci_execute($res);
  9.  
  10. //начало отрисовки таблицы
  11. echo "<TABLE BORDER=1>";
  12. echo "<TR>";
  13.  
  14. // отрисовка шапки таблицы
  15. for ($i = 1; $i-1 < oci_num_fields($res); $i++) {
  16. echo "<TH>";
  17. echo oci_field_name($res,$i);
  18. echo "</TH>";
  19. }
  20.  
  21. // отрисовка и заполнение самой таблицы
  22. while ($row = oci_fetch_row($res)) {
  23. echo "<TR>";
  24. for ($i = 0; $i < $fields=count($row); $i++) {
  25. echo "<TD>".$row[$i]."</TD>";
  26. }
  27. echo "</TR>";
  28. }
  29. echo "</TR></TABLE>";  
  30.     oci_close($conn)
  31. ?>;


бывают случаи, когда для какой-то стали один из столбцов таблицы бд не содержит в себе никаких занчений. Тогда скрипт отрисовывает шапку с названием столбца и соответсвенно пустые ячейки.
Можно ли как-то дополнить этот скрипт таким условием-"если для такой-то марки стали такое-то значение отсутсвует,то для него не отрисовывать столбец"?
Заранее спасибо
2. Champion - 26 Апреля, 2009 - 17:35:57 - перейти к сообщению
Можно. Способов сразу куча в голову пришли. Только скажи сначала, мы можем по первой строке выборки судить о том какой столбец пустой или это не 100% ?
(Добавление)
Ну "куча" - это я преувеличил. Нормальных только 2. Когда на вопрос ответишь, напишу из них подходящий.
(Добавление)
В общем, если по первой строке можно судить, о том, какой столбец будет целиком пустым, то делаешь fetch одной только первой строки. После этого шапку строишь так же, как делала, но с условием, что в первой строке в этом столбце не пусто. Потом выводишь данные первой строки в таблицу, а потом всех отсальных также, если не пусто.
(Добавление)
Еще приходит в голову такая штука. Всю эту таблицу не построчно выводишь в браузер, а собираешь в строку. Потом str_replace('<td></td>', '', $tablitsa)
(Добавление)
Есть еще один способ. Напишу, если 2 первых не подойдут.
Кстати, я бы такие вещи не так организовывал. Таблицы: марки(марка, id_свойства, значение_свойства), свойства(id, назание). Если и "значение свойства" часто повторяется, то и это в отдельную таблицу.
3. __Lina__ - 26 Апреля, 2009 - 18:31:23 - перейти к сообщению
А у меня так и организованы данные. Есть таблица марок сталей со столбцами id и marka. И есть таблицы со свойствами. Давай для наглядности прям по принтскрину экрана опишу ситуацию.
Для стали вСт6пс просмотрим таблицу механических свойств. Первые пять столбцов имеют какие-то значения, а последующие 7 пустые. Вот как сделать так, чтоб эти последние 7 столбцов вообще не отрисовывались в данном случе.
4. __Lina__ - 26 Апреля, 2009 - 18:36:50 - перейти к сообщению
но бывают случаи, когда в первой строке какой-то столбец пустой, а в последующих -нет.(см. картинку) Там в столбце d4 данные появляются только в третьей строчке.
5. Champion - 26 Апреля, 2009 - 19:41:47 - перейти к сообщению
__Lina__ пишет:
А у меня так и организованы данные. Есть таблица марок сталей со столбцами id и marka. И есть таблицы со свойствами.
А можно структуру этих таблиц? И tab в запросе - это что?
6. __Lina__ - 26 Апреля, 2009 - 19:54:43 - перейти к сообщению
таблица stali со столбцами stal_id(ай ди стали) и marka(название стали). Таблиц со свойстами у меня около 30 (механические свойства, физические свойства, предел выносливости и т.д.), но все они построены по одному принципу.Например,таблица механические свойства : stal_id, id(ай ди этой конкретной записи в таблице), termoobrabotka, sechenie, sb, s02, d5, d4, d10, psi, kcu, tverdost, hrb, hrc. Все таблицы со свойствами связаны с ключевой таблице марок по полю stal_id. В одной таблице со свойствами хранятся сведения об этом свойстве для всех сталей. Запросом мы отбираем только данные, относящиеся к нужной нам стали, и отрисовываем таблицу.
(Добавление)
а в листинге я привела обощенный запрос. tab - это название таблицы в общем случае. Т.е. у меня в коде есть sql запрос к базе для каждой из таблиц свойств -
SELECT * FROM meh_svoystva ;
SELECT * FROM fizich_svoystva; И т.д.
7. Champion - 26 Апреля, 2009 - 20:07:36 - перейти к сообщению
Неудобно спроектирована БД. Это отличается от того, что я говорил. Очень. SQLем тут, как мне теперь представляется, не открутишься. Т.е. какие столбцы пустые - мы все-таки узнаем только после того, как просматриваем целиком выборку? Так получается?
8. __Lina__ - 26 Апреля, 2009 - 20:11:49 - перейти к сообщению
Я просто до этого только учебную базу в access , а с php дела вообще не имела, но диплом писать надо, поэтому что смогла наваяла.
А про пустые столбцы - выходит, что так. Весь массив надо просмотреть сначала и оценить в нем каждую переменную. Вот я и задалась вопросом можно ли это реализовать)
9. Champion - 26 Апреля, 2009 - 20:25:14 - перейти к сообщению
Тогда надо так.
-определяешь количество свойств (N), как ты и делала.
-создаешь массив из N элементов со значениями false. i-й элемент соответствует i-му свойству.
-Таблицу на выводишь в браузер, а формируешь всё это в строку. Пустые свойства выводишь как %номерсвойства%? и попутно меняешь на true iй элемент, если i-e свойство очередной строки не пустое.
-теперь в этом массиве false остался только у тех элементов массива, в которых весь столбец пустой.
-в цикле по этому массиву делаешь если false str_replace("<td>%$i</td>", '', $tabl), а если true то false str_replace("%$i%", '-', $tabl).
Есть тут кривоватость, но с ней потом разберемся. Я спать пошел Улыбка
(Добавление)
__Lina__ пишет:
а с php дела вообще не имела
Тут не в php дело. А в проектировании БД. Не очень хорошо оно получилось
(Добавление)
Смотрю я на наши с тобой IP адреса и вижу: мой 95.220.9.227, твой 95.220.6.227. Бывает же такое)))
10. __Lina__ - 26 Апреля, 2009 - 21:42:13 - перейти к сообщению
Ну первый блин комом)) уже поздно переделывать.
Суть твоего предложения поняла, но как-то пока затрудняюсь все это грамотно реализовать.... не поможешь?))
З.Ы. действительно с ip адресами необычное совпадение)
11. Champion - 27 Апреля, 2009 - 08:49:24 - перейти к сообщению
Я даже знаю, к какому ты провайдеру подключена)) К тому же, которому я).
__Lina__ пишет:
Суть твоего предложения поняла, но как-то пока затрудняюсь все это грамотно реализовать.... не поможешь?))
Ну мне лень всё целиком. Ты скажи, какой пункт не получается, я его тебе поподробнее помогу.

А лучше, если ты попробуешь целиком сделать, а я тогда уже конкретные ошибки подправлю, если они будут
12. valenok - 27 Апреля, 2009 - 09:05:14 - перейти к сообщению
Я вижу как вариант сначала другим запросом найти максимальный размер данных
в ячейках столбца.
--
Соседи =)
13. Viper - 27 Апреля, 2009 - 09:18:53 - перейти к сообщению
а может через if сделать проверку на пустое значение ?

нечто вида
PHP:
скопировать код в буфер обмена
  1. if($row->parametr>'') echo '<td>'.$row->parametr.'<td>';
  2.  

поправьте если ошибся.
14. Roler - 27 Апреля, 2009 - 13:05:13 - перейти к сообщению
Если я правильно понял, то if(empty($var)).
15. __Lina__ - 27 Апреля, 2009 - 13:07:48 - перейти к сообщению
ну это понятно, что empty, я никак сообразить не могу как бы это так написать, чтоб эта переменная по всему столбцу проверялась, и если столбец полностью пустой получается, то не рисовать его

 

Powered by ExBB FM 1.0 RC1