喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 帮助

RSS 订阅当前论坛  

喜悦证交所已经关闭

上一主题 下一主题
     
标题: 偷懒方式 拼装SQL语句类 请大家指点  
 
icej (icej)
新手上路
Rank: 1
一般会员



UID 66066
精华 0
积分 36
帖子 34
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-8-21
状态 离线
偷懒方式 拼装SQL语句类 请大家指点

我是个新手,希望大家能多指点,提出更好的方式.
一直觉得ROR方式不错,不过说实话,ROR对我最有吸引力的是写SQL语句那里,自己不用写什么,只要放个数组进去,就自动产生需要的SQL语句提交执行,觉得太爽了,特别是遇到象USER表这样的动辄10-20个字段提交表单POST,然后Insert Update的话,语句可省大发了.

但是ROR那样的要想用这种方便的方式,就必须全盘接受,所以我写了一个类来实现自动拼装SQL语句.不过由于我还没在实际工作中实验,还不知道效果如何,而且实现方式也很土,希望大家能多指点.

这个SQL类支持Insert Update 多表联合Select 3种方式,并且在使用时针对Update和Insert分根据表实际情况检查使用类型和根据字段别名来组装SQL语句两种情况.多表Select支持传递2个包含表名和字段名的数组组装 和 传递表名 根据表的实际情况组装SQL语句.

第一种Insert SQL语句组装 向类传递一个包含字段名(字段名做区分处理,字符型前加s_,整形前加i_)的和值的数组 然后返回SQL语句

include("helpsql.php");
$hs = new HelpSql();
//使用简单组合方式 insert语句 根据字段名的前缀来决定是否加‘’
$hs->initTableName = "bbs"; //设置表名
$table = array("i_bbs_id"=>"1","s_bbs_title"=>"sss","s_bbs_content"=>1,"i_bbs_user_id"=>"1"); //设置字段对应的值 KEY是字段别名 s_字符 i_ 数字 缺省属性是字符
$sql = $hs->get_Insert($table,"bbs_id=1"); //组装insert语句 参数:表数组 Where条件
if($sql)
{
        echo $sql; //打印结果 "insert into bbs(bbs_id,bbs_title,bbs_content,bbs_user_id) values('1','sss','1',1) where bbs_id=1"
}
else
{
        echo $hs->reErrorInfo; //打印错误信息
}
第二种 设置数据库连接方式和表名 类会获得该表的字段属性并生成数组文件,执行时会根据数组文件来判断插入值的属性 如果不符合会报错误

$hs->initTableName = "bbs"; //设置表名
$table = array("bbs_id"=>"1Q","bbs_title"=>"sss","bbs_content"=>1,"bbs_user_id"=>"1"); //设置字段对应的值 KEY是真实字段名 值是要更新的值 缺省属性是字符
$hs->initdBParam = array("dbname"=>"bbs","dbuser"=>"root","dbpass"=>"123456","dbhost"=>"localhost");//设置数据库连接方式
$hs->initdBInfoPath = dirname(__FILE__);//设置表数组脚本存放位置 名字是 表名_table.php
$sql = $hs->get_Update($table,"bbs_id=1",true); //组装insert语句 参数:表数组 Where条件
if($sql)
{
        echo $sql; //打印结果 "update bbs set bbs_id=1,bbs_title='sss',bbs_content='1',bbs_user_id=1 where bbs_id=1"
}
else
{
        echo $hs->reErrorInfo; //如果属性不匹配 则返回错误 "字段 bbs_id 值 1Q 不是要求的 int 属性"
}
多表联合Select 第一种方式 传递包含表名和字段的数组进行组装

$tables = array(
"bbs"=>array("bbs_id"=>"","bbs_title"=>"","bbs_content"=>"","bbs_user_id"=>""), //表bbs 字段
"reply"=>array("reply_id"=>"","reply_content"=>""),//表reply 字段
);
echo $hs->get_ManyTableSelect($tables,"bbs.id=1"); //获得多表Select语句 参数:多表数组 条件 返回字段别名为 表名_字段名 "select bbs.bbs_id as bbs_bbs_id,bbs.bbs_title as bbs_bbs_title,bbs.bbs_content as bbs_bbs_content,bbs.bbs_user_id as bbs_bbs_user_id,reply.reply_id as reply_reply_id,reply.reply_content as reply_reply_content from bbs,reply where bbs.id=1"
多表联合Select 另一种形式 根据传递包含表名的数组 通过连接数据库获得表包含的字段 然后组装SQL语句

