alleroy
@alleroy
Изучаю фреймворк laravel

Как решить проблему Undefined index: id?

У меня не выводиться новость на странице. Выводиться ошибка

Notice: Undefined index: id in D:\OpenServer\domains\mvc-oop\mvc-oop\www\controllers\News.php on line 21
Notice: Undefined offset: 0 in D:\OpenServer\domains\mvc-oop\mvc-oop\www\classes\AbstractModel.php on line 40
Warning: Invalid argument supplied for foreach() in D:\OpenServer\domains\mvc-oop\mvc-oop\www\views\news\one.php on line 1

В controllers/News.php есть функция actionOne()
<?php

namespace Application\Controllers;

use Application\Models\News as NewsModel;

class News{

    public function actionAll()
    {

        $news = NewsModel::findAll();
        $view = new \View();
        $view->items = $news;
        $view->display('news/all.php');

    }

    public function actionOne()
    {
        $id = $_GET['id'];
        $newsById = NewsModel::findOneByPk($id);
        $view = new \View();
        $view->items = $newsById;
        $view->display('news/one.php');
    }

}


А в AbstractModel есть:
public static function findOneByPk($id)
    {
        $class = get_called_class();
        $sql = 'SELECT * FROM ' . static::$table . ' WHERE id=:id';
        $db = new DB();
        $db->setClassName($class);
        return $db->query($sql, [':id' => $id])[0];
    }


а в самом view/one.php
<?php foreach ($items as $item): ?>
    <h1><?php echo $item->title; ?></h1>
    <div><?php echo $item->author; ?></div>
<?php endforeach; ?>


Не пойму что делаю не так, почему у меня не показывает новость по id?
  • Вопрос задан
  • 9927 просмотров
Пригласить эксперта
Ответы на вопрос 3
qonand
@qonand
Software Engineer
$id = $_GET['id'];
у Вас нет гет-параметра id. Вообще в таких случаях нужно делать проверки на наличие индекса id в глобальном массиве $_GET
Ответ написан
Комментировать
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
судя по всему findOneByPk() null, а для foreach должен быть массив или объект.
Мне кажется что ошибка в архитектуре так как foreach - это перебор массива, а findOneByPk подразумевает одну запись или null, но решить именно эту ошибку можно так:
<?php 
if(isset($items) and is_array($items)){
  foreach ($items as $item){
    echo $item->title;
    .....
  }
}
Ответ написан
slo_nik
@slo_nik Куратор тега PHP
Добрый день.
Начните со следующего:
$id = isset($_GET['id']) ? $_GET['id'] : null;
А дальше посмотрите.
И если findOneByPk выбирает одну запись, то зачем Вам цикл в view/one.php?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы