dポイントプレゼントキャンペーン実施中!

今日からつかえる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でも動作するように変更できないでしょうか?
よろしくお願いします。

A 回答 (4件)

idとparentが同一なレコードがあれば永久です。


もしくは、idが既出のparentでも永久です。
一度レコードとSQLを確認してみてはいかがでしょう。
外してたらごめんなさい。
    • good
    • 0
この回答へのお礼

いろいろ試しましたがダメでした(TT)
もっと勉強しなおしてから挑戦したいと思います。
何度もありがとうございました。

お礼日時:2006/12/14 15:54

流し読みのアドバイスですが、


getChildArticleInfoの中のgetChildArticleInfoで
無限ループされてたりはしませんか?

あと関係ないですが、DBが同じなら
DBのコネクションは使いまわした方がいいような。

この回答への補足

書籍に掲載されているものなので、無限ループはないかと思っていました…
getChildArticleInfoは子記事のさらに孫記事を取りにいくというループなので無限ではないと思われます。
ですが、そこをコメントアウトしたら(出力は正しくないが)実行できましたので、孫記事を探しにいくループの部分が怪しいようです。
ロジック的には間違いないように思うんですが、文法ミスでしょうか??

DBのコネクションはこれができたら修正したいと思います。

補足日時:2006/12/07 18:05
    • good
    • 0

$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_1767 …
こちらにファイルをアップしました。
お手数ですがよろしくお願いいたします。

補足日時:2006/12/07 16:28
    • good
    • 0

PHP5の知識はないのですが・・



Article::getChildArticleInfo($objArt->getId());
ここの呼び出しは、
$objArt->getChildArticleInfo(....
としなければいけないのではないでしょうか?
インスタンス化されていないClassのメソッドだけ呼び出すというのはできないとおもいますが・・・
Static宣言するとできそうな感じもしますが、再帰的な呼び出しをしたいということのようなので、Function内で生成したインスタンスから呼び出すのが正しいのではないでしょうか?

この回答への補足

回答いただき有難うございます。
::で呼び出しはできないんですね。
おそらく引っかかっているのは再帰的に呼び出すところではあると思うのですが。。。

また別のクラスを作って、そのインスタンスを生成させるということでしょうか?
よろしくお願いします。

補足日時:2006/12/07 16:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!