【问题标题】:How do I use PDO::FETCH_CLASS with namespace? [closed]如何将 PDO::FETCH_CLASS 与命名空间一起使用? [关闭]
【发布时间】:2020-05-31 12:53:36
【问题描述】:

我正在学习 PHP,现在我正在展示一些关于 PDO 的文章。我在使用 PDO::FETCH_CLASS 和命名空间时遇到了一些问题。

我的文件夹架构:

class/
- Post.php
layout/
-articles/
--articles.php
public/
-index.php (contains my router)

Post.php

namespace App\Articles;

class Post {
    private $id;
    private $name;
    private $content;
    private $date;

    public function getId()
    {
        return $this->id;
    }
    public function getName()
    {
        return $this->name;
    }
    public function getContent()
    {
        return $this->content;
    }
    public function getExcerpt()
    {
        $res = $this->content;
        return (strlen($res) > 150) ? substr($res, 0, 150) . '...' : $res;
    }
    public function getDate()
    {
        return $this->date = date('d-m-Y', $this->date);
    }
}

data.db 只包含四列:id、name(text)、content(text)、created_at(int)

我遇到问题的部分:

use App\Articles\Post;

$pdo = new PDO('sqlite:../data.db', null, null, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
]);
try {
    $query = $pdo->query('SELECT * FROM posts');
    $posts = $query->fetchAll(PDO::FETCH_CLASS, 'Post');
} catch (PDOException $e) {
    $error = $e->getMessage();
}

我尝试了不同的输入,而不是 'Postlike

'App\Articles\'
'App\Articles\Post'
'App\Articles\::POST'
...

我无法让它与 namepsace 一起工作。 它适用于require '../class/Post.php'

这个问题有解决方案还是我应该只使用 require ?

【问题讨论】:

  • @Dlk 我试过了,但还是找不到课程。
  • @Dharman 我不太明白这个帖子。我试过了,但还是不行。在我的自动加载器中,我有 psr-4 到 ```"App\\": "class/"
  • 不工作是什么意思?向我们展示您的 Post 类并向我们展示帖子数据库架构。
  • @Dharman 我已经添加了帖子类

标签: php pdo namespaces


【解决方案1】:

我忘记在 class/ 中添加文件夹 Articles,所以找不到 App\Articles\Post。

【讨论】:

    【解决方案2】:

    PDO 不查找别名类名或解析当前命名空间。所以你必须明确地传递它:

    $query = $pdo->prepare('SELECT * FROM posts');
    $query->execute();
    $posts = $query->fetchAll(PDO::FETCH_CLASS, __NAMESPACE__ . '\\post');
    

    使用query代替prepare会导致pdo错误,我改为prepare。

    如果 NAMESPACE 与类分开,则不能使用它,但可以使用完整路径 'app\controller\post'

    看到这个答案和问题https://stackoverflow.com/a/20176944/12232340

    【讨论】:

    • 你永远不会执行prepare(),但在这种情况下你不需要准备好的语句。您可以简单地拨打query()
    • 你是对的,对不起,我从问题中复制并粘贴了代码,忘记了execute()声明。
    【解决方案3】:

    您好,请尝试阅读有关自动加载类的 somting https://www.php.net/manual/en/language.oop5.autoload.php

    如果您没有在代码中自动加载,只需使用

    use App\Articles\Post;
    

    什么都不做,或者正如你所说的那样,使用 require 是正确的解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2012-02-12
      • 1970-01-01
      • 2012-01-11
      • 2016-09-14
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多