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 :: Версия для печати :: цикл WHILE и цикл FOREACH
Форумы портала PHP.SU » » Вопросы новичков » цикл WHILE и цикл FOREACH

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

1. 3d_killer - 13 Февраля, 2014 - 19:07:36 - перейти к сообщению
странная ситуация получилась у меня в классе использую цикл для подготовки запроса с условием 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
это как так?
2. OrmaJever - 13 Февраля, 2014 - 19:21:08 - перейти к сообщению
3d_killer пишет:
это как так?

это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.
3. 3d_killer - 13 Февраля, 2014 - 19:27:13 - перейти к сообщению
нет как раз while отрабатывает проходит 31 значение и останавливается и выдает правильный результат
(Добавление)
в цикле если я сделаю

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


получаю один и тот же результат, циклы проходят полностью по 31 значению в данном случае
(Добавление)
но у foreach результат не верен пробовал дописывать в бинде PDO:PARAM_INT не помогло
4. Мелкий - 13 Февраля, 2014 - 19:31:13 - перейти к сообщению
PDO?
Имеете в виду, что bindparam получает не значение, а ссылку? Соответственно без дебага в реальности отправляемых значений я не скажу, что вообще происходит.
Собирайте все значения для плейсхолдеров в массив и скармливайте напрямую execute
5. 3d_killer - 13 Февраля, 2014 - 19:35:58 - перейти к сообщению
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.

извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно Не понял
6. Invert - 14 Февраля, 2014 - 08:54:50 - перейти к сообщению
3d_killer пишет:
извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно


Уверены?

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


Тут у вас магия, и как написал OrmaJever, вы должны понимать, что произойдет в этой части кода.
7. 3d_killer - 14 Февраля, 2014 - 12:51: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 ], что соответствует первому элементу в массиве, в чем проблема то?

вопрос совершенно в другом...
8. OrmaJever - 14 Февраля, 2014 - 13:06:20 - перейти к сообщению
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();

и посмотрите чё там будет.
9. 3d_killer - 14 Февраля, 2014 - 13:46:10 - перейти к сообщению
что в данной строке
3d_killer пишет:
хочу использовать FOREACH, но он дает неверный результат WHILE правильный
Вам не понятно?
10. OrmaJever - 14 Февраля, 2014 - 13:55:19 - перейти к сообщению
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();
11. 3d_killer - 14 Февраля, 2014 - 13:57:32 - перейти к сообщению
скорее всего дело в лишнем символе в массиве:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array(4) { [0]=> &string(1) "4" [1]=> &string(1) "5" [2]=> &string(1) "6" [3]=> &string(1) "7" }
  3.  

этом &
12. Мелкий - 14 Февраля, 2014 - 14:08:21 - перейти к сообщению
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();

Это должно повлиять на результат? Что вы видите в реальности? Почему это случилось?
Ответ я вчера вечером уже написал.
13. Tyoma5891 - 14 Февраля, 2014 - 14:09:41 - перейти к сообщению
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.  

этом &

а откуда он там мог взяться это вообщето знак возвращающий адрес в памяти? у Вас в коде используются указатели?
14. 3d_killer - 14 Февраля, 2014 - 14:14:17 - перейти к сообщению
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.  
15. Tyoma5891 - 14 Февраля, 2014 - 14:29:11 - перейти к сообщению
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 будет работать некорректно(как ВЫам бы хотелось) к нему...

 

Powered by ExBB FM 1.0 RC1