这节来看下该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~