Чат Telegram
Группа ВКонтакте
Новый комментарий


ArtemijeKA

stdClass - standart Class?

ivashkevich

Да.

ArtemijeKA

У меня главная работает а на статью перехожу такая ошибка:
Скриншот
Что это может быть?

Включил xdebug и решил проблему так:

// src/MVCExample/Controllers/ArticlesController.php
use \MVCExample\Models\Article;

и еще добавил туда Article::class в

public function view(int $articleId) 
{
        $result = $this->db->query(
            'SELECT * FROM `articles` WHERE id = :id;',
            [':id' => $articleId],
            Article::class
        );
...
}

А так-же конечно поменял метод вывода в шаблоне через геттер

getName();
getText();
// templates/articles/view.php
<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article->getName() ?></h1>
    <p><?= $article->getText() ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich

Всё правильно сделал, так и надо было)

ilyaOrlov

Подскажите, а нельзя ли выводить статью таким методом?

$result = $this -> db -> query('SELECT * FROM `articles` WHERE `id` = ' . $articleId . ';', [], Article::class);

Через конкатенацию?

ivashkevich

Ни в коем случае. Почитайте о SQL-инъекциях.

AxLT

Все работает, только имя автора не выводится

<?php

namespace MyProject\Controllers;

use MyProject\Services\Db;
use MyProject\View\View;
use MyProject\Models\Articles\Article;

class ArticlesController
{
    /** @var View */
    private $view;
    /** @var Db */
    private $db;

    public function __construct()
    {
        $this->view = new View(__DIR__ . '/../../../templates');
        $this->db = new Db();
    }

    public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` WHERE id = :id;',
            [':id' => $articleId],
            Article::class
        );
        var_dump($result);
        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

        $author = $this->db->query(
            'SELECT nickname FROM `users` WHERE id = :id',
            [':id' => $result[0]['authorId']],
            Article::class
        );
        var_dump($author);
        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' => $author]);
    }

}
ivashkevich

Ну так его и нет в шаблоне сейчас =) Если хотите - добавьте.

virtual2018

Первый screenshot в описании метода _set по-моему не на месте.
описание картинки
По тексту мы только добавили в класс Article метод _set, который просто выводит на экран Свойство и Значение, без назначения переменных, а на screenshot-е: правильно (отсутствуют свойства author_id, created_at - мы их только печатаем) и неправильно (свойствам authorId, createdAt уже присвоены правильные значения).

dnldcode

Почему нельзя просто создать в классе переменный с таким же название как и в бд? Зачем создавать отдельную функцию?

ivashkevich

Потому что в БД есть свои правила по именованию столбцов, а в PHP есть стандарты именования переменных PSR. И они разные) Преобразовывать имена полей - это нормально.

AxLT

Когда пытаюсь вывести автора получаю Fatal error:Uncaught Error: Cannot use object of type MyProject\Models\Articles\Article as array in C:\OSPanel\domains\myproject.loc\src\MyProject\Controllers\ArticlesController.php on line 31

<?php
namespace MyProject\Controllers;
use MyProject\Models\Articles\Article;
use MyProject\Services\Db;
use MyProject\View\View;

class ArticlesController
{
    private $view;
    private $db;

    public function __construct()
    {
        $this->view = new View(__DIR__ . '/../../../Templates');
        $this->db = new Db();
    }
    public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` WHERE id = :id;',
            [':id' => $articleId],
            Article::class
        );
        var_dump($result);
        if ($result == false){
            $result = $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }
        $author = $this->db->query(
            'SELECT nickname FROM `users` WHERE id = :id',
            [':id' => $result[0]['authorId']],
            Article::class
        );
        var_dump($author);
        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
    }
}
ivashkevich

Ну переведите ошибку и всё станет понятно. В продвинутом курсе уже это надо самостоятельно делать.

Maxim

Столкнулся с такой же проблемой. Не понимаю - где тут ошибка. Артём, помогите пожалуйста.

ivashkevich

Написано, что объект класса Article нельзя использовать как массив. В $result объект! А вы ему $result[0]['authorId']]

Pro100Bah

Та же ошибка вылазит, уже xDebug запускал, что-то не помогло.
var_dump() прогонял не пойму, что нужно исправить((
Читал комментарии, тоже до ответа не дошел((

$result[0]['authorId']]  //Что здесь не так?

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article->getName() ?></h1>        <!-- <h1><?//= $article['name'] ?></h1>  Это сменили в Lesson18 -->
    <p><?= $article->getText() ?></p>          <!-- <p><?//= $article['text'] ?></p> Это сменили в Lesson18 -->
    <p><i>Автор: <?= $author['nickname'] ?></i></p>      <!-- Homework 17 -->
<?php include __DIR__ . '/../footer.php'; ?>

ArticlesController.php

<?php

namespace MyProject\Controllers;

use MyProject\Services\Db;
use MyProject\View\View;
use MyProject\Models\Articles\Article;

class ArticlesController
{
    /** @var View */
    private $view;

    /** @var Db */
    private $db;

    public function __construct()
    {
        $this->view = new View(__DIR__ . '/../../../templates');
        $this->db = new Db();
    }

    public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` WHERE id = :id;', [':id' => $articleId]
        );

        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);  // Здесь обрабатываем ошибку
            return;
        }

        $resultAuthor = $this->db->query(
            'SELECT `nickname` FROM `users` WHERE id = :id',
            [':id' => $result[0]['author_id']]
        );

        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' => $resultAuthor[0]]);    //homework17
    }
}
ivashkevich

Да потому что это объект! Как обращаются к свойствам объекта?
Подсказка: не через квадратные скобки.

Dram

Где то вы уже объясняли, не могу найти - зачем комментарии типа
/* @var string /
Только для PhpStorm - что-то он там при этом правильно подсвечивает?

ivashkevich

Да, после этого он знает тип этой переменной и может давать полезные подсказки.

prinzplanloser0514@gmail.com

А почему у нас метод __set вызывается автоматом? underscoreToCamelCase понятно,он используется в другом методе,а __set почему.

ivashkevich

Магический метод __set() - этот абзац читали?

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований