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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с фильтрациями значений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Zuldek
Отправлено: 22 Декабря, 2010 - 08:54:03
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




есть массив
CODE (htmlphp):
скопировать код в буфер обмена
  1. for ($i=1; $i<=3; $i++)
  2.                 {
  3.                 $share[$i] = mysql_fetch_array($shares);
  4.                 }

извлекающий от 1 до 3 строк из бд, в зависимости от их наличия.

строки должны выводится хитрым образом на странице таким образом:
первая, - всегда в шапке страницы, а две другие сбоку (html-оболочка для первой строки одна, а для двух боковых выводимых строк, - другая).

В выводе боковых строк подставляется ссылка на эту же страницу, содержащая параметр $st (ключ текущего выводимого значения массива). Этот параметр используется для вывода одного из значений массива в шапке страница. Если параметр не передан, то выводится в шапке 1, а сбоку 2 и 3 значения, Если передано 2, то - 2 в шапке, 1 и 3 сбоку.
CODE (htmlphp):
скопировать код в буфер обмена
  1. if($_GET['st']) {
  2. $st=$_GET['st'];
  3. }
  4. else $st=1;
  5.  
  6. //вывод значения в шапке
  7. ...html...
  8. echo $share[$st]['name'];
  9. ...html...


с первым значением всё просто, а вот дальше для боковых значений код для вывода наверно такой:
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo $share[2]['name']."<a href='/?st=>".2."'</a>";
  2. echo $share[3]['name']."<a href='/?st=>".3."'</a>";

Вот тут у меня проблема мне кажется этот код работать не будет Огорчение , поскольку надо наверно выводить эти 2 или одно(если в базе удалили 1) значение в цикле, как-то перед этим удаляя из массива то значение, которое уже выведено в шапке.. вот как это сделать я не знаю и очень прошу помочь.
 
 Top
JustUserR
Отправлено: 22 Декабря, 2010 - 09:29:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Zuldek пишет:
Извлекающий от 1 до 3 строк из бд, в зависимости от их наличия
Для осуществления извлечения требуемого числа элементов информационных полей из объекта предоставляющего результата запроса к серверу БД - допустимо использования функции mysql_num_rows позволяющих определить целевое количетсво элементов - в случае если в зависимости от вариативного количества элементов производится выполнение различных действия то возможно включения дополнительного услового оператора


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Мелкий Супермодератор
Отправлено: 22 Декабря, 2010 - 09:44:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Zuldek пишет:
извлекающий от 1 до 3 строк из бд, в зависимости от их наличия.

Не согласен. Показан код, жёстко требующий 3 строки. Если строк меньше, элементов массива всё равно будет 3, но пустые будут содержать false вместо массива.

Могу такое предложить:
PHP:
скопировать код в буфер обмена
  1. //вывод первого
  2. $st = ! empty($_GET['st']) ? $_GET['st'] : 1;
  3. echo $share[$st]['name'];
  4. unset($share[$st]);
  5.  
  6. //вывод оставшихся
  7. foreach ($share as $key=>$sh) {
  8. echo $sh['name']."<a href='/?st=>".$key."'</a>";
  9. }


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 22 Декабря, 2010 - 09:52:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
Но пустые будут содержать false вместо массива
Процесс формирования пользовательского содержимого целевой страницы включающей элементы информационных полей выбранных из БД посредством целевого запроса - основан на инерполяции предпоалгаемых индексов в строку что может приводить в ошибке в случае применения в качестве lvalue-значения для запроса индекса константы несоответствующего типа такую как false или null


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Zuldek
Отправлено: 22 Декабря, 2010 - 10:08:59
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




JustUserR пишет:
Для осуществления извлечения требуемого числа элементов