$tables = array(
"bbs"=>""), //表bbs
"reply"=>""),//表reply
);
echo $hs->get_ManyTableSelect($c,"bbs.id=1",true);
//select bbs.bbs_id as bbs_bbs_id,bbs.bbs_title as bbs_bbs_title,bbs.bbs_content as bbs_bbs_content,bbs.bbs_user_id as bbs_bbs_user_id,bbs.bbs_user_name as bbs_bbs_user_name,bbs.bbs_date as bbs_bbs_date,reply.reply_id as reply_reply_id,reply.reply_content as reply_reply_content,reply.reply_user_id as reply_reply_user_id,reply.reply_user_name as reply_reply_user_name,reply.reply_bbs_id as reply_reply_bbs_id,reply.reply_date as reply_reply_date from bbs,reply where bbs.id=1
类代码如下,做的很粗糙请多指教

<?php
class HelpSql
{
        var $ischeckDbInfo = false; //是否从数据库获得字段类型
        var $initdBParam = array( //数据库连接参数
        "dbname"=>"",
        "dbpass"=>"",
        "dbuser"=>"",
        "dbhost"=>"",
        );
        var $initTableName = "";//操作表名
        var $initData = array(); //数据库使用数据 KEY字段名=>数据
        var $initdBInfoPath = ""; //指定路径
        var $initdBInfoTBPath = "";//表文件路径
        var $initdBInfoExp = "_table.php";//存放数据表信息后缀
        var $tableInfo = array(); //表的信息
        var $reErrorCode = "";//返回错误代码 001数据库连接错误 002表错误 003字段名不存在 004字段属性错误
        var $reErrorInfo = "";

