2017-01-27 4 views
-2

私はPHPを学ぶために開始し、私は私のスクリプトで二回foreachを使用しようとすると、私はこのエラーを取得し、この問題を持っている:なぜ私は1ページで2回foreachを使用できないのですか?

"Notice: Undefined variable: pdo in C:\MAMP\htdocs\blog\app\Database.php on line 29 Fatal error: Uncaught Error: Call to a member function query() on null in C:\MAMP\htdocs\blog\app\Database.php:34 Stack trace: #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} thrown in C:\MAMP\htdocs\blog\app\Database.php on line 34"

しかし、ときに私はそれが正常に動作しますforeachの1時間を使用しています。 この私が使用するコードです:

<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__); 
} 
+0

はあなただけ2回目でみました –

+1

database.phpでファイル内にありますforeachループ?私はあなたが問題はforeachがデータベースからデータを取得するために使用しているクエリをループしているとは思わない。 – sT0n3

+0

最初の 'foreach'の後であなたの接続を(' null'に割り当てて)閉じて、次に 'foreach'のために接続していないようです。これはあなたがあなたがそれを細分化したあなたの完全なコードですか? – EhsanT

答えて

1

OK、あなたの問題はそのgetPDO()でありますメソッドを使用している場合は、if($this->pdo === null){をチェックしてから、データベースへの接続を作成します。しかし、同じスクリプトでgetPDO()を使用したい場合、$this->pdonullではありません。実際にはdatabseとの接続であるため、ifブロックを入力しないので、$pdo変数は宣言されません。

解決策は非常に簡単です。あなたはこれにprivate function getPDO()を変更、あなたのapp\Database.phpファイルにだからあなたのif

elseセクションを追加する必要があります。エラーの問題によると

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

ありがとうございます、私はPHPの詳細について学ぶ必要があります。あなたは役に立つリソースを知っていますか? –

+0

:)あなたは大歓迎です。残念ながら、いいえ、Google、SO、PHPのドキュメントはあなたに多くの助けになります... – EhsanT

関連する問題