Спасибо, но проблема не с извлечением элементов из бд. Вот полный код извлечения и записи в массив:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  $query = "Select * FROM shares WHERE share_active = 1 ORDER BY share_status ASC";
  2.   if($shares = mysql_query($query)) {
  3.        for ($i=1; $i<=3; $i++)
  4.                 {
  5.                 $share[$i] = mysql_fetch_array($shares);
  6.                 }
  7. }

Извлекаем только те акции у которых active = 1. Максимум их может быть 3, минимум 1, так что $i=1; $i<=3; $i++ вообще говоря лишний.

Но основная проблема состоит именно в правильном выводе значений на странице. Как и описал выше, на странице 2 места вывода значеий массива. 1 место для одной акции, идущей на первом месте в массиве (с наименьшим share_status в бд, которым имеет значения от 1 до 3.) и второе место для вывода всех оставшихся значений массива (дополнительные акции, 1-2, в зависимости от наличия их в бд).

Так вот в выводе каждой дополнительной акции там стоит ссылка на текущую страницу, которая передаёт ей параметр st (см. первый пост), который равен ключу текущего выводимого значения в массиве. Этот ключ используется для вывода главной акции в позиции 1 (шапка страницы).

В идеале, когда из бд извлечены 3 акции и через GET не передан st (страница открыта без параметров), приравниваю его к единице. В месте вывода значения главной акции
echo $share[$st]['name']; в месте вывода двух других акций пишу:
CODE (htmlphp):
скопировать код в буфер обмена
  1.       echo $share[2]['name']."<a href='/?st=>".2."'</a>";
  2.       echo $share[3]['name']."<a href='/?st=>".3."'</a>";

