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 :: цикл WHILE и цикл FOREACH

 PHP.SU

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


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

> Без описания
3d_killer
Отправлено: 13 Февраля, 2014 - 19:07:36
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




странная ситуация получилась у меня в классе использую цикл для подготовки запроса с условием IN хочу использовать FOREACH, но он дает неверный результат WHILE правильный, в чем причина не пойму. Ниже привожу один и второй цикл (выполняют одно и то же вроде бы):
PHP:
скопировать код в буфер обмена
  1.  
  2. $query="SELECT * FROM table_product WHERE category_id IN (".$placeHolders.")";
  3. $query_product=$DBH->prepare($query);
  4. foreach($this->all_category AS $key=>$value)
  5.         {
  6.                 $query_product->bindParam($key+1,$value);
  7.         }
  8. $query_product->execute();
  9.  

PHP:
скопировать код в буфер обмена
  1.  
  2. $query="SELECT * FROM table_product WHERE category_id IN (".$placeHolders.")";
  3. $query_product=$DBH->prepare($query);
  4. $i=0;
  5. while($this->all_category[$i])
  6.         {
  7.                 $query_product->bindParam($i+1,$this->all_category[$i]);
  8.                 $i++;
  9.         }
  10. $query_product->execute();
  11.  

Запросы выполняются без ошибок, и пробовал ECHO выводить в цикле параметры все выводит правильно, но
в первом случае выводит мне 70 записей
а во втором 2368
это как так?
 
My status
 Top
OrmaJever Модератор
Отправлено: 13 Февраля, 2014 - 19:21:08
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




3d_killer пишет:
это как так?

это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 19:27:13
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




нет как раз while отрабатывает проходит 31 значение и останавливается и выдает правильный результат
(Добавление)
в цикле если я сделаю

и


получаю один и тот же результат, циклы проходят полностью по 31 значению в данном случае
(Добавление)
но у foreach результат не верен пробовал дописывать в бинде PDO:PARAM_INT не помогло
 
My status
 Top
Мелкий Супермодератор
Отправлено: 13 Февраля, 2014 - 19:31:13
Post Id



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


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


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




PDO?
Имеете в виду, что bindparam получает не значение, а ссылку? Соответственно без дебага в реальности отправляемых значений я не скажу, что вообще происходит.
Собирайте все значения для плейсхолдеров в массив и скармливайте напрямую execute


-----
PostgreSQL DBA
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 19:35:58
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




PHP:
скопировать код в буфер обмена
  1. $query="SELECT * FROM table_product WHERE category_id IN (?,?,?)";
  2. $query_product=$DBH->prepare($query);
  3. $query_product->bindParam(1,$this->all_category[0]);
  4. $query_product->bindParam(2,$this->all_category[1]);
  5. $query_product->bindParam(3,$this->all_category[2]);
  6. $query_product->execute();


такое вобщем выражение
(Добавление)
знаю что можно скормить в execute, но мне так неудобно так ка заброс будет намного больше так как будет работать фильтр и условий станет намного больше
(Добавление)
OrmaJever пишет:
это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.

извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно Не понял
 
My status
 Top
Invert
Отправлено: 14 Февраля, 2014 - 08:54:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


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




3d_killer пишет:
извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно


Уверены?

PHP:
скопировать код в буфер обмена
  1. while ( $this->all_category[ $i ] )


Тут у вас магия, и как написал OrmaJever, вы должны понимать, что произойдет в этой части кода.
 
 Top
3d_killer
Отправлено: 14 Февраля, 2014 - 12:51:21
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




тут происходит условие если такое: $this->all_category[ $i ] существует то цикл продолжается, i увеличивается с каждым обходом пока не переберет все значения, в итоге когда в данном условии элемента $i значения не окажится в массиве, данное выраежение будет равно NULL и цикл прекратится, а то что написано:
OrmaJever пишет:
это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.

это как если у меня действительно какой то элемент массива равен 0, ну и что. Цикл продолжит выполнятся, пока данное выражение:
$this->all_category[$i] ДЕЙСТВИТЕЛЬНО!
(Добавление)
может не поняли что это:

это:
var all_category=array();
$i вначале ставлю равное нулю то есть первый проход возьмет значение равное all_category[ 0 ], что соответствует первому элементу в массиве, в чем проблема то?

вопрос совершенно в другом...
 
My status
 Top
OrmaJever Модератор
Отправлено: 14 Февраля, 2014 - 13:06:20
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




3d_killer пишет:
в чем проблема то?

проблема в том что если значение $this->all_category[ $i ] равно 0 или null или false то цикл завершится раньше чем вам хотелось бы.
Нужно использовать isset
PHP:
скопировать код в буфер обмена
  1. while (isset($this->all_category[ $i ]))