        //设置获得表信息的路径
        function _set_DbTableFile()
        {
                //数据库表信息存放路径
                //echo "set db path";
                $this->initdBInfoTBPath = $this->initdBInfoPath."\\".$this->initTableName.$this->initdBInfoExp;
        }
        //获得表信息  成功返回TRUE失败返回FALSE
        function _get_DbTableInfo()
        {
                //echo $this->initdBInfoTBPath;
                if (is_readable($this->initdBInfoTBPath))
                {
                        echo "include array";
                        $this->tableInfo = include($this->initdBInfoTBPath);
                }
                else
                {
                        //从数据库获得表信息
                        echo "make array";
                        $dblink = mysql_connect($this->initdBParam["dbhost"], $this->initdBParam["dbuser"], $this->initdBParam["dbpass"]);
                        if (!$dblink)
                        {
                                $this->reErrorCode = 001;
                                $this->reErrorInfo = mysql_error();
                                return false;
                        }
                        else
                        {
                                if (!mysql_select_db($this->initdBParam["dbname"]))
                                {
                                        $this->reErrorCode = 002;
                                        $this->reErrorInfo = mysql_error();
                                        return false;
                                }
                                else
                                {
                                        $result = mysql_query("Select * FROM ".$this->initTableName);
                                        $fields = mysql_num_fields($result);
                                        $f = fopen($this->initdBInfoTBPath,"w");
                                        $c = "<?php\n return array (\n";
                                        for ($i=0; $i < $fields; $i++)
                                        {
                                                $type  = mysql_field_type($result, $i);
                                                $name  = mysql_field_name($result, $i);
                                                $tmptype = explode(" ",$type);
                                                $this->tableInfo[$name] = $tmptype[0];
                                                $c.='"'.$name.'"=>'.'"'.$tmptype[0].'",'."\n";
                                        }
                                        $c.=");\n?>";
                                        fwrite($f,$c);
                                        fclose($f);
                                }
                        }
                }
                return true;
        }
        //组装Insert SQL语句 数据数组 条件 是否检查字段类型
        function get_Insert($indata,$where="",$ischeck="")
        {
                $this->_set_DbTableFile();
                if (!is_bool($ischeck))
                {
                        //echo "user table info ";
                        $ischeck = $this->ischeckDbInfo;
                }
                if($ischeck) //需要检查字段属性
                {
                        $sql1 = "insert into ".$this->initTableName."(";
                        $sql2 = " values(";
                        //print_r($data);
                        while(list($key,$val)=each($indata))
                        {
                                $re = $this->_check_Data($key,$val);
                                if(!$re)
                                {
                                        return false;
                                }
                                else
                                {
                                        $sql1.=$key.",";
                                        if($re=="s")
                                        {
                                                $sql2.="'".$val."',";
                                        }
                                        else
                                        {
                                                $sql2.=$val.",";
                                        }
                                }
                        }
                        $sql1 = substr($sql1,0,-1);
                        $sql1.=")";
                        $sql2 = substr($sql2,0,-1);
                        $sql2.=")";
                }
                else
                {
                        //组装SQL语句
                        $sql1 = "insert into ".$this->initTableName."(";
                        $sql2 = " values(";
                        while(list($key,$val)=each($indata))
                        {
                                $sql1.=$this->_getFieldName($key).",";
                                $sql2.=$this->_get_FieldValues($key,$val).",";
                        }
                        $sql1 = substr($sql1,0,-1);
                        $sql1.=")";
                        $sql2 = substr($sql2,0,-1);
                        $sql2.=")";
                }
                        if ($where!="")
                        {
                                return $sql1.$sql2." where ".$where;
                        }
                        else
                        {
                                return $sql1.$sql2;
                        }
        }
        //组装Update
        function get_Update($indata,$where="",$ischeck="")
        {
                $this->_set_DbTableFile();
                        if (!is_bool($ischeck))
                {
                        //echo "user table info ";
                        $ischeck = $this->ischeckDbInfo;
                }
                if($ischeck) //需要检查字段属性
                {
                        $sql1 = "update ".$this->initTableName." set ";
                        //print_r($data);
                        while(list($key,$val)=each($indata))
                        {
                                $re = $this->_check_Data($key,$val);
                                if(!$re)
                                {
                                        return false;
                                }
                                else
                                {
                                        $sql1.=$key."=";
                                        if($re=="s")
                                        {
                                                $sql1.="'".$val."',";
                                        }
                                        else
                                        {
                                                $sql1.=$val.",";
                                        }
                                }
                        }
                        $sql1 = substr($sql1,0,-1);;
                }
                else
                {
                        //组装SQL语句
                        $sql1 = "update ".$this->initTableName." set";
                        while(list($key,$val)=each($indata))
                        {
                                $sql1.=$this->_getFieldName($key)."=";
                                $sql1.=$this->_get_FieldValues($key,$val).",";
                        }
                        $sql1 = substr($sql1,0,-1);
                }
                        if ($where!="")
                        {
                                return $sql1." where ".$where;
                        }
                        else
                        {
                                return $sql1;
                        }
        }
        //不根据表真实属性分析时 拆字段名 i是数字 s是字符 返回VALUES
        function _get_FieldValues($key,$val)
        {
                $key = substr($key,0,1);
                switch ($key)
                {
                        case "i":
                        return $val;
                        break;
                        case "s":
                        return "'".$val."'";
                        break;
                        default:
                        return  "'".$val."'";
                        break;
                }
        }
        //不根据表真实属性分析时 返回真实字段名
        function _getFieldName($key)
        {
                return substr($key,2);
        }
        //检查数据是否符合字段要求 成功返回TRUE失败返回FALSE
        function _check_Data($key,$val)
        {
                if(!$this->_get_DbTableInfo())
                {
                        return false;
                }
                else
                {
                        if (!isset($this->tableInfo[$key]))
                        {
                                $this->reErrorCode = 003;
                                $this->reErrorInfo = "字段名不存在";
                                return false;
                        }
                        else
                        {
                                switch ($this->tableInfo[$key])
                                {
                                        case "string":
                                                if(!is_string($val))
                                                {
                                                        $this->reErrorCode = 004;
                                                        $this->reErrorInfo = "字段 $key 值 $val 不是要求的 ".$this->tableInfo[$key]."属性";
                                                        return false;
                                                }
                                                return "s";
                                                break;
                                        case "int":
                                                if(ereg ("[^0-9]",$val))
                                                {
                                                        $this->reErrorCode = 004;
                                                        $this->reErrorInfo = "字段 $key 值 $val 不是要求的 ".$this->tableInfo[$key]." 属性";
                                                        return false;
                                                }
                                                return "i";
                                                break;
                                        default:
                                                return "s";
                                        break;
                                }
                        }
                }
        }
        //多表联合Select
        function get_ManyTableSelect($indata,$where="",$type=false)
        {
                $sql1 = "select ";
                $sql2 =" from ";
                if (!$type) //简单方式
                {
                        while(list($table,$fields)=each($indata))
                        {
                                $sql2.=$table.",";
                                while(list($field,$val)=each($fields))
                                {
                                        $sql1.="$table.$field as ".$table."_".$field.",";
                                }
                        }
                }
                else
                {
                        while(list($table,$val)=each($indata))
                        {
                                $this->initTableName = $table;
                                $sql2.="$table,";
                                $this->_set_DbTableFile();
                                echo $this->initdBInfoTBPath;
                                if($this->_get_DbTableInfo())
                                {
                                        //print_r($this->tableInfo);
                                        while(list($field,$val)=each($this->tableInfo))
                                        {
                                                $sql1.=$this->initTableName.".$field as ".$this->initTableName."_".$field.",";
                                        }
                                }
                        }
                }
                        $sql1 = substr($sql1,0,-1);
                        $sql2 = substr($sql2,0,-1);
                        if ($where!="")
                        {
                                return $sql1.$sql2." where ".$where;
                        }
                        else
                        {
                                return $sql1.$sql2;
                        }
        }
}
?>
2006-5-10 09:25 PM#1
查看资料  发短消息  顶部
 
