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


tomsonst 04.09.2018 в 21:01

Долго провозился с использованием переменной в запросе

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

    if ($result === []) {
        $this->view->renderHtml('errors/404.php');
        return;
    }

    $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' =>$author[0][0]]);
}
ivashkevich 05.09.2018 в 23:44

Автора стоит получать только после того, как проверили что массив не пустой.

demyanovpaul@yandex.ru 07.11.2018 в 14:20

В экшне ArticlesController::view() после получения статьи, добавьте ещё один запрос на получение автора этой статьи из таблицы users. Выведите nickname автора в шаблоне.

С помощью Join соединил две таблички и без лишних обращений к базе забрал себе пользователей, дополнительно в списке статей тоже вывел авторов. Курс по БД прошел не зря=)

//MainController.php
public function main()
    {
        $articles = $this->db->query('SELECT * FROM `articles` a JOIN `users` u ON a.author_id = u.id');
        $this->view->renderHtml('main/main.php', ['articles' => $articles]);
    }
//main.php
<?php include __DIR__ . '/../main/header.php'; ?>
<?php foreach ($articles as $article): ?>
    <h2><a href="/articles/<?= $article['id'] ?>"><?= $article['name'] ?></a></h2>
    <p><?= $article['text'] ?></p>
    <p>Автор: <i><?= $article['nickname'] ?></i></p>
    <hr>
<?php endforeach; ?>
<?php include __DIR__ . '/../main/footer.php'; ?>
//ArticlesController.php
public function view(int $articleId)
    {
        $result = $this->db->query('SELECT * FROM `articles` a JOIN `users` u ON a.author_id = u.id WHERE a.id = :id;',[':id' => $articleId]);

        if ($result === []) {
            $this->view->renderHtml('errors/404.php',[],404);
            return;
        }

        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
    }
//view.php
<?php include __DIR__ . '/../main/header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Автор: <i><?= $article['nickname'] ?></i></p>
<?php include __DIR__ . '/../main/footer.php'; ?>
ivashkevich 08.11.2018 в 10:39

Хорошо, так тоже можно)

computerix 08.11.2018 в 14:03
public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` left join `users` on articles.author_id = users.id where articles.id = :id;' ,
            [':id' => $articleId]
        );
        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
    }
}
ivashkevich 08.11.2018 в 23:33

А почему использовали LEFT JOIN?

computerix 09.11.2018 в 05:11

Да как-то так придумалось) Неверно?

ivashkevich 09.11.2018 в 09:05

Нужно понимать разницу между разными типами JOIN-ов - прочитайте о них. Конкретно здесь должен быть INNER JOIN.

computerix 09.11.2018 в 10:15
public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` inner join `users` on articles.author_id = users.id where articles.id = :id;' ,
            [':id' => $articleId]
        );
        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
    }
}
ivashkevich 12.11.2018 в 01:46

Хорошо!

Todd 09.11.2018 в 01:56

ArticlesController

    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;
        }

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

        if ($result_user === []) {
            $result_user[0]['nickname'] = 'не известно';
        }

        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'nickname' => $result_user[0]['nickname']]);
    }

view

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Имя автора: <?= $nickname ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 09.11.2018 в 09:02

Отлично!

AxLT 09.11.2018 в 22:38
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');
        return;
    }

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

на участке:

 if ($result === []) {
        $this->view->renderHtml('errors/404.php');
        return;

renderHtml должен принимать на вход два аргумента, и при таком коде у меня ошибка, исправил на:

 $this->view->renderHtml('errors/404.php', []);

Вопрос почему у вас работает иначе)?

Todd 10.11.2018 в 02:35

А можно увидеть функцию renderHtml ? второй аргумент должен иметь дефолтное значение, ощущение что у Вас он не задан, но могу ошибаться)

ivashkevich 12.11.2018 в 01:48

Привет! Вот код:

