`

【原创】利用smarty模板根据数据库自动生成数据访问层

    博客分类:
  • php
阅读更多

数据库配置文件:db_config.php

<?php
$vhost="localhost";
$vdb="testdb";
$vuname="root";
$vupwd="";
$vcode="utf-8";

?>

 模板文件:t_source.html

<div id="phpcode">
<pre ID="codearea" style="background-color:#F0F0F0;border:1px dotted black">

/*
作者:由martixwang的自动PHP生成器生成
版本:1.0
*/
require_once 'ado.php';
class <{$tablename}> extends ADO{
	<{$classPropertys}>
	<{$propertyGeter}>
	<{$propertySeter}>
	function __construct(){
		parent::__construct();
	}
	public function query($whereExp){
		$result="";
		if(strlen($whereExp)!=0){
		$result=$this->executeQuery("<{$selectsql}> where ".$whereExp, 0, 0);
		}
		else
		{
		$result=$this->executeQuery("<{$selectsql}>",0,0);	
		}
		$returnVal=array();
		$i=0;
		while($row=mysql_fetch_array($result)){
			$vc=new <{$tablename}>();
			<{$propertyAssignstring}>;
			array_push($returnVal,$vc);
			$i++;
		}
		$this->closeConnection();
		return $returnVal;
	}
	public function addNew($new){
		$sqls=array("insert into <{$tablename}> (<{$fieldslist}>) values (".<{$valueslist}>.")");
		$result=$this->executeCommands($sqls);
		return $result;
	}
	public function modifyBy<{$PKfieldName}>($new){
	    //$tempsql=<{$modifysql}>." where <{$PKfieldName}>=".$new->get<{$PKfieldName}>();
	    
	    $sqls=array(<{$modifysql}>." where <{$PKfieldName}>=".$new->get<{$PKfieldName}>());
		$result=$this->executeCommands($sqls);
		return $result;
	}
	public function deleteBy<{$PKfieldName}>($<{$PKfieldName}>){
		$sqls=array("<{$deletesql}>"." where <{$PKfieldName}>=".$<{$PKfieldName}>);
		$result=$this->executeCommands($sqls);
		return $result;
	}
	public function pageCount($whereExp, $pagesize){
		return $this->getPageCount("<{$tablename}>", $whereExp, $pagesize);
	}
	public function rowCount($whereExp){
		return $this->getRowCount("<{$tablename}>",$whereExp);
	}
	public function Exist($whereExp){
		return $this->isExist("<{$tablename}>", $whereExp);
	}
function toJSON()
   {
        $sResult="";
        foreach($this as $key=>$value)
        {
            //根据 http://www.json.org/
            $value=str_replace("\"","\\\"",$value);
            $value=str_replace("\\","\\\\",$value);
            $value=str_replace("/","\\/",$value);
            $value=str_replace("\b","\\b",$value);
            $value=str_replace("\f","\\f",$value);
            $value=str_replace("\n","\\n",$value);
            $value=str_replace("\r","\\r",$value);
            $value=str_replace("\t","\\t",$value);           
             
           if($sResult=="")
              $sResult="\"$key\":\"$value\"";
           else
              $sResult.=" , \"$key\":\"$value\"";
        }
        return "{".$sResult."}";
    }
}
class <{$tablename}>BLL extends <{$tablename}>{
	public function __construct(){
		parent::__construct();
	}
}


</pre>
</div>

 

基于mysql的通用访问类:ado.php

<?php

class ADO{
	private $dbhost;
	private $db="";
	private $uname="";
	private $upwd="";
	private $conn;
	private $query;
	private $code;

	function __construct(){
	   include 'db_config.php';
	   $this->dbhost=$vhost;
	   $this->uname=$vuname;
	   $this->upwd=$vupwd;
	   $this->code=$vcode;
	   //echo "<br>db_config:".$this->dbhost.$this->uname.$this->upwd."<br>";
	   $this->db=$vdb;
	  // $this->connect();
	}
	//public function open_connect(){
	//	$this->connect();
	//}
	private function connect(){
		//echo "db_config".$this->dbhost.$this->uname.$this->upwd;
		$this->conn=mysql_connect($this->dbhost,$this->uname,$this->upwd) or die("connect fail!!!");
		if(!$this->conn) echo "connection database fail!!!<br>".mysql_error();
        mysql_select_db($this->db,$this->conn);
        mysql_query("set names '". $this->code ."'");
	}
	protected  function executeQuery($sql,$pagenumber,$pagesize){
        $this->connect();
		if($pagenumber!=0){
          $sql=$sql." limit ".$pagenumber.",".$pagesize;
		}
		$query=mysql_query($sql,$this->conn);
		return $query;
	}
    //批量提交增删改命令
	protected function executeCommands($sqls){
		$this->connect();
		mysql_query("BEGIN");
		$error=1;
		
		foreach($sqls as $k=>$v){
            
			$result=mysql_query($v,$this->conn);

			if(!$result){
				$error=0;
				//echo $v." 执行失败!<br>";
				break;
			}
			else
			{
				//echo $v." 执行成功!<br>";
			}
		}
		if($error==0){
			mysql_query("ROLLBACK");
		}
		else
		{
		    mysql_query("COMMIT");
		}
		mysql_query("END");
       $this->closeConnection();
		return $error;
	}
	//取得页总数
	protected function getPageCount($tablename,$whereExp,$pagesize){
		$this->connect();
		if(strlen($whereExp)!=0){
           $sql="select ceiling(count(*)/".$pagesize.") as rowcount from ".$tablename." where ".$whereExp;
		}
		else
		{
			 $sql="select ceiling(count(*)/".$pagesize.") as rowcount from ".$tablename;
		}
       $query=mysql_query($sql,$this->conn);
       $row=mysql_fetch_row($query);
       $this->closeConnection();
       $rw= $row[0];
       $this->closeConnection();
       return $rw;

	}
	
	//取得行总数
	protected function getRowCount($tablename,$whereExp){
	   $this->connect();
	   if(strlen($whereExp)!=0){
       $sql="select count(*) as rowcount from ".$tablename." where ".$whereExp;
	   }else {
	   	$sql="select count(*) as rowcount from ".$tablename;//." where ".$whereExp;
	   }
       //echo $sql;
       $query=mysql_query($sql,$this->conn);
       $row=mysql_fetch_row($query);
       $rw= $row[0];
       $this->closeConnection();
       return $rw;
	}
	//按条判断存在性
	protected function isExist($tablename,$whereExp){
	  $this->connect();
      $c=$this->getRowCount($tablename,$whereExp);
      $this->closeConnection();
      if($c!=0) {return 1;} else {return 0;}
	}
	//关闭链接
	protected  function closeConnection(){
		mysql_close();
	}
}


?>

 

 

根据选择定的数据库表,生成dal代码:codecreate.php(这部分代码还没有优化,将就着用吧)

<?php
require "./main.php";
require_once 'ado.php';
class mataRow{
	private $fname="";
	private $ftype="";
	private $pk="";
	
	/**
	 * @return the $fname
	 */
	public function getFname() {
		return $this->fname;
	}

	/**
	 * @return the $ftype
	 */
	public function getFtype() {
		return $this->ftype;
	}

	/**
	 * @return the $pk
	 */
	public function getPk() {
		return $this->pk;
	}

	/**
	 * @param string $fname
	 */
	public function setFname($fname) {
		$this->fname = $fname;
	}

	/**
	 * @param string $ftype
	 */
	public function setFtype($ftype) {
		$this->ftype = $ftype;
	}

	/**
	 * @param string $pk
	 */
	public function setPk($pk) {
		$this->pk = $pk;
	}

	
}
class codeCreate extends ADO{
    private $tablename="";
    private $fields=array();
    private $updatesql="";
    private $selectsql="";
    private $deletesql="";
    private $insertsql="";
    private $fieldInfo=array();
    private $pkFieldName="";

  
	public function getPkFieldName() {
		return $this->pkFieldName;
	}

	public function setPkFieldName($pkFieldName) {
		$this->pkFieldName = $pkFieldName;
	}

	public function __construct($tabname){
		parent::__construct();
    	$this->setTablename($tabname);
    	$this->fieldInfo=$this->getTableInfo();
    }
	public function getUpdatesql() {
		return $this->updatesql;
	}

	public function getSelectsql() {
		return $this->selectsql;
	}

	public function getDeletesql() {
		return $this->deletesql;
	}

	public function getInsertsql() {
		return $this->insertsql;
	}

	public function setUpdatesql($updatesql) {
		$this->updatesql = $updatesql;
	}

	public function setSelectsql($selectsql) {
		$this->selectsql = $selectsql;
	}
	public function setDeletesql($deletesql) {
		$this->deletesql = $deletesql;
	}
	public function setInsertsql($insertsql) {
		$this->insertsql = $insertsql;
	}
	public function getTablename() {
		return $this->tablename;
	}
	public function setTablename($tablename) {
		$this->tablename = $tablename;
	}
	public function getFields() {
		return $this->fields;
	}
	public function setFields($fields) {
		$this->fields = $fields;
	}
	public function getTableInfo(){
		$returnVal=array();
		$i=0;
		$result=$this->executeQuery("desc ".$this->tablename.";",0,0);
		if(!$result) echo "表没有找到,请检查数据库的配置文件db_config.php";
		while($row=mysql_fetch_array($result))
		{
	      $mata=new mataRow();
	      //echo "<br>row:".$row[Field]."<br>".$row[Type]."<br>".$row[Key]."<br>";
	      $mata->setFname($row[Field]);
	      $mata->setFtype($row[Type]);
	      $mata->setPk($row[Key]);
	      if($row[Key]=="PKI"){$this->setPkFieldName($row["Key"]);}
		  $returnVal[$i]=$mata;
		  $i++;	
		}
		$this->closeConnection();
		//print_r($returnVal);
		return $returnVal;
	}  
}

$tablename=$_POST["selectComobo"];
echo "<input type='button' value='返回' onclick='javascript:history.go(-1);' >&nbsp;&nbsp;".
     "<input type='button' value='复制' onclick=\"clipboardData.setData('Text',document.getElementById('codearea').innerHTML);\" />";
echo "<br><P style='color:red'>你选择的表是:".$_POST["selectComobo"]."的类操作代码成功生成!</p>";
if(strlen($tablename)!=0){ 
	$gen=new codeCreate($tablename);
	$gen->setTablename($tablename);
	$rs=$gen->getTableInfo();
	//echo "<br>ddddddddddddd:".$rs[0]->getFname();
	
	//echo "<br>list:".count($rs)."<br>";
	$v=new mataRow();
	$n=count($rs);
	$i=0;
	$PKfieldName="";
	$selectsql="select * from ".$tablename;
	$deletesql="delete from ".$tablename;
	$fieldslist="";
	$valueslist="";
	$fieldvaluelist="";
	$propertyAssignstring="";
	$classPropertys="";
	$propertyGeter="";
	$propertySeter="";
	$tab_head="";
	$tab_body="<{foreach item=v from=\$result}>\n<tr id='row<{\$v->getid()}>'>\n"."12345678".
			"\n<td><a href='#' onclick='addnew(<{\$v->getid()}>)'>增</a>&nbsp;\n".
			"<a href='#' id='delink' onclick='del(<{\$v->getid()}>)'>删</a>&nbsp;\n".
			"<a href='#' onclick='modify(<{\$v->getid()}>)'>改</a>&nbsp;\n<a href='#'>阅</a></td><tr>".
			"\n<{/foreach}>";
	$tds="";
	//"<td style='width:60px'><input type=text id='txt<{$v->getFname()}>' value='<{$v->getContentPostUserName()}>'</td>";
	while($i<$n){
		$v=$rs[$i];
		//echo $v->getFname()."&nbsp;&nbsp;".$v->getFtype()."&nbsp;&nbsp;".$v->getFtype()."&nbsp;&nbsp;".$v->getPk()."<br>";
		$tab_head=$tab_head."<td>".$v->getFname()."</td>\n";
		$tds=$tds."\n<td style='width:60px'><{\$v->get".$v->getFname()."()}></td>\n";
		
		
		
		//$vc->contenttypeid=$row["id"];
		$tempPA="";
		$tempPA="\$vc->".$v->getFname()."=\$row[\"".$v->getFname()."\"]";
		$propertyAssignstring=(strlen($propertyAssignstring)==0?$propertyAssignstring:$propertyAssignstring.";").$tempPA;
		$tempCP="";
		$tempCP="private $".$v->getFname().";";
		$classPropertys=(strlen($classPropertys)==0?$classPropertys:$classPropertys."").$tempCP;
	// 	public function getContenttypeid() {return $this->contenttypeid;}
	    $tempPG="public function get".$v->getFname()."() {return \$this->".$v->getFname().";}";
	    $propertyGeter=(strlen($propertyGeter)==0?$propertyGeter:$propertyGeter."").$tempPG;
	    
	    
	    $tempPS="public function set".$v->getFname()."(\$".$v->getFname()."){\$this->".$v->getFname()." = \$".$v->getFname().";}";
	    $propertySeter=(strlen($propertySeter)==0?$propertySeter:$propertySeter."").$tempPS;
		if($v->getPk()=="PRI"){  //如果是主键字段
			//echo "i get the PKI";
			$PKfieldName=$v->getFname();		
		}else{
			//echo "<br>".$v->getFname()."-------".$v->getFtype()."<br>";
			$temptype=$v->getFtype();
			//echo "<br>the value is found?:".$v->getFname()."======================".$temptype."==============================".(stripos("_".$temptype,"int")?"found":"not found!")."<br>";
			$fieldslist=(strlen($fieldslist)==0?$fieldslist:$fieldslist.",").$v->getFname();
			$tempfvbegin=$v->getFname()."=";
			$tempfvend="\",";
			$tempfvstring="";
			if(stripos("_".$temptype,"int")||stripos("_".$temptype,"num")||stripos("_".$temptype,"bit")||stripos("_".$temptype,"flo")||stripos("_".$temptype,"dou")||stripos("_".$temptype,"dec")){
				$tempfv="\$new->get".$v->getFname()."()";
				$tempfvbegin=$v->getFname()."=";
				$tempfvend=",";
				//echo "I GOT INT TYPE@".$temptype;
			}
			else
			{
				$tempfv="\"'\".\$new->get".$v->getFname()."().\"'\"";
				$tempfvbegin=$tempfvbegin."'";
				$tempfvend="'";
			}
			$tempfvstring=$tempfvbegin."\$new->get".$v->getFname()."()".$tempfvend;
			$fieldvaluelist=(strlen($fieldvaluelist)==0?$fieldvaluelist:$fieldvaluelist.",").$tempfvstring;		
			$valueslist=(strlen($valueslist)==0?$valueslist:$valueslist.".\",\".").$tempfv;
		}
		$tempmodifysql="update  ".$tablename." set ".$fieldvaluelist;
		$tempmodifysql="\"".str_replace("',",".\"',",str_replace("='","='\".",$tempmodifysql));
		$tempmodifysql=str_replace("=\$","=\".\$",$tempmodifysql);
		$tempmodifysql=str_replace(",,",".\",",$tempmodifysql);
		if(strripos($tempmodifysql,"'")+1==strlen($tempmodifysql)){
		   $tempmodifysql=substr($tempmodifysql, 0,strlen($tempmodifysql)-1).".\"'\"";	
		}
		if(strripos($tempmodifysql,",")+1==strlen($tempmodifysql)){
			$tempmodifysql=substr($tempmodifysql, 0,strlen($tempmodifysql)-1);//.".\"'\"";
		}
		//$tempmodifysql=str_replace(",.",".",$tempmodifysql);
		$i++;
	}
	$tab_body=str_replace("12345678", $tds, $tab_body);
	// echo "<br>fieldlist and valuelist:".$fieldslist."<br>".$valueslist."<br>fvlist:".$fieldvaluelist."<br>propertyassignstring:".$propertyAssignstring.
	//      "<br>classprorpertyes:".$classPropertys."<br>propertygeter:".$propertyGeter;
	// echo "<BR>propertySetter:". $propertySeter ;
	// echo "<br>tempmodifysql:".$tempmodifysql;
	$tpl->assign("tab_head",$tab_head);
	$tpl->assign("tab_body",$tab_body);
	
	$tpl->assign("tablename",$tablename);
	$tpl->assign("PKfieldName",$PKfieldName);
	$tpl->assign("selectsql",$selectsql);
	$tpl->assign("fieldslist",$fieldslist);
	$tpl->assign("valueslist",$valueslist);
	$modifysql=$tempmodifysql;
	$tpl->assign("modifysql",$modifysql);
	$tpl->assign("deletesql",$deletesql);
	$tpl->assign("propertyAssignstring",$propertyAssignstring);
	$tpl->assign("classPropertys",$classPropertys);
	$tpl->assign("propertyGeter",$propertyGeter);
	$tpl->assign("propertySeter",$propertySeter);
	$tpl->display("t_source.htm");

}
else
{
	echo "没有选择表,不能进行生成!!!";
	
}

?>

 

smarty调用文件:codecreateapp.php

<?php
include "./main.php";
include "./dal/ado.php";
class test extends ADO{
  public function __construct(){
  	
  	 parent::__construct();
  }
  public function getTablesInfoOnServer(){
  	$result=array();
  	$rs=$this->executeQuery("show tables;",0,0);
  	//print_r($rs);
  	//echo "....";
  	while($t=mysql_fetch_array($rs)){
  	   //echo $t[Tables_in_testdb]."|<br>";
  	   array_push($result,$t[Tables_in_testdb]);
  		}
	$this->closeConnection();
	return $result;
	}
	
}
$t=new test();
$r=$t->getTablesInfoOnServer();
$tpl->assign("result",$r);
$tpl->display("t_codeCreate.html");

?>

 

分享到:
评论

相关推荐

    Smarty中批量生成html

    Smarty模板引擎允许开发者以简单易懂的方式分离逻辑层与展示层。在生成静态HTML页面时,我们需要将数据库中的数据动态填充到模板中,并最终保存为HTML文件。这一过程涉及以下几个关键步骤: 1. **获取数据**:通常...

    tp5 前后台模板数据库

    "tp5 前后台模板数据库"这个主题涵盖了Web应用开发中的多个重要方面:使用ThinkPHP5框架创建前后台界面,利用模板设计提升用户体验,通过数据库管理数据,以及采用前后端分离架构优化开发流程。理解并熟练掌握这些...

    Smarty学习--关于smarty学习的mvc三层架构

    - **安全机制**:Smarty提供了一些安全功能,如自动转义HTML实体,防止XSS攻击,以及限制模板可访问的PHP函数,确保模板的安全性。 **5. 实战案例** 资料中包含的一些简单易学的Smarty案例可能包括: - **基本...

    一个基于Smarty模板引擎的php组织物资管理系统(毕业设计)

    1. **Smarty模板引擎介绍** Smarty是一个强大的PHP模板技术,它的主要特点是将HTML和PHP代码分离,使得程序员可以专注于PHP的业务逻辑,而设计师则可以独立处理页面样式和布局。Smarty提供了一系列的模板语法,如...

    smarty Pager

    在使用SmartyPager时,AdoDB可以作为数据访问工具,帮助处理数据库查询,获取总记录数和每页的数据。例如,你可以使用AdoDB的`GetRows`或`SelectLimit`方法来获取指定范围内的数据,配合SmartyPager进行分页处理。 ...

    Smarty-3.1.18

    2. **模板语法**:Smarty模板文件通常有`.tpl`扩展名,它们使用简单的语法来显示变量和控制结构。例如,`{$var}`表示输出变量`$var`的值,`{if}`、`{foreach}`等用于条件判断和循环。 3. **模板继承与布局**:...

    smarty课件

    通过学习Smarty模板引擎,开发者可以更好地组织和维护Web应用的视图层,提高开发效率,同时保持设计的灵活性和代码的可读性。结合实际项目,熟练掌握Smarty的各种特性和用法,能帮助你构建出高效、安全、易于维护的...

    Smarty实现页面静态化(生成HTML)的方法

    2. 根据URL参数查询数据库,获取所需数据。 3. 对获取的数据进行处理,如修改显示格式。 4. 使用Smarty的assign()方法将处理后的数据分配给模板变量。 5. 最后,通过display()方法输出模板,呈现最终页面。 要实现...

    基于Ajax和Smarty的新闻管理系统的设计与实现.pdf

    Smarty模板技术可以实现表示层与业务层的分离,从而实现开发人员的分工。Ajax技术可以实现Web应用中客户端异步与服务器端进行交互,实现网页的局部刷新效果,提高访问速度。 系统总体设计通过分析,新闻网站一般...

    PHP开发框架关键技术分析.pdf

    本文对PHP开发框架关键技术进行了分析和讨论,涵盖了PHP开发框架中的MVC设计模式、模板解析引擎和数据访问层等技术。 在PHP开发框架中,MVC设计模式是最常用的设计模式之一。MVC模式通过分离数据、逻辑和显示,将...

    PHP100_PHPnew新闻系统

    4. 查询结果传递给Smarty模板,模板根据数据生成HTML页面。 5. HTML页面返回给客户端,用户看到分页显示的新闻列表。 6. 当用户点击分页链接时,重复上述过程,只是请求的页码不同。 **学习与实践** 通过研究...

    ECShop基础知识

    通过以上介绍可以看出,ECShop利用Smarty模板引擎不仅实现了业务逻辑与表现层的有效分离,还提供了丰富的模板标签和函数,大大简化了模板开发的工作量。开发者可以根据实际需求灵活运用这些功能,提高开发效率的同时...

    php框架ThinkPHP代码分析核心解析.pdf

    应用层负责处理用户请求,业务逻辑层负责处理业务逻辑,数据访问层负责与数据库交互,视图层负责渲染模板。 二、核心组件 ThinkPHP 框架的核心组件包括 Application、 Request、 Response、 Router、 Loader 等。...

    PHP smarty 分页

    4. **模板使用**:在Smarty模板中,使用`{paginate}`插件生成分页链接。它会自动处理上一页、下一页、第一页和最后一页的链接,以及当前页的页码。例如: ``` {paginate} {if $pagination.prev_page} $...

    php生成全国多城市分站静态页面代码

    2. 数据缓存:为提高效率,可以将获取的城市数据进行缓存,避免每次生成页面时都进行数据库查询。 四、优化与扩展 1. 并行处理:如果城市数量庞大,可以考虑使用多线程或多进程并行生成,以减少整体耗时。 2. 异步...

    php 小框架

    Action层通常处理用户请求,DAO(数据访问对象)层负责与数据库交互,Entity层存储业务对象,Page层则可能涉及视图渲染。 4. **Action层**:Action层是业务逻辑的入口,它接收用户的请求,调用相应的服务或DAO进行...

    smarty循环嵌套用法示例分析

    通过理解并熟练运用这些知识点,你可以更好地利用Smarty模板引擎来构建高效且易于维护的Web应用。在实际开发中,不断实践和优化你的模板代码,你会发现Smarty不仅简化了HTML和PHP的交互,也为代码的组织和复用提供了...

    adodb-ext-504

    在PHP中,这通常意味着可以利用Adodb的扩展来生成图表、图片处理或者在数据库中存储和检索图像数据。 Smarty是一个流行的PHP模板引擎,它的主要作用是将业务逻辑和视图设计分离。使用Smarty,开发者可以编写干净、...

    注册送红包

    - 接下来利用Smarty模板引擎动态生成邮件内容,并通过`addslashes()`函数对特殊字符进行转义处理,确保安全地插入数据库。 - 最后,将邮件内容和相关信息插入到邮件发送列表表(`email_sendlist`)中,并在用户...

    继上一版留言本并加入memcache缓存和pdo连接方式

    - **View**:负责展示数据,这里可能是使用Smarty模板来生成HTML页面。 - **Controller**:处理用户请求,调用Model进行数据操作,然后更新View。 总结来说,这个项目展示了如何通过引入缓存技术和改进数据库连接...

Global site tag (gtag.js) - Google Analytics