fly512 (我本如是)
版主
Rank: 7Rank: 7Rank: 7
人生的另一半


UID 42566
精华 0
积分 2509
帖子 2396
金钱 1779 喜悦币
威望 0
人脉 730
阅读权限 100
注册 2004-10-31
来自 亚特兰迪斯
状态 离线
[推荐阅读] 说说动态语言[zt]
我认为
该实在一点还是实在一点的好
别偷懒




不要使用数据库
PHP中国
2006-5-11 07:59 AM#2
查看资料  访问主页  Blog  发短消息  顶部
 
icej (icej)
新手上路
Rank: 1
一般会员



UID 66066
精华 0
积分 36
帖子 34
金钱 36 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-8-21
状态 离线
[推荐阅读] zend加密过后再用Gip压缩 浏览器里显示都是乱麻怎么回事?
我觉得在写这些SQL语句时 写的很长很容易烦 一直觉得写的很累 一些复杂的 特殊的SQL语句还是需要自己手写

不过我现在没试过这样的方式是否真的省事

PS:INSERT 那里有个错误 我把WHERE也加上了 写完INSERT 后写UPDATE时 就顺手都加了 失误
2006-5-11 09:15 AM#3
查看资料  发短消息  顶部
 
c1a1o1
版主
Rank: 7Rank: 7Rank: 7
一品带刀护卫


UID 68669
精华 0
积分 8935
帖子 2356
金钱 8935 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2006-2-17
状态 离线
[推荐阅读] 求助!!可以在PHP中把数据库中的数据转化为中文形式的XML吗??
不错 ,我第一次应聘就要这个!



生日礼物送什么www.feichanglipin.cn
生日礼物      补肾
2006-5-11 11:48 PM#4
查看资料  Blog  发短消息  QQ . .   顶部
 
Apirl
新手上路
Rank: 1



UID 72965
精华 0
积分 8
帖子 8
金钱 8 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2006-5-8
状态 离线
[推荐阅读] session值自动发生变化问题
直接用 phpbb的不就好了

<?php
/**
    * Build sql statement from array for insert/update/select statements
    *
    * Idea for this from Ikonboard
    * Possible query values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT
    */
    
