为什么我不能在一个页面中使用两次foreach?



我刚开始学习 php,当我尝试在脚本中使用两次foreach时,我遇到了这个问题,我收到此错误:

"注意:未定义的变量:c:\MAMP\htdocs\blog\app\Database.php第 29 行中的 pdo 致命错误:未捕获错误:在 C:\MAMP\htdocs\blog\app\Database.php:34 中调用 null 上的成员函数 query() 堆栈跟踪:#0 C:\MAMP\htdocs\blog\app\Table\Article.php(15): App\Database->query('\r SELEC...', 'App\Table\Artic...') #1 C:\MAMP\htdocs\blog\pages\home.php(10): App\Table\Article::getLast() #2 C:\MAMP\htdocs\blog\public\index.php(20): require('C:\MAMP\htdocs\...') #3 {main} 在 C:\MAMP\htdocs\blog\app\Database.php 在第 34 行抛出"

但是当我使用一次时,它工作正常。这是我使用的代码:

<div class="row">
 <div class="col-sm-4">
   <ul>
     <?php foreach(AppTableCategorie::all() as $categorie): ?>
         <li><a href="<?= $categorie->getUrl(); ?>"><?= $categorie->name;?></a></li>
     <?php endforeach; ?>
  </ul>
 </div>
 <div class="col-sm-6">
    <?php foreach(AppTableArticle::getLast() as $post): ?>
    <?php endforeach; ?>
 </div>

public static function getLast()
{
 return App::getDb()->query("
 SELECT articles.id_article, articles.nom_article, articles.object, articles.photo, category.name as categorie  
 FROM articles 
 LEFT JOIN category 
 ON category_id = category_category_id
 ", __CLASS__);
}

数据库

enter code here
public function query($statement, $class_name, $one = false)
{
    $req = $this->getPDO()->query($statement);
    $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    if($one)
    {
        $data = $req->fetch();
    }
    else 
    {
        $data = $req->fetchAll();
    }
    return $data;
}'

功能全部

private static $table = 'category';
public static function all()
{
    return App::getDb()->query("
        SELECT * 
        FROM " .self::$table ."
        ", __CLASS__);
}

好的,你的问题是在getPDO()方法中,你正在检查if($this->pdo === null){然后创建与数据库的连接。但是,当您在同一脚本中要使用getPDO()$this->pdo因为不是null并且它实际上是与 databse 的连接,因此 is 不会进入 if 块,因此不会声明$pdo变量。

解决方案非常简单。您只需要在if中添加else部分

因此,在您的appDatabase.php文件中,将private function getPDO()更改为以下内容:

private function getPDO() {
    if($this->pdo === null){
        $pdo = new PDO('mysql:dbname=mydb;host=localhost', 'root', '');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;  
    }
    else{
        $pdo = $this->pdo;
    }
    return $pdo;
}

最新更新