1

我在工作中使用 PL/SQL 和 Oracle DB 参与了 CMS 的开发,我希望使用 PHP 和 MySQL 为我自己的 CMS 复制相同类型的结构。我是过去程序时代的 PHP 程序员,现在我正试图掌握 OOPHP。

我有三张桌子。一个代表一页。另一个代表可以在页面中使用的模板,另一个代表内容。我已经输出了页面的页眉和页脚(存储在页表中),但是我现在需要用内容填充页面。为此,我需要查询模板表并将 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_replacing 它们的一种情况:

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


}

由于单个页面上可能有多个内容项,每个内容项可能有不同的模板,我将 grabTheTemplate 函数调用移动到 while 循环内,以便可以使用来自 template_id 列的值来检索相关模板。我还没有在我的测试服务器上尝试过这个,但理论上它应该都可以工作。我今晚会试试,如果有任何错误,我会编辑这篇文章。

于 2013-02-04T13:09:00.007 回答