这对我来说有点复杂。基本上我最近参与了使用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的连接,所以我不确定如果有一种特定的方法来编写语法。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
在Jim的帮助下,我提出了明确的解决方案:
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;
}
}
由于单个页面上可能有多个内容项,每个内容项可能有不同的模板,因此我在while循环中移动了grabTheTemplate函数调用,以便template_id列中的值可用于检索相关内容模板。我还没有在我的测试服务器上试过这个,但理论上它应该都可以。如果有任何错误,今晚我会尝试编辑这篇文章。