1

私は、PL/SQL と Oracle DB を使用して職場で CMS の開発に携わっており、PHP と MySQL を使用して自分の CMS に同じ種類の構造を複製したいと考えています。私は昔の手続き型の PHP プログラマーで、今は OOPHP を理解しようとしています。

私は3つのテーブルを持っています。1 つはページを表します。もう 1 つはページ内で使用できるテンプレートを表し、もう 1 つはコンテンツを表します。ページのヘッダーとフッター (ページ テーブル内に格納されています) を出力するところまで来ましたが、ページにコンテンツを入力する必要があります。これを行うには、テンプレート テーブルに対してクエリを実行し、html コードを変数に割り当てる必要があります。次に、コンテンツ テーブルを使用して、(テンプレート テーブルからの) 変数に割り当てられた html コード内の特定のタグを、別のテーブルからのコンテンツに置き換える必要があります。たとえば、次のようになります。

テンプレート テーブルにクエリを実行し、html 構造を含む列を取り出します。この構造内には、コンテンツ テーブルの列に関連する [i1] [i2] [i3] などの自己生成タグがあります。私が目指しているのは、これらのタグをコンテンツ テーブルの関連する各列の関連するコンテンツに置き換えることです ([i1] は、関連する行の i1 列のコンテンツに置き換えられます。コンテンツには複数のエントリが存在する可能性があります。各ページの表を使用して、これらを順番に並べます。

私は現在、コンテンツ テーブルから特定のページに関連するすべてのコンテンツの配列を引き出すことに固執しています。古いmysqlインターフェースを使用して手続き的にこれを行う方法は知っていますが、mysqliで適切に行う方法に関する最近の投稿が見つかりません。任意のヒント?

これが私の現在のクラスのセットです:

class Connection extends Mysqli{

    public function __construct($mysqli_host,$mysqli_user,$mysqli_pass, $mysqli_db) {
        parent::__construct($mysqli_host,$mysqli_user,$mysqli_pass,$mysqli_db);
        $this->throwConnectionExceptionOnConnectionError();     
        $this->getUser();
    }

    private function throwConnectionExceptionOnConnectionError(){

        if(!$this->connect_error){
            echo "Database connection established<br/>";
        }else{
        //$message = sprintf('(%s) %s', $this->connect_errno, $this->connect_error);
            echo "Error connecting to the database."; 
        throw new DatabaseException($message);
        }
    }
}

class DatabaseException extends Exception{

}

class Page {

    public function __construct() {
        if(isset($_GET['id'])){
            $id = $_GET['id'];
        }else{      
            $id = 1;
        }       
        get_headers($id);
        get_content($id);
        get_footer($id);
    }

    private function get_headers($pageId){ 
        $retrieveHead = $this->prepare("SELECT header FROM pages WHERE page_id=?");
        $retrieveHead->bind_param('i',$pageId);
        $retrieveHead->execute();
        $retrieveHead->bind_result($header);
        $retrieveHead->fetch();
        $retrieveHead->close();
        echo $header;   
    }

    private function get_footer($pageId){ 
        $retrieveFooter = $this->prepare("SELECT footer FROM pages WHERE page_id=?");
        $retrieveFooter->bind_param('i',$pageId);
        $retrieveFooter->execute();
        $retrieveFooter->bind_result($footer);
        $retrieveFooter->fetch();
        $retrieveFooter->close();
        echo $footer;   
    }

    private function get_content($pageId){
        $retreiveContent = $this->prepare("SELECT * FROM content WHERE page_id=? ORDER BY sequence");
        $retreiveContent->bind_param('i',$pageId);
        $retreiveContent->execute();
    }

}

mySQL について覚えていることから、ここから for ループを実行しますが、この OOP アプローチを使用してこれを行うにはどうすればよいでしょうか。次に、各テンプレートのタグの置換を行うにはどうすればよいでしょうか?

私のテーブル構造は以下にあります。うまくいけば、これは私が探しているものをより明確にするでしょう:

テーブル構造

テンプレートテーブルからのコード列も取得されるように、何らかの方法でクエリを内部結合を実行するように適合させることができると推測していますが、以前にMySQLiとの結合を実際に使用したことがないため、存在するかどうかはわかりません構文を記述する特定の方法。

4

2 に答える 2

1

fetch を使用してループすることもできます。テンプレートへの入力は、それらを str_replace する場合にすぎません。

private function get_content($pageId){

        $theTemplate = grabTheTemplate();

        $retreiveContent = $this->prepare("SELECT * FROM content WHERE page_id=? ORDER BY sequence");
        $retreiveContent->bind_param('i',$pageId);
        $retreiveContent->execute();
        $retreiveContent->bind_result($foo, $bar,$baz);
        while ($retreiveContent->fetch()) {
            //$foo, $bar $baz will be populated for this row.
            //Update the tags in the template.
            $theTemplate = str_replace('tagToReplace','valueToReplaceWith',$theTemplate);
        }
        //$theTemplate is populated with content. Probably want to echo here
        echo $theTemplate;
}
于 2013-02-01T01:06:30.067 に答える
0

ジムの助けを借りて、私は決定的な解決策を思いつきました:

    private function get_content($pageId){
         $retreiveContent = $this->prepare("SELECT template_id, section_title, i1, i2 FROM content WHERE page_id=? ORDER BY sequence");
         $retreiveContent->bind_param('i',$pageId);
         $retreiveContent->execute();
         $retreiveContent->bind_result($template_id, $section_title, $i1, $i2);
            while ($retreiveContent->fetch()) {
            //Variables will be populated for this row.
            //Update the tags in the template.
         $theTemplate = grabTheTemplate($template_id);
         $theTemplate = str_replace('[i1]',$i1,$theTemplate);
         $theTemplate = str_replace('[i2]',$i2,$theTemplate);
         //$theTemplate is populated with content. Probably want to echo here
        echo $theTemplate;
    }


}

1 つのページに複数のコンテンツ アイテムがあり、それぞれが異なるテンプレートを持つ可能性があるため、template_id 列の値を使用して関連するテンプレートを取得できるように、grabTheTemplate 関数呼び出しを while ループ内に移動しました。テストサーバーでこれをまだ試していませんが、理論的にはすべて機能するはずです。今晩試してみて、バグがあればこの投稿を編集します。

于 2013-02-04T13:09:00.007 に答える