public function renderHtml(string $templateName, array $vars = [], int $code = 200)
    {
        http_response_code($code);

        extract($this->extraVars);
        extract($vars);

        ob_start();
        include $this->templatesPath . '/' . $templateName;
        $buffer = ob_get_contents();
        ob_end_clean();

        echo $buffer;
    }

Второй аргумент по умолчанию равен пустому массиву.

AxLT 12.11.2018 в 23:17

Да действительно упустил
Спасибо

AxLT 12.11.2018 в 23:05

Сделал так

 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;
        }

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

И есть один вопрос, View на вход принимает $articleId, так вот мне не совсем понятно каким образом эта переменная задается ив какой именно момент она получает свои значения "1" "2"

ivashkevich 12.11.2018 в 23:16

Норм сделал. То что и нужно было.

AxLT 13.11.2018 в 00:03

Там снизу еще вопрос есть)

ivashkevich 13.11.2018 в 21:55

Не понял вопроса. Напиши по нему лучше в личку в телеге.

bildep 18.11.2018 в 19:30

ArticlesController.php

<?php
namespace MyProject\Controllers;

use MyProject\Services\Db;
use MyProject\View\View;

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;
        }

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

        $result[0]['author'] = $author[0]["nickname"];

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

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Автор: <?= $article['author'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 19.11.2018 в 22:02

Лучше не засовывать автора внутрь статьи. Пусть пробрасывается отдельной переменной.

alepawka 02.01.2019 в 13:55
$articles = $this->db->query('SELECT A.id,A.name,A.text,B.nickname FROM `articles` A INNER JOIN `users` B ON A.`author_id` = B.`id`;');/*Изменил запрос в MainController*/
public function view(int $articleId)
        {
            $result = $this->db->query(
                'SELECT A.id,A.name,A.text,B.nickname FROM `articles` A INNER JOIN `users` B ON A.`author_id` = B.`id` WHERE A.id = :id;',
                [':id' => $articleId]
            );/*так же в ActiveController*/
<p>Автор: <?= $article['nickname'] ?></p><!-- добавил автора в main.php и view.php -->
ivashkevich 02.01.2019 в 21:37

Ок)

virtual2018 02.01.2019 в 15:37

В предыдущих уроках header и footer лежали тут:

<?php include __DIR__ . '/../header.php'; ?>
<?php include __DIR__ . '/../footer.php'; ?>

а в этом переехали в

<?php include __DIR__ . '/../main/header.php'; ?>
<?php include __DIR__ . '/../main/footer.php'; ?>
virtual2018 02.01.2019 в 17:11

Для коллекции решений, автора получим в основном запросе выборкой из двух баз и дополнительно электронную почту автора , отдельным запросом с выводом в отдельную переменную:

    public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT a.author_id,a.name,a.text,u.nickname FROM `articles` a, `users` u WHERE a.author_id = u.id and a.id = :id;',
            [':id' => $articleId]
        );

        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

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

        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'mail_to' => $result_users[0]['email']]);
    }
<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p><?= $article['nickname'] ?></p>
    <p><?= $mail_to?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 02.01.2019 в 21:38

Отлично!

dnldcode 06.01.2019 в 00:39

ArticlesController.php

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

        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

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

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h2><?= $article['name'] ?></h2>
    Автор: <?= $article['nickname'] ?>
    <p><?= $article['text'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>

Так можно решить?

ivashkevich 06.01.2019 в 10:41

Это не очень правильно, потому что у $article не должно быть nickname и других полей пользователя.

Bogdan 20.01.2019 в 13:00

Мы столько учили классы и наследования, можем ли мы тут их применить, как это к примеру сделал я?

<?php

namespace MyProject\Controllers;

class ArticlesController extends MainController
{

    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');
            return;
        }

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

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

этим мы вроде как слегка оптимизировали код, убрали

use MyProject\Services\Db;
use MyProject\View\View;

    /** @var View */
    private $view;

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

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

если будет много контроллеров, сделать абстрактный класс, со всеми этими VIew и подклечениями к бд, и от него уже наследоваться. Хотя я может просто бегу впереди паровоза))