таким образом если посетитель давит на ссылку с st=2, грузится эта же страница, только в шапке выводится уже вторая акция $share[2]['name'];
При этом надо чтобы месте вывода допольнительных акций выводились уже акция 1 (на месте 2, которая отобразилась на месте главной), и акция 3.
Аналогично должно быть и для акции $share[3]['name'] : если она кажется месте главной, то как дополнительные отображаются 1, и 2.
При этом надо чтобы если удалят одну любую (или две) акции из бд, то отображалось бы всё равно всё корректно. Вот не могу сообразить как это сделать(.. вроде надо выводить дополнительные акций в виде одного цикла...

(Отредактировано автором: 22 Декабря, 2010 - 10:12:23)

 
 Top
JustUserR
Отправлено: 22 Декабря, 2010 - 10:19:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Zuldek пишет:
Спасибо, но проблема не с извлечением элементов из бд. Вот полный код извлечения и записи в массив
Пожалуйста! Для реализации предявленной вами формулировки задачи возможно использование копирования определенных значений массива - в таком случае возможно прохождение по его элементам посредством foreach-цикла производящего выборку существующих и определенных элементов на основе внутреннего счетчика - для всех определенных элементов осуществляется копирование в новый массив с последовательной индексацией В таком случае используемых индекс выводимого элемента будет соответстовать порядковому номеру выбранного значеня - и целевая нумерация будет последовательной


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Zuldek
Отправлено: 22 Декабря, 2010 - 10:19:24
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Мелкий пишет:
Не согласен. Показан код, жёстко требующий 3 строки. Если строк меньше, элементов массива всё равно будет 3, но пустые будут содержать false вместо массива.

Хм, верно. Сейчас уберу счётчик из цикла и как условие поставлю истину выражения mysql_query($query). Но вопрос реализации вывода значений (разъяснил его выше) всё равно остался
(Добавление)
JustUserR пишет:
Для реализации предявленной вами формулировки задачи возможно использование копирования определенных значений массива - в таком случае возможно прохождение по его элементам посредством foreach-цикла производящего выборку существующих и определенных элементов

А нельзя-ли использовать уже имеющийся массив значений, отфильтровывая их как-то, исключая элементы по ключу (например в роли главной акции через GET передался параметр st=2, следовательно кажем 2-ую строку массива в месте для главной акции, а в месте для дополнительных акций кажем акции 1 и 3, как. То есть чтобы отобразить доп. акции надо отфильтровать массив share, исключив из него строку с ключём 2, выведя остальные элементы в порядке значений их ключей, то есть 1, 3...?

(Отредактировано автором: 22 Декабря, 2010 - 10:35:20)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Декабря, 2010 - 10:49:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Zuldek пишет:
как условие поставлю истину выражения mysql_query($query)

а mysql_query вернёт всегда значение, эквивалентное истине, если только запрос не содержит синтаксической ошибки. Т.о. в бесконечный цикл уйдёте Закатив глазки

Вот так вернётся массив до 3 элементов:
PHP:
скопировать код в буфер обмена
  1. $shares = array()
  2. $query = "Select * FROM shares WHERE share_active = 1 ORDER BY share_status ASC LIMIT 3";
  3.   if($shares = mysql_query($query)) {
  4.        while ($row = mysql_fetch_array($shares)) {
  5. $shares[]  = $row;
  6.                 }
  7. }


Zuldek пишет:
Но вопрос реализации вывода значений (разъяснил его выше) всё равно остался

Всё в том же выше я уже предложил вариант решения. Не самый изящный, но работать должен.


-----
PostgreSQL DBA
 
 Top
Zuldek
Отправлено: 22 Декабря, 2010 - 12:04:34
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Warning: Cannot use a scalar value as an array in  line 9
  3.  
  4. Warning: Cannot use a scalar value as an array in  line 9
  5.  
  6. Warning: Cannot use a scalar value as an array in  line 9

Попробовал ваш вариант - возникает эта ошибка, если я павельно думаю то это изза того что тут где то вернулась переменная а не массив
CODE (htmlphp):
скопировать код в буфер обмена
  1.   // Формируем запрос на для вывода акций
  2.       $shares = array();
  3.       $query = "Select * FROM shares WHERE share_active = 1 ORDER BY share_status ASC LIMIT 3";
  4.         if($shares = mysql_query($query)) {
  5.              while ($row = mysql_fetch_array($shares)) {
  6.       $shares[] = $row;
  7. }

9 строка - $shares[] = $row;
(Добавление)

в месте вывода оставшихся акций -
Warning: Invalid argument supplied for foreach() in

(Отредактировано автором: 22 Декабря, 2010 - 12:13:54)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Декабря, 2010 - 12:17:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Zuldek пишет:
Попробовал ваш вариант - возникает эта ошибка

Да, косяк, согласен. Запутался в именах переменных, а именно - одна переменная $shares должна делать сразу 2 дела.
PHP:
скопировать код в буфер обмена
  1. $share = array()
  2. $query = "Select * FROM shares WHERE share_active = 1 ORDER BY share_status ASC LIMIT 3";
  3.   if($shares = mysql_query($query)) {
  4.        while ($row = mysql_fetch_array($shares)) {
  5. $share[]  = $row;
  6.                 }
  7. }


А foreach - если он пытался работать как раз после этих ошибок, то ничего удивительного, массива $share то нету, который ему скормить пытаются.


-----
PostgreSQL DBA
 
 Top
Zuldek
Отправлено: 22 Декабря, 2010 - 12:50:50
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




ошибку поправил почти сразу как пост создал ). Спасибо большое, теперь буду думать как обойтись без создания второго массива и искать изящное решение)
 
 Top
JustUserR
Отправлено: 22 Декабря, 2010 - 21:25:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Zuldek пишет:
Буду думать как обойтись без создания второго массива и искать изящное решение
Осуществления предполагаемой вами формулировки задачи заключаемой в реализации устаовки в указанном ассоциативном массиве с индексной индексаций порядка сопоставления внутреннем ключа идентичному соответствующего элементу запрашиваемого числового порядка в области определения размера массива - что может быть осущемствлено посредсвом выбора требуемого реального объекта основанного на внутреннем ключе посредством функций next/reset


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB