За последние 24 часа нас посетили 16913 программистов и 1646 роботов. Сейчас ищут 916 программистов ...

Предупреждение foreach

Тема в разделе "PHP для новичков", создана пользователем viphost, 31 мар 2012.

  1. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Подскажите как убрать предупреждение и вывести вместо него текст, что то вроде:
    Вобщем, $id = передает значение поля гетом, но если такого поля нет, выскакивает предупреждение:
    Код (Text):
    1. function cont($id) {
    2.             $result = $this->return($id) ;
    3.             $out = "" ;
    4.             foreach($result as $key => $value) {
    5.                 $out .= "{$value['text]}" ;
    6.             }
    7.        return $out ;
    8.            
    9.        }
    Можно ли как то к foreach прописать условие? что то вроде:
    Код (Text):
    1. if ($id == NULL) {
    2. echo "Данного текста нет" ;
    3. }
    4. Если есть то выводим содержимое foreach
    Ну как то так, вот можно ли это сделать?
    или все же юзать для вывода for?
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Код (Text):
    1. function cont($id = 0) {
    2. $id = abs((int) $id);// если id - это положительное число
    ...
    Код (Text):
    1. if(!$id) {
    2. return print "Данного текста нет" ;
    3. }
    или же я не понял, что нужно.
    В функцию все равно что-то должно быть передано (в твоем варианте), иначе пхп будет ругаться.
    И вообще, если что-то передается постом или гетом, то $a = isset($_GET['a']) ? $_GET['a'] : '';, тогда у тебя всегда будет переменная $a, вне зависимости от того, было ли что-то передано или нет.
     
  3. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    По моему не поняли меня
    Вобщем есть страница адрес ее
    Код (Text):
    1. /index.php?id=2
    Принимаю на странице айди гетом
    Код (Text):
    1. $id = $_GET['id'];
    Затем уже вношу айди в класс и функции в ней, для вывода контента из базы данных
    Проверку на ноль сделать могу, получается, но вот если скажем гетом передать значение 100, а данной новости нет, foreach начинает предупреждать, что нету такого в базе данных, ну и соответственно это очень не красиво и не приятно, хочется вместо предупреждения, вывести именно свой текст, ну или же перекинуть клиента на 404 страницу.
    Можно конечно сделать повторный запрос в базу данный и уже проверять перед выводом, но хочется минимализма и без лишних запросов.
    Вот и получается, то ли дополнительную функцию писать для проверки на существование айди, то ли как то вернуть текст что то вроде "foreachelse"
    ну вот что то вроде того получилось
    Код (Text):
    1. if($result != 0 ) {
    но мне почему то не нравится это
    Вот как хотелось бы
    Код (Text):
    1. foreach($result as $key => $value) {
    2. $out = "....." ;
    3. } else {
    4. $out = "нет данной записи" ;
    5. return $out ;
    6. }
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Не понимать.
    Если id - это число, то для чего там цикл?
    Этот id должен попадать в запрос, искаться по базе, и, если такой новости нет, то выводить уведомление.
     
  5. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Я сам себя иногда не понимаю =)
    А какие варианты посоветуете?
     
  6. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Ну, человекоподобный разум, обычно, делает подобным способом:
    $id = isset($_GET['id']) ? abs((int) $_GET['id']) : 0;
    ...
    тут проверяем на ноль, если нужно.
    ...
    SELECT FROM `news` WHERE `id` = $id
    ..
    смотрим, что вернуло нам. Если такой новости нет - выводим ошибку.
    Если у тебя все новости выводятся - тогда там вообще id не нужен, а если конкретную новость по id достаешь - тогда цикл зачем?
     
  7. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    ну вот я сам себя запутал, на странице статьи, выводятся комменты в цикле, ну и в разделах новости и на главной. Но у меня и новость в цикле ))) переделаю.
    Вот и нужно как то сделать проверку.
    Думаю надо проспаться, уже сутки не сплю, голова не варит.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если используешь библиотеку mysql или mysqli - то там есть num_rows. Если PDO - то, возможно, придётся сперва использовать запрос с COUNT(), ибо rowCount() там может не работать в SELECT-запросах с базой данных MySQL.

    На примере mysql - это может быть как-то так

    Код (PHP):
    1. $res = mysql_query("SELECT * FROM `table` WHERE `id` = {$id}");
    2. if(mysql_num_rows($res) > 0) {
    3.     // выводим записи
    4. } else {
    5.     // посылаем на 404 или что-то такое
    6. } 
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    count(fetchAll(SELECT fields ...)) либо просто fetchColumn(SELECT COUNT() ...), если нужно только количество.
     
  10. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Всем спасибо все получилось, но еще одна проблема, выскакивает нотик в случае нулевого результата.
    Notice: Undefined variable: result in
    Код (Text):
    1. function comments($id) {
    2.             $sql = "SELECT * FROM comments WHERE news = {$id}";
    3.                 $res = $this->sql($sql) ;
    4.                  while($row = mysql_fetch_array($res)) {
    5.                   $result[$row['id']] = $row ;  
    6.                   }
    7.             return $result ;              
    8.         }
    собственно и ругается на
    Код (Text):
    1. return $result ;
    Это можно как то побороть? Ошибки отключать не хочется
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Перед строкой
    while(...) {
    добавь
    $result = array();
     
  12. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Спасибо помогло =)
    Т.е. данной строкой указывается что $result является именно массивом а не чем то другим?
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Данной строкой этот массив создаётся. Даже если в него ничего не было добавлено, массив всё равно существует (пустой). Соответственно, функции есть что вернуть.
     
  14. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    все понял, еще раз спасибо