ivashkevich 20.01.2019 в 13:19

Да. Отлично! Если уверен, что все контроллеры будут содержать этот код - то твой вариант правильный.

Bugaga159 05.02.2019 в 22:57

ArticlesController

...
$resultAuthor = $this->db->query(
            'SELECT `nickname` FROM `users` WHERE id = :id;',
            [':id'=> $result[0]['author_id']]
        );
        if ($resultAuthor === []){
            $resultAuthor[0]['nickname'] = 'Автор не известен';
        }

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

view

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Автор статьи: <?= $nickname; ?>.</p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 07.02.2019 в 13:04
$resultAuthor[0]['nickname'] = ...

Не надо так. Можно просто завести переменную $nickname в самом начале метода со значением 'Автор не найден'. Если после запроса он есть, то переопределять эту переменную. И в renderHtml передавать её.

excent63 16.02.2019 в 22:07

С помощью комментариев получилось добиться рабочего кода, но где то я что недопонял видимо и теперь немного не понимаю как происходит вывод статей, попробую проходить дальше, если так же не будет доходить, придётся назад возвращаться и перечитывать по новой)

//ArticlesController.php
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;
        }

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

        if ($user === []) {
            $user[0]['nickname'] = 'не известно';
        }

        $this->view->renderHtml('articles/view.php', ['article'=> $result[0], 'nickname' => $user[0]['nickname']],200);
    }
//view.php
<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Имя автора: <?= $nickname ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 17.02.2019 в 22:09

Прочитайте мой ответ выше. Аналогичные пожелания.

Evgeny 24.03.2019 в 19:18

<?php

namespace MyProject\Controllers;

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]);

        if ([] === $result){
            $this->view->renderHtml('/error/404.php', [], 404);
            return;
        }
        $author = $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' => $author[0]]);
    }
}

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
<p><b>Автор: <?= $author['nickname'] ?></b></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 25.03.2019 в 11:34

Отлично

Boodoo 15.04.2019 в 15:38

ArticlesController.php

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

            if($res === []) {
                $this->view->renderHtml('errors/404.php', [], 404);
                return;
            }

            $author_id = $res[0]['author_id'];
            $author = $this->db->query(
                'SELECT * FROM users WHERE id = :id',
                ['id' => $author_id]
            );

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

view.php

<?php include __DIR__ . '/../header.php'; ?>

    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p><?= $author['nickname'] ?></p>

<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 15.04.2019 в 16:48

Отлично!

babls2332@gmail.com 17.04.2019 в 17:02
<?php

namespace Controllers;

use Services\Db;
use View\View;

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($articleId)
    {
        $result = $this->db->query(
            'SELECT * FROM `articles` WHERE id = :id;',
            [':id' => $articleId]
        );

        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }
        $authorId = $result[0]['author_id'];
        $author = $this->db->query(
            'SELECT * FROM `users` WHERE id = :id;',
            [':id' => $authorId]
        );
        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' => $author[0]]);
    }

}