(Добавление)
3d_killer самому ошибку найти не сложно. Возьмите функцию var_dump() и раставьте её так

PHP:
скопировать код в буфер обмена
  1. $query="SELECT * FROM table_product WHERE category_id IN (".$placeHolders.")";
  2. var_dump($placeHolders);
  3. $query_product=$DBH->prepare($query);
  4. $i=0;
  5. while($this->all_category[$i])
  6.         {
  7. var_dump($i, $this->all_category[$i]);
  8.                 $query_product->bindParam($i+1,$this->all_category[$i]);
  9.                 $i++;
  10.         }
  11. var_dump($i, $this->all_category[$i]);
  12. $query_product->execute();

и посмотрите чё там будет.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
3d_killer
Отправлено: 14 Февраля, 2014 - 13:46:10
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




что в данной строке
3d_killer пишет:
хочу использовать FOREACH, но он дает неверный результат WHILE правильный
Вам не понятно?
 
My status
 Top
OrmaJever Модератор
Отправлено: 14 Февраля, 2014 - 13:55:19
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




3d_killer пишет:
Вам не понятно?

извиняюсь, не правильно прочитал. Идём по аналогии
PHP:
скопировать код в буфер обмена
  1. $query="SELECT * FROM table_product WHERE category_id IN (".$placeHolders.")";
  2. var_dump($placeHolders);
  3. $query_product=$DBH->prepare($query);
  4. var_dump(count($this->all_category), $this->all_category);
  5. foreach($this->all_category AS $key=>$value)
  6.         {
  7.                 $query_product->bindParam($key+1,$value);
  8.         }
  9. $query_product->execute();


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
3d_killer
Отправлено: 14 Февраля, 2014 - 13:57:32
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




скорее всего дело в лишнем символе в массиве:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array(4) { [0]=> &string(1) "4" [1]=> &string(1) "5" [2]=> &string(1) "6" [3]=> &string(1) "7" }
  3.  

этом &
 
My status
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2014 - 14:08:21
Post Id



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


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


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




Know Your Data! Если запрос возвращает данные, но не те - смотрите на то, что он возвращает и то, чтобы хотелось видеть вам. Там нередко сокрыт ответ.

PHP:
скопировать код в буфер обмена
  1. $query="SELECT * FROM table_product WHERE category_id IN (".$placeHolders.")";
  2. $query_product=$DBH->prepare($query);
  3. foreach($this->all_category AS $key=>$value)
  4.         {
  5.                 $query_product->bindParam($key+1,$value);
  6.         }
  7. $value = 0;
  8. $query_product->execute();

Это должно повлиять на результат? Что вы видите в реальности? Почему это случилось?
Ответ я вчера вечером уже написал.


-----
PostgreSQL DBA
 
 Top
Tyoma5891
Отправлено: 14 Февраля, 2014 - 14:09:41
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


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




3d_killer пишет:
скорее всего дело в лишнем символе в массиве:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array(4) { [0]=> &string(1) "4" [1]=> &string(1) "5" [2]=> &string(1) "6" [3]=> &string(1) "7" }
  3.  

этом &

а откуда он там мог взяться это вообщето знак возвращающий адрес в памяти? у Вас в коде используются указатели?
 
 Top
3d_killer
Отправлено: 14 Февраля, 2014 - 14:14:17
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




PHP:
скопировать код в буфер обмена
  1.  
  2. private function all_categorys($id)
  3.         {
  4.                 global $DBH;
  5.                 $id_category = $DBH->prepare("SELECT `id` FROM table_catalog WHERE parent=:parent");   
  6.                 $id_category->bindParam(':parent',$id);
  7.                 $id_category->execute();
  8.                 while($res=$id_category->fetch())
  9.                         {
  10.                                 $this->all_category[]=$res['id'];
  11.                                 $this->all_categorys($res['id'],$index);
  12.                         }
  13.         }
  14.  
 
My status
 Top
Tyoma5891
Отправлено: 14 Февраля, 2014 - 14:29:11
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013  


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




3d_killer пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. private function all_categorys($id)
  3.         {
  4.                 global $DBH;
  5.                 $id_category = $DBH->prepare("SELECT `id` FROM table_catalog WHERE parent=:parent");   
  6.                 $id_category->bindParam(':parent',$id);
  7.                 $id_category->execute();
  8.                 while($res=$id_category->fetch())
  9.                         {
  10.                                 $this->all_category[]=$res['id'];
  11.                                 $this->all_categorys($res['id'],$index);
  12.                         }
  13.         }
  14.  

внимательно изучите прежде чем что-то использовать:
http://www.php.net/manual/ru/pdo...nt.bindparam.php
мне кажется судя по вашему вардампу последнему $this->all_categorys не воспринимается как полный массив, соотвественно foreach будет работать некорректно(как ВЫам бы хотелось) к нему...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB