这节来看下该CMS和数据库操作相关的sql类,该类定义在common_fun/sql_class.php中。该类的代码如下: define('SQL_SUCCESS', 0); //定义sql操作成功的常量 define('SQL_ER...

    这节来看下该CMS和数据库操作相关的sql类,该类定义在common_fun/sql_class.php中。该类的代码如下:

define('SQL_SUCCESS', 0); //定义sql操作成功的常量
define('SQL_ERROR',1); //定义sql操作失败时的常量
class sql
{
....................................//省略N行代码
    function __construct($charset) //sql类的构造器
    {
        .............................................//省略N行代码
        if($this->db_type == MYSQL)
            $this->mysql_conn_db($db_hostname, $db_username, $db_password, $db_database_name, $charset); //如果是mysql类型的数据库,就通过下面定义的mysql_conn_db来连接数据库。参数依次为主机名或IP,用户名,密码,数据库名,数据库字符集
        else if($this->db_type == SQLITE)
            $this->sqlite_conn_db($db_database_name, $charset); //sqlite类型的数据库就用sqlite_conn_db
        else
            new error('sql构造函数发生错误','无效的数据库类型!',true,true);
    }
    function __destruct()  //sql类的析构函数
    {
      .............................................//省略N行代码
            if($this->db_type == MYSQL)
                mysql_close($this->link);  //当类结束时,通过mysql_close释放连接。
            else if($this->db_type == SQLITE)
                sqlite_close($this->link);  //当类结束时,通过sqlite_close来释放连接。
        .............................................//省略N行代码
    }
    function mysql_conn_db($db_hostname,$db_username,$db_password,$db_database_name,$charset) //mysql连接数据库的方法
    {
        .............................................//省略N行代码
        $this->link = mysql_connect($this->hostname,$this->username,$this->password);  //通过mysql_connect来连接mysql数据库
        if(!$this->link)
        {
            $this->fatalError('连接数据库失败,');
        }
        if(!mysql_select_db($this->dbname,$this->link))  //mysql_select_db函数可以通过数据库名来打开对应的数据库。
        {
            $this->fatalError('选择数据库失败,');
        }
        if(!mysql_set_charset($this->charset,$this->link))  //最后通过mysql_set_charset来设置字符集。
        {
            $this->fatalError('设置UTF8字符集失败,');  //本CMS默认是UTF8的数据库字符集
        }
    }
    function sqlite_conn_db($db_database_name,$charset) //php程序中连接sqlite数据库的方法
    {
        $this->dbname = $db_database_name;
        $this->charset = $charset;
        $this->sqlite_lib_encode = sqlite_libencoding();  //获取并保存sqlite数据库的编码信息。SQLite库要么是ISO-8859-1的模式要么是UTF-8的模式,通过该函数可以检测出你的sqlite库是哪种模式。
        $this->link = sqlite_open($this->dbname);  //通过向sqlite_open函数提供数据库名来打开sqlite数据库。
        if(!$this->link)
        {
            $this->fatalError('打开数据库失败,');
        }
    }
    function setError($errorstr)
    {
        $this->err = SQL_ERROR;
        if($this->db_type == MYSQL)
        {
            $this->errnum = mysql_errno();  //通过mysql_errno获取mysql出错号。
            $this->errorstr = $errorstr . mysql_error(); //mysql_error可以得到字符串格式的出错信息。
        }
        else if($this->db_type == SQLITE)
        {
            $this->errnum = sqlite_last_error($this->link);  //sqlite_last_error函数可以获取出错号
            $this->errorstr = $errorstr . sqlite_error_string($this->errnum);  //sqlite_error_string函数用于获取最后一次的字符串格式的出错信息。
        }
        else
        {
            $this->errnum = -1;
            $this->errorstr = $errorstr . "未知数据库类型,无法获取数据库错误!";
        }
    }
.............................................//省略N行代码
    function mysql_createTable($tablename,$desc,$dropExists) //mysql类型的数据库创建表结构的方法,第一个参数是表名,第二个参数是表的结构字段,第三个参数判断是否需要将以前的同名表删除。
    {
        if($dropExists==true)
        {
            $tablename =  $this->tables_prefix . $tablename;
            $this->sql_desc = "DROP TABLE IF EXISTS " . $tablename; //如果需要删除已存在的数据库表的话,就是用DROP TABLE的sql语句
            if(!mysql_query($this->sql_desc,$this->link)) //通过mysql_query来执行sql语句。
            {
                $this->fatalError('删除存在的表'. $tablename . '失败,');
            }
        }
        $this->sql_desc = "CREATE TABLE ". $tablename . "( " . $desc . " ) DEFAULT CHARSET=utf8"; //通过CREATE TABLE语句创建表,并设置默认字符集为UTF8格式。
        if(!mysql_query($this->sql_desc,$this->link))
        {
            $this->fatalError('创建表'. $tablename . '失败,');
        }
    }
    function sqlite_createTable($tablename,$desc,$dropExists) //sqlite创建数据库表的方法
    {
        if($dropExists==true)
        {
            $tablename =  $this->tables_prefix . $tablename;
            $this->sql_desc = "DROP TABLE " . $tablename;
            sqlite_query($this->link,$this->sql_desc); //通过sqlite_query函数来执行sql语句。
        }
        $this->sql_desc = "CREATE TABLE ". $tablename . "( " . $desc . " )"; //创建表结构的sql语句
        if(!sqlite_query($this->link,$this->sql_desc))
        {
            $this->fatalError('创建表'. $tablename . '失败,');
        }
    }
    /**
     * 插入表数据,用法:
     * insert( 表名(不含表前缀), 要插入的列如(username,password,regtime) , 每列对应的值 ... )
     * 每列对应的值中每个值为一个参数,这是个可变参数的函数。
     * @example $sql->insert('user','username,password,regtime,lastlogtime,level',
     *            "'$this->username'","'$md5pass'",$time,$time,USER_REG); */

    function insert()
    {
        global $db_pass_suffix;
        $args = func_get_args(); //通过func_get_args将函数的所有参数写入到$args数组中。
        $tablename = $this->tables_prefix . array_shift($args); //数组的第一个元素即第一个参数为表名
        $cols = array_shift($args); //第二个参数为逗号隔开的列名
        $this->sql_desc = "INSERT INTO " . $tablename . "( " . $cols . " )" . 'values (';
        foreach ($args as $arg) //其他的参数为每列对应的值。
        {
            $arg = $this->escape_str($arg);
            $arg = "'$arg'";
            $this->sql_desc .= $arg . ',';
        }
        $this->sql_desc = substr($this->sql_desc, 0,-1);
        $this->sql_desc .= ')';
        if($this->db_type == MYSQL)
        {
            if(!mysql_query($this->sql_desc,$this->link)) //通过mysql_query执行mysql数据库的插入操作的sql语句。
            {
                $this->fatalError('往'. $tablename . '插入数据失败,');
            }
        }
        else if($this->db_type == SQLITE)
        {
            if(!sqlite_query($this->link,$this->sql_desc)) //通过sqlite_query执行sqlite数据库的插入操作的sql语句
            {
                $this->fatalError('往'. $tablename . '插入数据失败,');
            }
        }
        else
            new error('插入数据库表失败','无效的数据库类型!',true,true);
    }
.............................................//省略N行代码
    function get_num() //从查询结果集中获取查询得到的总记录数
    {
        if($this->db_type == MYSQL)
            return $this->rownum = mysql_num_rows($this->results); //通过mysql_num_rows函数获取结果集中的总记录数。
        else if($this->db_type == SQLITE)
            return $this->rownum = sqlite_num_rows($this->results); //通过sqlite_num_rows函数获取结果集中的总记录数。
    }
    function parse_results() //解析结果集,将结果集转为PHP数组的形式。
    {
        if($this->db_type == MYSQL)
            return $this->row = mysql_fetch_array($this->results); //通过mysql_fetch_array函数将查询结果集转为关联和数字数组,该函数有两个参数,第一个参数为结果集,第二个参数为 MYSQL_ASSOC - 关联数组 ,MYSQL_NUM - 数字数组 ,MYSQL_BOTH - 默认。同时产生关联和数字数组
        else if($this->db_type == SQLITE)
            return $this->row = sqlite_fetch_array($this->results); //sqlite_fetch_array将sqlite结果集转为数组,第二个参数为SQLITE_ASSOC 会仅返回关联索引(已命名字段)的数组,SQLITE_NUM 仅返回数值索引的数组,SQLITE_BOTH 会同时返回关联和数值索引。SQLITE_BOTH 是此函数的默认值。
        else
            new error('数据库结果解析失败','无效的数据库类型!',true,true);
    }
    function escape_str($arg)  //转义mysql或sqlite数据。
    {
        if($this->db_type == MYSQL)
        {
            return $arg = mysql_escape_string($arg); //通过mysql_escape_string进行mysql数据转义,转义后的数据才不会破坏sql语句的完整性。
        }
        else if($this->db_type == SQLITE)
        {
            return $arg = sqlite_escape_string($arg); //通过sqlite_escape_string进行sqlite数据转义
        }
        else
            new error('转义sql字符串失败','无效的数据库类型!',true,true);
    }
    function reset_row()  //有时通过while循环读取完结果集的数据后,如果想重头读取结果集中的数据,就可以使用此方法来重置结果集中的游标。
    {
        if($this->db_type == MYSQL)
            mysql_data_seek($this->results,0); //对于mysql数据库可以使用mysql_data_seek函数,第二个参数0表示将游标重置到第一条记录。
        else if($this->db_type == SQLITE)
            sqlite_rewind($this->results);  //对于sqlite数据库可以使用sqlite_rewind函数来重置。
        else
            new error('重置数据库记录失败','无效的数据库类型!',true,true);
    }
    function bak_tables() //备份数据库,该函数是可变参数的函数,通过将参数提供的表里的数据转为insert语句写入到备份文件中。
    {
    .............................................//省略N行代码
    }
    function restore_tables()  //数据库恢复函数,在执行数据库恢复操作时,会先执行db_class.php里的创建表结构的函数,在创建完表结构后,再调用此函数将备份文件里的insert语句依次执行,从而将备份文件的数据恢复到数据库中。
    {
    .............................................//省略N行代码
    }

    以上就是zenglCMS操作sqlite和mysql的类涉及到的主要方法。

    上面给出的代码片段中,棕色的注释都是本文为了说明而添加的,在源代码中并没有。

   
最后的最后,如果转载请注明来源 http://www.zengl.com   , OK , 先到这里,休息,休息一下 O(∩_∩)O~

上下篇

下一篇: zenglcms v1.2.0发布版

上一篇: zenglcms 缓存和模板

相关文章

zenglcms 目录结构

zenglcms v1.2.0 自定义栏目类型

zenglcms 缓存和模板

zenglcms v1.2.0 正则表达式模板引擎

zenglcms v1.0.0的安装

zenglcms v1.2.0发布版