<?php include __DIR__ . '/../header.php'; ?>
<h1>Автор: <?= $author['nickname'] ?></h1>
<h1><?= $article['name'] ?></h1>
<p><?= $article['text'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
<?php

?>
ivashkevich 17.04.2019 в 22:22

Отлично

Dram 15.05.2019 в 14:53
  public function view()
  {
    echo 'Здесь будет получение статьи и рендеринг шаблона';
  }

Все нормально по адресу http://localhost/articles/1 я вижу "Здесь будет получение статьи и рендеринг шаблона".
Стоит изменить эту функцию на

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

И я снова получаю ту ошибку, о которой писал ранее:

( ! ) Fatal error: Uncaught ArgumentCountError: Too few arguments to function MyProject\Controllers\ArticlesController::view(), 0 passed in C:\OSPanel\domains\localhost\index.php on line 32 and exactly 1 expected in C:\OSPanel\domains\localhost\src\MyProject\Controllers\ArticlesController.php on line 22
( ! ) ArgumentCountError: Too few arguments to function MyProject\Controllers\ArticlesController::view(), 0 passed in C:\OSPanel\domains\localhost\index.php on line 32 and exactly 1 expected in C:\OSPanel\domains\localhost\src\MyProject\Controllers\ArticlesController.php on line 22

Вы говорили использовать дебаг, но в каком файле - теперь то их куча. Попробовал поставить красную точку в начале каждого файла и перезапускать страницу - ничего не дало.

P.S. и еще у меня проблема с обратными слешами. Приходиться извращаться например так чтобы все работало

  public function __construct()
  {
    $this->view = new View('C:\OSPanel\domains\localhost\src\templates');
    $this->db = new Db();
  }

и так

  public function renderHtml(string $templateName, array $vars = [])
  {
    extract($vars);

    ob_start();
    include $this->templatesPath . '\\' . $templateName;
    $buffer = ob_get_contents();
    ob_end_clean();

    echo $buffer;
  }
ivashkevich 16.05.2019 в 00:22

Проблема в парсинге регулярки ноута, скорее всего. Не приходит второй аргумент. Напишите в личные сообщения в ВК или телеграме. Что-то много у вас проблем для решения в комментариях.

Dram 16.05.2019 в 17:51

Решение №1, быдлокод :))) просто оно мне первое в голову пришло...

SELECT *
FROM `articles` as t1
INNER JOIN `users` as t2 
WHERE t1.id = :id and t1.author_id = t2.id;',

+ в view.php

    <p><?= $article['nickname'] ?></p>

Говнокод №2 :)) мне кажется опять не правильно... ну как неправильно - данные то выводит, но вероятно не по стандартам написано

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

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

    if ($result === []) {
      $this->view->renderHtml('errors\404.php', [], 404);
      return;
    }

    $this->view->renderHtml('articles\view.php', ['article' => $result[0], 'article2' =>$result2[0]['nickname']]);
  }

+ в view.php

<?= $article2 ?>

прошу критики...

ivashkevich 16.05.2019 в 20:41

Оба решения вполне годные. Я бы предпочел второй вариант.
Но только назовите не article2, а nickname. Имя переменной должно отражать суть значения, которое в ней лежит.

Dram 16.05.2019 в 20:54

Ух ты! Спасибо, не ожидал! Начинает получаться значит :))

ivashkevich 16.05.2019 в 20:58

Видимо)

ashfedor 14.06.2019 в 15:16

Проверять есть ли автор, если есть статья я думаю не стоит, если не прав поправьте
и подумал что стоит получить все данные автора. Вдруг мы захотим еще что либо выводить на странице поста.
Е еще я где то пропустил почему нужно писать $user[0] а не $user?
Это чтоб выбирать по первому ключу?

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 ;
        }

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

        $this->view->renderHtml('articles/view.php', [
            'article' => $result[0],
            'users' => $user[0]
        ]
        );
    }

 для вьюхи
<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p><?= $users['nickname'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 15.06.2019 в 06:33

user[0] - потому что из query тебе вернётся массив записей.

p><?= $users['nickname'] ?></p>

Тут должен быть $user, потому что он там один.

А в остальном - всё супер.

ashfedor 15.06.2019 в 14:03

Спасибо, теперь понял!

Invo 12.07.2019 в 23:32

Controller:

public function view(int $articleId)
    {
        $result = $this->db->query("SELECT articles.name as 'name', articles.text as 'text', users.nickname as 'username'  FROM articles INNER JOIN users ON articles.author_id = users.id WHERE articles.id = :id",
                                    [':id' => $articleId]
                                  );
        var_dump($result);
        if($result === [])
        {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }
        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]);
    }

