【问题标题】:Why i can't use foreach two times in one page?为什么我不能在一页中使用 foreach 两次?
【发布时间】:2017-06-13 11:13:54
【问题描述】:

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

"注意:未定义变量:第 29 行 C:\MAMP\htdocs\blog\app\Database.php 中的 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\n 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} 在第 34 行的 C:\MAMP\htdocs\blog\app\Database.php 中抛出“

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

<div class="row">
 <div class="col-sm-4">
   <ul>
     <?php foreach(\App\Table\Categorie::all() as $categorie): ?>
         <li><a href="<?= $categorie->getUrl(); ?>"><?= $categorie->name;?></a></li>
     <?php endforeach; ?>
  </ul>
 </div>
 <div class="col-sm-6">
    <?php foreach(\App\Table\Article::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__);
}

【问题讨论】:

  • 根据报错问题在database.php文件中
  • 您是否尝试过仅使用第二个 foreach 循环?我不认为你的问题是 foreach 循环它是你用来从数据库获取数据的查询。
  • 似乎在第一个foreach 之后,您正在关闭连接(将其分配给null),然后在第二个foreach 之后,您没有任何连接。这真的是你缩小的完整代码吗?
  • 您能否将Categorie::all() 方法的代码添加到您的问题中?
  • 另外,查看您的错误和代码,您的错误代码中有这个query('\r\n SELEC...',这意味着您在查询的开头有和\r\n,所以请更改您的查询并删除\r\n(enter) 在开头,看看你是否得到同样的错误......

标签: php mysql pdo foreach


【解决方案1】:

好的,您的问题是在getPDO() 方法中,您正在检查if($this-&gt;pdo === null){ 然后创建到数据库的连接。但是当在同一个脚本中你想使用getPDO(),因为$this-&gt;pdo不是null,它实际上是与数据库的连接,所以没有进入if块,所以$pdo变量没有得到声明。

解决方案非常简单。您只需将else 部分添加到您的if

因此,在您的 app\Database.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;
}

【讨论】:

  • 谢谢它的工作,我需要了解更多关于 php 你知道任何有用的资源。
  • :) 不客气。不幸的是,不,Google、SO 和 php 文档会对您有很大帮助...
猜你喜欢
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多