- ベストアンサー
php5のコンストラクタをphp4仕様に変えたいです。
今日からつかえるPHP5サンプル集を使ってphpの練習をしています。 この中にDBを使った掲示板のサンプルがあり、DBの出入力をクラスファイルで行っています。 そのphp5の__constract()を使っている部分を、php4に対応した形にしようとして躓いています。 以下、コードです。一部編集しています。 【Article.class.php】 class Article { //*この部分を追加 function Article() { $this->__construct(); }// function __construct(){ /* コンストラクタ */ } var $_id; …中略 function getId(){return $this->_id;} …中略 function setId($id){$this->_id=$id;} …中略 function getArticleInfo($cnt,$num){ $aryArt=array(); $db=DB::connect("mysql~"); $rs=$db->query("SELECT * FROM bbs_master WHERE parent=0 ORDER BY sdat DESC LIMIT ".$cnt.",".$num); while($row=$rs->fetchRow(DB_FETCHMODE_ASSOC)){ $objArt=new Article(); $objArt->setId($row['id']); …中略 //*これ以下を実行するとieで"ページを表示できません。"が出る $aryTmp=Article::getChildArticleInfo($objArt->getId()); $objArt->setChild($aryTmp); $aryArt[]=$objArt; } return $aryArt; } function getChildArticleInfo($id){ …各記事の子記事を抽出するプログラム } return $aryArt; } } PEARの読み込みやDB接続は成功しているのは確認済みです。 上記コード中の再帰的にArticle::getChildArticleInfo($objArt->getId());を呼び出しているところで実行できなくなるようです。 これをphp4でも動作するように変更できないでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
idとparentが同一なレコードがあれば永久です。 もしくは、idが既出のparentでも永久です。 一度レコードとSQLを確認してみてはいかがでしょう。 外してたらごめんなさい。
その他の回答 (3)
- tany180sx
- ベストアンサー率63% (239/379)
流し読みのアドバイスですが、 getChildArticleInfoの中のgetChildArticleInfoで 無限ループされてたりはしませんか? あと関係ないですが、DBが同じなら DBのコネクションは使いまわした方がいいような。
補足
書籍に掲載されているものなので、無限ループはないかと思っていました… getChildArticleInfoは子記事のさらに孫記事を取りにいくというループなので無限ではないと思われます。 ですが、そこをコメントアウトしたら(出力は正しくないが)実行できましたので、孫記事を探しにいくループの部分が怪しいようです。 ロジック的には間違いないように思うんですが、文法ミスでしょうか?? DBのコネクションはこれができたら修正したいと思います。
- tany180sx
- ベストアンサー率63% (239/379)
$aryTmp=Article::getChildArticleInfo($objArt->getId()); の次が動かないなら Article::getChildArticleInfo() の中が気になります。
補足
お返事ありがとうございます。 確かに中略が多くてわかりづらいですね、すみませんでした。 getChildArticleInfo()は、さらに子記事を抽出する処理を行っています。 function getChildArticleInfo($id){ $aryArt=array(); $db=DB::connect("mysql~"); $stt=$db->prepare("SELECT * FROM bbs_master WHERE parent=? ORDER BY sdat ASC"); $rs=$db->execute($stt,$id); while($row=$rs->fetchRow(DB_FETCHMODE_ASSOC)){ $objArt=new Article(); $objArt->setId($row['id']); $objArt->setTitle($row['title']); $objArt->setSdat($row['sdat']); $objArt->setDeleted($row['deleted']); $objArt->setLevel($row['level']); $aryTmp=Article::getChildArticleInfo($objArt->getId()); $objArt->setChild($aryTmp); $aryArt[]=$objArt; } return $aryArt; } http://proxy.f3.ymdb.yahoofs.jp/bc/4577c199_1767a/bc/Article.class.php?bc0j8dFBL4YvwCcp こちらにファイルをアップしました。 お手数ですがよろしくお願いいたします。
- Ka-Wa
- ベストアンサー率46% (12/26)
PHP5の知識はないのですが・・ Article::getChildArticleInfo($objArt->getId()); ここの呼び出しは、 $objArt->getChildArticleInfo(.... としなければいけないのではないでしょうか? インスタンス化されていないClassのメソッドだけ呼び出すというのはできないとおもいますが・・・ Static宣言するとできそうな感じもしますが、再帰的な呼び出しをしたいということのようなので、Function内で生成したインスタンスから呼び出すのが正しいのではないでしょうか?
補足
回答いただき有難うございます。 ::で呼び出しはできないんですね。 おそらく引っかかっているのは再帰的に呼び出すところではあると思うのですが。。。 また別のクラスを作って、そのインスタンスを生成させるということでしょうか? よろしくお願いします。
お礼
いろいろ試しましたがダメでした(TT) もっと勉強しなおしてから挑戦したいと思います。 何度もありがとうございました。