VIEW:

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['id'] ?></h1>
    <h2> Author : <?= $article['username'] ?>
    <p><?= $article['text'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 14.07.2019 в 06:45

Отлично

Moskva 18.07.2019 в 21:35

Долго мучался, но вроде разобрался)
ArticlesController.php

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

        if ($result === []){
            $this->view->renderHtml('errors/404.php' , [] , 404);
            return;
        }
        $author_id = $result[0]['author_id'];
        $author = $this->db->query(
            'SELECT nickname FROM `users` WHERE id = :id;',
            [':id' => $author_id]);

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

view.php

<?php include __DIR__ . '/../header.php'; ?>
<h1><?= $article['name'] ?></h1>
<p><?= $article['text'] ?></p>
<h4> Автор:  <?= $nickname ?></h4>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 19.07.2019 в 07:00

Отлично!

Metey 20.07.2019 в 20:01
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;
        }
        $result_nick = $this->db->query(
            'SELECT nickname FROM `users` WHERE id = :id;',
            [':id' => $articleId]
        );
        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'nickname' => $result_nick[0]['nickname']]);
    }

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p><?= $nickname ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 21.07.2019 в 05:31

Ошибка здесь:

$result_nick = $this->db->query(
            'SELECT nickname FROM `users` WHERE id = :id;',
            [':id' => $articleId]
        );

Сможете найти?

Metey 21.07.2019 в 23:16

не не нашел, а что здесь не так?

ivashkevich 22.07.2019 в 15:55

Ищете пользователя по id. Вместо id пользователя передаёте id статьи.

Iliusha99 21.07.2019 в 12:38
 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;
        }

//        $this->view->renderHtml('articles/view.php', ['article' => $result[0]]); чтобы не дубликовать запрос

        $query = $this->db->query('SELECT nickname FROM `users` 
                                        WHERE `id` IN ( SELECT author_id FROM `articles` WHERE id = :id );',
          [':id' => $articleId]
        );

        if ($query === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

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

    }
=========================

