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

数据库配置文件: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");

?>

猜你喜欢

转载自martixwang.iteye.com/blog/1536176
今日推荐