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
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
странная ситуация получилась у меня в классе использую цикл для подготовки запроса с условием IN хочу использовать FOREACH, но он дает неверный результат WHILE правильный, в чем причина не пойму. Ниже привожу один и второй цикл (выполняют одно и то же вроде бы):
Запросы выполняются без ошибок, и пробовал ECHO выводить в цикле параметры все выводит правильно, но
в первом случае выводит мне 70 записей
а во втором 2368
это как так?
OrmaJever
Отправлено: 13 Февраля, 2014 - 19:21:08
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
3d_killer пишет:
это как так?
это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
3d_killer
Отправлено: 13 Февраля, 2014 - 19:27:13
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
нет как раз while отрабатывает проходит 31 значение и останавливается и выдает правильный результат (Добавление)
в цикле если я сделаю
получаю один и тот же результат, циклы проходят полностью по 31 значению в данном случае (Добавление)
но у foreach результат не верен пробовал дописывать в бинде PDO:PARAM_INT не помогло
Мелкий
Отправлено: 13 Февраля, 2014 - 19:31:13
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
PDO?
Имеете в виду, что bindparam получает не значение, а ссылку? Соответственно без дебага в реальности отправляемых значений я не скажу, что вообще происходит.
Собирайте все значения для плейсхолдеров в массив и скармливайте напрямую execute
----- PostgreSQL DBA
3d_killer
Отправлено: 13 Февраля, 2014 - 19:35:58
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
такое вобщем выражение (Добавление)
знаю что можно скормить в execute, но мне так неудобно так ка заброс будет намного больше так как будет работать фильтр и условий станет намного больше (Добавление)
OrmaJever пишет:
это так так, потому что когда $this->all_category[$i] равно 0 то цикл while остановится. Нужно знать основы php.
извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно
Invert
Отправлено: 14 Февраля, 2014 - 08:54:50
Частый гость
Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010
Помог: 5 раз(а)
3d_killer пишет:
извиняюсь, но я не понял к чему это написано, вроде знаю основы и циклы составил правильно
Тут у вас магия, и как написал OrmaJever, вы должны понимать, что произойдет в этой части кода.
3d_killer
Отправлено: 14 Февраля, 2014 - 12:51:21
Участник
Покинул форум
Сообщений всего: 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 ], что соответствует первому элементу в массиве, в чем проблема то?
вопрос совершенно в другом...
OrmaJever
Отправлено: 14 Февраля, 2014 - 13:06:20
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
3d_killer пишет:
в чем проблема то?
проблема в том что если значение $this->all_category[ $i ] равно 0 или null или false то цикл завершится раньше чем вам хотелось бы.
Нужно использовать isset
$id_category=$DBH->prepare("SELECT `id` FROM table_catalog WHERE parent=:parent");
$id_category->bindParam(':parent',$id);
$id_category->execute();
while($res=$id_category->fetch())
{
$this->all_category[]=$res['id'];
$this->all_categorys($res['id'],$index);
}
}
внимательно изучите прежде чем что-то использовать: http://www.php.net/manual/ru/pdo...nt.bindparam.php
мне кажется судя по вашему вардампу последнему $this->all_categorys не воспринимается как полный массив, соотвественно foreach будет работать некорректно(как ВЫам бы хотелось) к нему...
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.