<?php include __DIR__ . '/../header.php'; ?>
<h1><?= $article['name'] ?></h1>
<p><?= $article['text'] ?></p>
<p>Автор: <?= $author['nickname'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>

http://prntscr.com/ohyof0
http://prntscr.com/ohyojr
ivashkevich 21.07.2019 в 14:20
$query = $this->db->query('SELECT nickname FROM `users` 
                                        WHERE `id` IN ( SELECT author_id FROM `articles` WHERE id = :id );',
          [':id' => $articleId]
        );

Зачем второй раз делаете запрос статьи? У вас уже есть id пользователя в $result.

//        $this->view->renderHtml('articles/view.php',

Не присылайте бесполезные комментарии в ДЗ. В рабочем коде их быть не должно.

if ($query === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

То, что автор не найден, не означает, что на сайте нет статьи, и что нужно показывать 404 ошибку. Придумайте корректное поведение, которое позволит пользователям читать статьи на сайте, даже если автора найти не удалось.

Iliusha99 21.07.2019 в 14:33

Так я знаю что в articles есть id, и думал зачем ещё один запрос, но в ДЗ было написано чтобы сделать ещё один запрос для вывода автора. Проста из-за этого не так понял

ivashkevich 21.07.2019 в 14:43

Ну так запрос для получения пользователя всё равно нужен. Непонятно, зачем вы внутри него снова за статьей идёте.

artemship 11.08.2019 в 02:17

ArticlesController.php:

    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;
        }

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

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

articles/view.php:

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <i>Автор статьи: <?= $author['nickname'] ?? 'Неизвестен' ?></i>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 11.08.2019 в 06:41

Отлично! Образцовая домашка.

Reechniy 18.08.2019 в 17:43
ArticleController.php

<?php

namespace MyProject\Controllers;

use MyProject\Services\Db;
use MyProject\View\View;

class  ArticleController
{
    /** @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;
        }

        $author = $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'=>$author[0]]);
    }
 }

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Имя автора: <?= $author['nickname'] ?></p>
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 18.08.2019 в 18:43

Отлично

khuurak 23.08.2019 в 19:09

ArticlesController.php

public function view(int $articleId)
    {
        $result = $this->db->query(
            'SELECT articles.id, name, text, articles.created_at, users.id, nickname 
                FROM `articles` 
                    INNER JOIN `users` ON articles.author_id = users.id 
                        WHERE articles.id = :id;',
            [':id' => $articleId]
        );

        if ($result === []) {
            $this->view->renderHtml('errors/404.php', [], 404);
            return;
        }

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

templates/articles/view.php

            <?php foreach ($article as $value): ?>
                <h2><?=$value['name']?></h2>
                <em>Автор: <?=$value['nickname']?>. Дата публикации: <?=$value['created_at']?></em>
                <p><?=$value['text']?></p>
                <hr>
            <?php endforeach; ?>
ivashkevich 25.08.2019 в 13:41

Отлично

Blook 27.08.2019 в 18:54
    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;
        }

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

        $this->view->renderHtml('articles/view.php', ['article' => $result[0], 'author' => $author[0][0]]);
    }
ivashkevich 28.08.2019 в 05:58

Отлично!

Pro100Bah 28.09.2019 в 13:10
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
    }
<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p><i>Автор: <?= $author['nickname'] ?></i></p>      <!-- Homework 17 -->
<?php include __DIR__ . '/../footer.php'; ?>

Рабочий получилось сделать, но немного с логикой запутался. Поправьте , если мыслю не совсем верно.

  1. Создаем переменную $resultAuthor. Аргументы у нас на входе запрос($sql) и массив(params=[]).

  2. Дальше не понимаю , что происходит((( .

  3. Потом идет подключение шаблона за счет класса View c методом renderHtml. Как он(renderHtml) работает я понял.
  4. Потом выводим данные в шаблон.
ivashkevich 29.09.2019 в 12:08

Не понял вопроса. Говоришь, что с запросом всё понятно. Что с передачей в шаблон всё понятно. Непонятно только что происходит после запроса. Но после запроса идёт передача в шаблон и между ними ничего нет. И вообще код отличный. В чем проблема?)

prinzplanloser0514@gmail.com 07.10.2019 в 23:11

Не полностью осилил задание,сам запрос я написал нормально,только вот смотрю,как люди делают,и немного не понимаю вот эту часть [':id' => $result[0]['author_id']] мы этой частью как-бы передаём в массиве номер автора,по которому отправляем запрос, например автор 1- admin,автор 2-user?

prinzplanloser0514@gmail.com 07.10.2019 в 23:15

Всё,разобрался,что-то я тупанул,как запрос будет знать,какой id из массива мы запрашиваем,если мы этого не указываем) под вечер уже мозги кипят.

ivashkevich 07.10.2019 в 23:36

Бывает)

dliashchenko 26.10.2019 в 00:59

view.php

<?php include __DIR__ . '/../header.php'; ?>
    <h1><?= $article['name'] ?></h1>
    <p><?= $article['text'] ?></p>
    <p>Автор статьи: <?= $nickname ?></p>
<?php include __DIR__ . '/../footer.php'; ?>

ArticlesController.php

        $result_nickname = $this->db->query(
            'SELECT `nickname` FROM `users` WHERE id = :id;',
            [':id' => $result[0]['author_id']]
        );
        if ($result_nickname === []) {
            $result_nickname[0]['nickname'] = 'без автора';
            return;
        }
        $this->view->renderHtml('articles/view.php', ['article' => $result[0],
            'nickname' => $result_nickname[0]['nickname']]);
ivashkevich 26.10.2019 в 07:48

Отлично

prinzplanloser0514@gmail.com 26.10.2019 в 14:46
SELECT * FROM articles,users WHERE articles.author_id=users.id;

А если я сделал запрос такого вида,как мне подставить нужный параметр в users.id ?

ivashkevich 26.10.2019 в 18:49

Запрос некорректный в принципе.

Логические задачи с собеседований