• ベストアンサー

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

  • PHP
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.4

idとparentが同一なレコードがあれば永久です。 もしくは、idが既出のparentでも永久です。 一度レコードとSQLを確認してみてはいかがでしょう。 外してたらごめんなさい。

hiro_n19
質問者

お礼

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

その他の回答 (3)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

流し読みのアドバイスですが、 getChildArticleInfoの中のgetChildArticleInfoで 無限ループされてたりはしませんか? あと関係ないですが、DBが同じなら DBのコネクションは使いまわした方がいいような。

hiro_n19
質問者

補足

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

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

$aryTmp=Article::getChildArticleInfo($objArt->getId()); の次が動かないなら Article::getChildArticleInfo() の中が気になります。

hiro_n19
質問者

補足

お返事ありがとうございます。 確かに中略が多くてわかりづらいですね、すみませんでした。 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)
回答No.1

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

hiro_n19
質問者

補足

回答いただき有難うございます。 ::で呼び出しはできないんですね。 おそらく引っかかっているのは再帰的に呼び出すところではあると思うのですが。。。 また別のクラスを作って、そのインスタンスを生成させるということでしょうか? よろしくお願いします。

関連するQ&A

  • phpでの再帰関数を利用したツリー表示

    ・やりたいこと 一つのIDの下にいくつの階層があるかカウントする。 コードは既にできているのですが、いざ運用しようとしたときに Fatal error: Maximum function nesting level of '100' reached, > aborting! と出てしまいました。 色々調べた結果、phpでは100を超える再帰呼び出しはできないというのを見つけました。 本当にできないのでしょうか?他にやる方法はあるのでしょうか? php側の設定で何とかなるもんなんでしょうか? ~~~以下DB構造~~~~~~~~~~~~~~~~~~~~~~ id(int) | lid(int) | rid(int) ~~~以下コード~~~~~~~~~~~~~~~~~~~~~~ Class tree_show { var $i_ = 0; var $ar_ = array(); function findid2($colm) { foreach($colm as $value){ $value = $this->findid($value); } } function findid($id) { if(!empty($id)) { $rs = mysql_query("select * from tree_all where id='".$id."'"); $row = mysql_fetch_array($rs); $dim = $row['id']; $this->i_++; $this->addarray($dim); $arr = array($row['lid'],$row['rid']); $this->findid2($arr); } } function printid() { return $this->i_; } function addarray($dim) { array_push($this->ar_,$dim); } function printarray() { return $this->ar_; } } $id= $_REQUEST[id]; $db = mysql_connect(); $sql = "select * from tree_all where id = '".$id."'"; $rs = mysql_query($sql,$db); $row = mysql_fetch_array($rs); $class = New tree_show(); $class->findid($row['lid']); echo $left = $class->printid(); print_r($class->printarray()); echo "<br>"; $class2 = New tree_show(); $class2->findid($row['rid']); echo $right = $class2->printid(); echo "<br>"; print_r($class2->printarray());

    • ベストアンサー
    • PHP
  • 【PHP】コンストラクタ―について

    コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();

    • ベストアンサー
    • PHP
  • PHP4でのSmarty派生クラスの定義について

    こんにちはよろしくお願いします。 PHP4でSmarty派生クラスを定義する方法を教えてください。 PHP5のサンプルコードで次のようなものがありました。 PHP4では,「private」が使えないらしいとか,「__construct」ではなくてクラス名がコンストラクタ名になるとかでうまくいかないようです。どのように修正すればよいのでしょうか? また,「__destruct」はどのようにすれば良いのでしょうか?コンストラクタ名とデストラクタ名が同じでよいのでしょうか? よろしくお願いします。 <?php require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("sqlite://localhost/samples.db"); } public function __destruct() { $this->_db->disconnect(); } public function getDb() {return $this->_db;} } ?>

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトをprivateプロパティ($_db)に設定しているのですが,query文のところでエラーSELECT * FROM books [nativecode=1046 ** No database selected]となります。ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。なぜコンストラクタ外に出るとエラーになるのかわかりません。どなたかご教示ください。どうぞよろしくお願いします。 下記ソースです。 =====派生クラス======================= <?php $user = "dbuser"; $pass = "dbpassword"; $name = "mobilephp"; $host = "localhost"; require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== ==========メインのPHP=================================== <?php require_once("../MySmarty.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); $stt=$db->query("SELECT * FROM books");←ここでエラーになる $data=array(); while($row=$stt->fetchRow(DB_FETCHMODE_ASSOC)){ $data[]=array("isbn"=>$row['isbn'],"title"=>$row['title'], "publish"=>$row['publish'],"price"=>$row['price']); } $o_smarty->assign("data",$data); $o_smarty->display("structure.html"); ?>

    • ベストアンサー
    • PHP
  • JavaBeansにDBの値を格納

    JavaBeansにDBの値を格納したいのですがやり方がよくわかりません。 どなたかわかる方教えていただけないでしょうか? ちなみにこんなやり方でやってみました。 DAOは int i = 0; while(rs.next()){    jb.setId(i,rs.getString("syouhinid"));    i++; } JavaBeansは private String[] id = null; public void setId(int i, String val){ this.id[i] = val; } public String getId(int i){ return id[i]; } こんな感じです。 部分的ですがこんな感じです。 ソースコードを全部乗せると長くなるので、全部乗せられませんが、 いまいちJavaBeansにDBの値を格納するやり方がわからないので 皆さん色々教えてください。宜しく御願い致します。

  • php pear mdb2に質問です。

    php pear mdb2に質問です。 以下の関数でエラーが出ます。 間違っているところがあれば、回答お願いします。 function product_info($id) { global $db; $res = $db->query("SELECT * FROM product WHERE id=?", array($id)); if ($res != null) { $row = $res->fetchrow(MDB2_FETCHMODE_ASSOC); return $row; } return null; }

    • ベストアンサー
    • PHP
  • phpのthis

    a.phpを作成しました。 thisによるアクセスが可能かと思ったのですが、やはりできないのでしょうか。 ===a.php==== <?php $val = 1 ; method(); function method(){ echo $val; echo $this -> val; } ?> ===a.phpここまで===== 別のphpファイル(try.php)には以下内容を記述しました。 ===try.php=== <?php class User { private $id; public function get_id(){ return $this->id;} } public function set_id($id){ $this->id=$id; } ?> 質問: なぜ、 「try.phpでは、$idにthisでアクセスできるのでしょうか? (returnの違いかと思いましたが、set関数はreturnがないのでretrunでもないと思っています。) a.phpでは、thisで valにアクセスできないのでしょうか?」 try.phpは、classを付けてクラス作成しているから、$idにthisでアクセスできるのでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • Codelgniterのコンストラクタ記述方法

    PHP5 で Codelgniter (Ver2.0.3-1) を使用してコンストラクタを書く方法につきお尋ねします。 ある参考書で Codelgniter の使用法を学習していますが、その本のフォーム処理のためのコントローラーの例文として下記の記述があります(一部要約)。 Class Form extends Controller { function Form(){ parent:: Controller(); $this->load->helper('url'); $this->load->library('form_validation'); $this->form_validation->set_rules('name', '名前', required); } } ところがこのコンストラクタは PHP4 形式で記述しているとの注記が付いています。 このコンストラクタを PHP5 形式で Codelgniter (Ver2.0.3-1) を使用して書くにはどのようにすれば良いでしょうか? ネスト形式で次のようにすれば良いですか? Class Form extends CI_Controller { function Form(){ public function __construct(){ parent:: construct(); } $this->load->helper('url');   中略 } }

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトを privateプロパティ($_db)に設定しているのですが$_dbの値が アクセサメソッドを通じてgetすると空白になってしまいます。 色々やってみましたが理由が分からず、 ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。 なぜコンストラクタ外に出るとprivateプロパティの値が取得できなくなるのか分かりません。 どなたかご教示ください。 どうぞよろしくお願いします。 下記ソースです。 *(Smarty.classの派生クラス)********************************************** <?php require_once("DB.php"); require_once("Smarty.class.php"); class MySmarty extends Smarty{ private $_db; public function __construct(){ parent::__construct(); $this->template_dir="C:/xampp/modules/access_control/templates"; $this->compile_dir="C:/xampp/modules/access_control/templates_c"; $this->config_dir="C:/xampp/config"; $this->config_load("access_control.conf",basename($_SERVER['SCRIPT_NAME'],".php")); $tihs->_db=DB::connect($this->get_config_vars('db_string')); if (PEAR::isError($db)) { die($db->getMessage()); } } public function __destruct(){ $this->_db->disconnect(); } public function get_db(){return $tihs->_db;} } ?> *********************************************** *(メインのPHP)********************************************** <?php require_once("../../modules/access_control/class/MySmarty.class.php"); require_once("../../modules/access_control/class/name_search.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); ←ここで値が取得できない $o_smarty->assign("toolname",name_search::getToolName($db)); $o_smarty->display(basename($_SERVER['SCRIPT_NAME'],".php").".tpl"); ?> ***********************************************

    • ベストアンサー
    • PHP
  • クラスで永続的な値を持たせたい

    親クラスが保持している値(ここではID)を維持して それぞれの子クラスが利用できるようにしたいのですが、 次のようなやり方だと維持できないようです。 どのようにすればクラスを利用する場合に永続的な値を 持たせることができるのでしょうか? class oya {  var $ID = 0;  function setID($ID) { $this->ID = $ID; }  function getNextID() { return $this->ID + 1; } } class sub1 extends oya {  function sub1 () {$this->setID($this->getNextID());} } class sub2 extends oya {  function sub2 () {$this->setID($this->getNextID());} } $sub1 = new sub1();//←IDが1になる $sub2 = new sub2();//←希望としてはIDが2になってほしいが、IDは1

    • ベストアンサー
    • PHP

専門家に質問してみよう