function sql_build_array($query$assoc_ary false)
    {
        if (!
is_array($assoc_ary))
        {
            return 
false;
        }

        
$fields = array();
        
$values = array();
        if (
$query == 'INSERT' || $query == 'INSERT_SELECT')
        {
            foreach (
$assoc_ary as $key => $var)
            {
                
$fields[] = $key;

                if (
is_null($var))
                {
                    
$values[] = 'NULL';
                }
                else if (
is_string($var))
                {
                    
$values[] = "'" $this->sql_escape($var) . "'";
                }
                else if (
is_array($var) && is_string($var[0]))
                {
                    
// This is used for INSERT_SELECT(s)
                    
$values[] = $var[0];
                }
                else
                {
                    
$values[] = (is_bool($var)) ? intval($var) : $var;
                }
            }

            
$query = ($query == 'INSERT') ? ' (' implode(', '$fields) . ') VALUES (' implode(', '$values) . ')' ' (' implode(', '$fields) . ') SELECT ' implode(', '$values) . ' ';
        }
        else if (
$query == 'MULTI_INSERT')
        {
            
$ary = array();
            foreach (
$assoc_ary as $id => $sql_ary)
            {
                
$values = array();
                foreach (
$sql_ary as $key => $var)
                {
                    if (
is_null($var))
                    {
                        
$values[] = 'NULL';
                    }
                    else if (
is_string($var))
                    {
                        
$values[] = "'" $this->sql_escape($var) . "'";
                    }
                    else
                    {
                        
$values[] = (is_bool($var)) ? intval($var) : $var;
                    }
                }
                
$ary[] = '(' implode(', '$values) . ')';
            }

            
$query ' (' implode(', 'array_keys($assoc_ary[0])) . ') VALUES ' implode(', '$ary);
        }
        else if (
$query == 'UPDATE' || $query == 'SELECT')
        {
            
$values = array();
            foreach (
$assoc_ary as $key => $var)
            {
                if (
is_null($var))
                {
                    
$values[] = "$key = NULL";
                }
                else if (
is_string($var))
                {
                    
$values[] = "$key = '" $this->sql_escape($var) . "'";
                }
                else
                {
                    
$values[] = (is_bool($var)) ? "$key = " intval($var) : "$key = $var";
                }
            }
            
$query implode(($query == 'UPDATE') ? ', ' ' AND '$values);
        }

        return 
$query;
    }
?>
2006-5-12 11:10 AM#5
查看资料  发短消息  顶部
 
vivianliu
中级会员
Rank: 3Rank: 3
一般会员


UID 67294
精华 0
积分 222
帖子 212
金钱 222 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-12-19
来自 武汉
状态 离线
[推荐阅读] 又开始找工作了,嘿嘿
不管有没有用, 精神可嘉!
现在做开发,什么都用现成的,很没意思!
不过好像可以再优化一下.我先看看




正着念php,反着念php.
2006-5-12 04:01 PM#6
查看资料  发短消息  QQ . .   顶部
 
vivianliu
中级会员
Rank: 3Rank: 3
一般会员


UID 67294
精华 0
积分 222
帖子 212
金钱 222 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-12-19
来自 武汉
状态 离线
[推荐阅读] 求一个MYSQL空间申请程序
不过多表联合查询最好不用这种方式, 还是自己写比较好.



正着念php,反着念php.
2006-5-12 04:19 PM#7
查看资料  发短消息  QQ . .   顶部
 
Matrix@Two_Max (深海)
金牌会员
Rank: 6Rank: 6
时尚MAX



UID 27890
精华 0
积分 1190
帖子 1190
金钱 1190 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2004-4-17
状态 离线
[推荐阅读] JS:怎么运行代码中有"?"?
你自己用用就知道这叫不叫偷懒了。呵呵

估计干的事儿,比不偷懒还多得多




愿闻其详

拓迈时尚网
2006-5-15 09:30 AM#8
查看资料  访问主页  发短消息  顶部
 
ehn
乞丐




UID 73309
精华 0
积分 -5
帖子 6
金钱 -5 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2006-5-13
状态 离线
[推荐阅读] php如何显示正在加载网页数据
2006-5-17 08:05 AM#9
查看资料  发短消息  顶部
 
hero913 (文风大侠)
高级会员
Rank: 4
现在穷疯了,没钱


UID 70150
精华 0
积分 924
帖子 958
金钱 924 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2006-3-23
状态 离线
[推荐阅读] 图片上传大小的修改问题
回复 #1 icej 的帖子

工支持你这种写法,因为这个不是不实际,而是很高效,这个最活,省事

如果这种方法用到一个系统里面的话,还可以控制不同权限的人来访问数据呢




MSN:aaron-0913@hotmail.com
skype:chenqiangang
QQ:105915495
php我的最爱,希望志同道合的加我,聊一聊
给我留言
2006-5-17 08:23 AM#10
查看资料  访问主页  Blog  发短消息  QQ . .   顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.038132 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP