<?php class cpMysqli { private $_writeLink = NULL; //主 private $_readLink = NULL; //从 private $_replication = false; //标志是否支持主从 private $dbConfig = array(); public $sql = ""; public function __construct($dbConfig = array()){ $this->dbConfig = $dbConfig; //判断是否支持主从 $this->_replication = isset($this->dbConfig['DB_SLAVE']) && !empty($this->dbConfig['DB_SLAVE']); } //执行sql查询 public function query($sql, $params = array()) { foreach($params as $k => $v){ $sql = str_replace(':'.$k, $this->escape($v), $sql); } $this->sql = $sql; if( $query = $this->_getReadLink()->query($sql) ) return $query; else $this->error('MySQL Query Error', $this->_getReadLink()->error, $this->_getReadLink()->errno); } //执行sql命令 public function execute($sql, $params = array()) { foreach($params as $k => $v){ $sql = str_replace(':'.$k, $this->escape($v), $sql); } $this->sql = $sql; if( $query = $this->_getWriteLink()->query($sql) ) return $query; else $this->error('MySQL Query Error', $this->_getWriteLink()->error, $this->_getWriteLink()->errno); } //从结果集中取得一行作为关联数组,或数字数组,或二者兼有 public function fetchArray($query, $result_type = MYSQLI_ASSOC) { return $this->unEscape( $query->fetch_array($result_type) ); } //取得前一次 MySQL 操作所影响的记录行数 public function affectedRows() { return $this->_getWriteLink()->affected_rows; } //获取上一次插入的id public function lastId() { return $this->_getWriteLink()->insert_id; } //获取表结构 public function getFields($table) { $this->sql = "SHOW FULL FIELDS FROM {$table}"; $query = $this->query($this->sql); $data = array(); while($row = $this->fetchArray($query)){ $data[] = $row; } return $data; } //获取行数 public function count($table,$where) { $this->sql = "SELECT count(*) FROM $table $where"; $query = $this->query($this->sql); $data = $this->fetchArray($query); return $data['count(*)']; } //数据过滤 public function escape($value) { if( isset($this->_readLink) ) { $mysqli = $this->_readLink; } elseif( isset($this->_writeLink) ) { $mysqli = $this->_writeLink; } else { $mysqli = $this->_getReadLink(); } if( is_array($value) ) { return array_map(array($this, 'escape'), $value); } else { if( get_magic_quotes_gpc() ) { $value = stripslashes($value); } return "'" . $mysqli->real_escape_string($value) . "'"; } } //数据过滤 public function unEscape($value) { if (is_array($value)) { return array_map('stripslashes', $value); } else { return stripslashes($value); } } //解析待添加或修改的数据 public function parseData($options, $type) { //如果数据是字符串,直接返回 if(is_string($options['data'])) { return $options['data']; } if( is_array($options) && !empty($options) ) { switch($type){ case 'add': $data = array(); $data['fields'] = array_keys($options['data']); $data['values'] = $this->escape( array_values($options['data']) ); return " (`" . implode("`,`", $data['fields']) . "`) VALUES (" . implode(",", $data['values']) . ") "; case 'save': $data = array(); foreach($options['data'] as $key => $value) { $data[] = " `$key` = " . $this->escape($value); } return implode(',', $data); default:return false; } } return false; } //解析查询条件 public function parseCondition($options) { $condition = ""; if(!empty($options['where'])) { $condition = " WHERE "; if(is_string($options['where'])) { $condition .= $options['where']; } else if(is_array($options['where'])) { foreach($options['where'] as $key => $value) { $condition .= " `$key` = " . $this->escape($value) . " AND "; } $condition = substr($condition, 0,-4); } else { $condition = ""; } } if( !empty($options['group']) && is_string($options['group']) ) { $condition .= " GROUP BY " . $options['group']; } if( !empty($options['having']) && is_string($options['having']) ) { $condition .= " HAVING " . $options['having']; } if( !empty($options['order']) && is_string($options['order']) ) { $condition .= " ORDER BY " . $options['order']; } if( !empty($options['limit']) && (is_string($options['limit']) || is_numeric($options['limit'])) ) { $condition .= " LIMIT " . $options['limit']; } if( empty($condition) ) return ""; return $condition; } //输出错误信息 public function error($message = '',$error = '', $errorno = ''){ if( DEBUG ){ $str = " {$message}<br> <b>SQL</b>: {$this->sql}<br> <b>错误详情</b>: {$error}<br> <b>错误代码</b>:{$errorno}<br>"; } else { $str = "<b>出错</b>: $message<br>"; } throw new Exception($str); } //获取从服务器连接 private function _getReadLink() { if( isset( $this->_readLink ) ) { $this->_readLink->ping(); return $this->_readLink; } else { if( !$this->_replication ) { return $this->_getWriteLink(); } else { $this->_readLink = $this->_connect( false ); return $this->_readLink; } } } //获取主服务器连接 private function _getWriteLink() { if( isset( $this->_writeLink ) ) { $this->_writeLink->ping(); return $this->_writeLink; } else{ $this->_writeLink = $this->_connect( true ); return $this->_writeLink; } } //数据库链接 private function _connect($is_master = true) { if( ($is_master == false) && $this->_replication ) { $slave_count = count($this->dbConfig['DB_SLAVE']); //遍历所有从机 for($i = 0; $i < $slave_count; $i++) { $db_all[] = array_merge($this->dbConfig, $this->dbConfig['DB_SLAVE'][$i]); } $db_all[] = $this->dbConfig;//如果所有从机都连接不上,连接到主机 //随机选择一台从机连接 $rand = mt_rand(0, $slave_count-1); $db = array_unshift($db_all, $db_all[$rand]); } else { $db_all[] = $this->dbConfig; //直接连接到主机 } foreach($db_all as $db) { $mysqli = @new mysqli($db['DB_HOST'], $db['DB_USER'], $db['DB_PWD'], $db['DB_NAME'], $db['DB_PORT']); if($mysqli->connect_errno == 0 ) { break; } } if($mysqli->connect_errno){ $this->error('无法连接到数据库服务器', $mysqli->connect_error, $mysqli->connect_errno); } //设置编码 $mysqli->query("SET NAMES {$db['DB_CHARSET']}"); return $mysqli; } //关闭数据库 public function __destruct() { if($this->_writeLink) { $this->_writeLink->close(); } if($this->_readLink) { $this->_readLink->close(); } } }
<?php class cpMysql { private $_writeLink = NULL; //主 private $_readLink = NULL; //从 private $_replication = false; //标志是否支持主从 private $dbConfig = array(); public $sql = ""; public function __construct( $dbConfig = array() ){ $this->dbConfig = $dbConfig; //判断是否支持主从 $this->_replication = isset( $this->dbConfig['DB_SLAVE']) && !empty($this->dbConfig['DB_SLAVE'] ); } //执行sql查询 public function query($sql, $params = array()) { foreach($params as $k => $v){ $sql = str_replace(':'.$k, $this->escape($v), $sql); } $this->sql = $sql; if( $query = mysql_query($sql, $this->_getReadLink()) ) return $query; else $this->error('MySQL Query Error'); } //执行sql命令 public function execute($sql, $params = array()) { foreach($params as $k => $v){ $sql = str_replace(':'.$k, $this->escape($v), $sql); } $this->sql = $sql; if( $query = mysql_query($sql, $this->_getWriteLink()) ) return $query; else $this->error('MySQL Query Error'); } //从结果集中取得一行作为关联数组,或数字数组,或二者兼有 public function fetchArray($query, $result_type = MYSQL_ASSOC) { return $this->unEscape( mysql_fetch_array($query, $result_type) ); } //取得前一次 MySQL 操作所影响的记录行数 public function affectedRows() { return mysql_affected_rows($this->_getWriteLink()); } //获取上一次插入的id public function lastId() { return ($id = mysql_insert_id( $this->_getWriteLink() )) >= 0 ? $id : mysql_result($this->execute("SELECT last_insert_id()"), 0); } //获取表结构 public function getFields($table) { $this->sql = "SHOW FULL FIELDS FROM {$table}"; $query = $this->query($this->sql); $data = array(); while($row = $this->fetchArray($query)){ $data[] = $row; } return $data; } //获取行数 public function count($table,$where) { $this->sql = "SELECT count(*) FROM $table $where"; $query = $this->query($this->sql); $data = $this->fetchArray($query); return $data['count(*)']; } //数据过滤 public function escape($value) { if( isset($this->_readLink) ) { $link = $this->_readLink; } elseif( isset($this->_writeLink) ) { $link = $this->_writeLink; } else { $link = $this->_getReadLink(); } if( is_array($value) ) { return array_map(array($this, 'escape'), $value); } else { if( get_magic_quotes_gpc() ) { $value = stripslashes($value); } return "'" . mysql_real_escape_string($value, $link) . "'"; } } //数据过滤 public function unEscape($value) { if (is_array($value)) { return array_map('stripslashes', $value); } else { return stripslashes($value); } } //解析待添加或修改的数据 public function parseData($options, $type) { //如果数据是字符串,直接返回 if(is_string($options['data'])) { return $options['data']; } if( is_array($options) && !empty($options) ) { switch($type){ case 'add': $data = array(); $data['fields'] = array_keys($options['data']); $data['values'] = $this->escape( array_values($options['data']) ); return " (`" . implode("`,`", $data['fields']) . "`) VALUES (" . implode(",", $data['values']) . ") "; case 'save': $data = array(); foreach($options['data'] as $key => $value) { $data[] = " `$key` = " . $this->escape($value); } return implode(',', $data); default:return false; } } return false; } //解析查询条件 public function parseCondition($options) { $condition = ""; if(!empty($options['where'])) { $condition = " WHERE "; if(is_string($options['where'])) { $condition .= $options['where']; } else if(is_array($options['where'])) { foreach($options['where'] as $key => $value) { $condition .= " `$key` = " . $this->escape($value) . " AND "; } $condition = substr($condition, 0,-4); } else { $condition = ""; } } if( !empty($options['group']) && is_string($options['group']) ) { $condition .= " GROUP BY " . $options['group']; } if( !empty($options['having']) && is_string($options['having']) ) { $condition .= " HAVING " . $options['having']; } if( !empty($options['order']) && is_string($options['order']) ) { $condition .= " ORDER BY " . $options['order']; } if( !empty($options['limit']) && (is_string($options['limit']) || is_numeric($options['limit'])) ) { $condition .= " LIMIT " . $options['limit']; } if( empty($condition) ) return ""; return $condition; } //输出错误信息 public function error($message = ''){ $error = mysql_error(); $errorno = mysql_errno(); if( DEBUG ){ $str = " {$message}<br> <b>SQL</b>: {$this->sql}<br> <b>错误详情</b>: {$error}<br> <b>错误代码</b>:{$errorno}<br>"; } else { $str = "<b>出错</b>: $message<br>"; } throw new Exception($str); } /******************兼容以前的版本*****************************/ //选择数据库 public function select_db($dbname) { return mysql_select_db($dbname, $this->_getWriteLink()); } //从结果集中取得一行作为关联数组,或数字数组,或二者兼有 public function fetch_array($query, $result_type = MYSQL_ASSOC) { return $this->fetchArray($query, $result_type); } //获取上一次插入的id public function insert_id() { return $this->lastId(); } //取得前一次 MySQL 操作所影响的记录行数 public function affected_rows() { return $this->affectedRows(); } //取得结果集中行的数目 public function num_rows($query) { return mysql_num_rows($query); } /******************兼容以前的版本*****************************/ //获取从服务器连接 private function _getReadLink() { if( isset( $this->_readLink ) ) { mysql_ping( $this->_readLink ); return $this->_readLink; } else { if( !$this->_replication ) { return $this->_getWriteLink(); } else { $this->_readLink = $this->_connect( false ); return $this->_readLink; } } } //获取主服务器连接 private function _getWriteLink() { if( isset( $this->_writeLink ) ) { mysql_ping( $this->_writeLink ); return $this->_writeLink; } else{ $this->_writeLink = $this->_connect( true ); return $this->_writeLink; } } //数据库链接 private function _connect($is_master = true) { if( ($is_master == false) && $this->_replication ) { $slave_count = count($this->dbConfig['DB_SLAVE']); //遍历所有从机 for($i = 0; $i < $slave_count; $i++) { $db_all[] = array_merge($this->dbConfig, $this->dbConfig['DB_SLAVE'][$i]); } $db_all[] = $this->dbConfig;//如果所有从机都连接不上,连接到主机 //随机选择一台从机连接 $rand = mt_rand(0, $slave_count-1); $db = array_unshift($db_all, $db_all[$rand]); } else { $db_all[] = $this->dbConfig; //直接连接到主机 } foreach($db_all as $db) { if( $link = @mysql_connect($db['DB_HOST'] . ':' . $db['DB_PORT'], $db['DB_USER'], $db['DB_PWD'])) { break; } } if(!$link){ $this->error('无法连接到数据库服务器'); } $version = mysql_get_server_info($link); if($version > '4.1') { mysql_query("SET character_set_connection = " . $db['DB_CHARSET'] . ", character_set_results = " . $db['DB_CHARSET'] . ", character_set_client = binary", $link); if($version > '5.0.1') { mysql_query("SET sql_mode = ''", $link); } } mysql_select_db($db['DB_NAME'], $link); return $link; } //关闭数据库 public function __destruct() { if($this->_writeLink) { @mysql_close($this->_writeLink); } if($this->_readLink) { @mysql_close($this->_readLink); } } }
相关推荐
canphp手册 canphp框架 canphp canphp手册 canphp框架 canphp canphp手册
不管您是在做大项目还是小项目或对开源系统二次开发,CanPHP框架都可以帮助您。CanPHP框架 v1.5 升级日志:1、增加xml类,用于xml数据转换成php数组2、增强分页类,优化生成的分页网址,增加长文章内容分页功能3、...
不管您是在做大项目还是小项目或对开源系统二次开发,CanPHP框架都可以帮助您。 CanPHP框架 v1.5 升级日志: 1、增加xml类,用于xml数据转换成php数组 2、增强分页类,优化生成的分页网址,增加长文章内容分页...
2. **模型-视图-控制器**:在CanPHP中,模型类用于封装与数据库交互的逻辑,视图文件用于展示数据,而控制器处理用户请求,调用模型并传递数据给视图,完成数据的渲染和响应。 3. **数据库操作**:CanPHP提供了简单...
CanPHP框架,中文名CP框架,是一个专为PHP开发者设计的轻量级、开源且功能强大的框架。这个框架以其简洁的代码结构、高度的可扩展性以及高效的性能,深受中小型项目开发者的喜爱。其核心设计理念是使开发过程更加...
CanPHP框架是一个简洁,实用,高效,遵循apache协议的php开源框架,以“简单、自由、包容”为理念,主要是为了简化和快速开发小型项目和开源系统二次开发而诞生。它既可以完美的支持MVC模式,又可以不受限制的支持...
CanPHP框架是一个简洁,实用,高效,遵循apache协议的php开源框架,以“简单、自由、包容”为理念,主要是为了简化和快速开发小型项目和开源系统二次开发而诞生。它既可以完美的支持MVC模式,又可以不受限制的支持...
作为一款开源框架,CanPHP鼓励并支持社区的贡献和改进,旨在简化PHP开发过程,提高代码质量和执行效率。以下是关于CanPHP框架及其核心特点、组件和使用方法的详细解释。 一、CanPHP框架的核心特点 1. **轻量级**:...
CanPHP框架以面向应用为主,不纠结于OOP,不纠结于MVC,不纠结于设计模式,不拘一格,力求简单快速优质的完成项目开发,是中小型项目开发首选php框架。 CanPHP框架(CP) 2.0 升级日志: 1、重构了数据库层,内置...
1. 安装:CanPHP1.5通常通过Composer进行安装,只需在项目根目录下运行`composer require canphp/canphp1.5`命令,即可将框架添加到项目依赖中。 2. 配置:框架的配置文件通常位于`config`目录下,开发者可以根据...
答:canphp很简单,很自由,功能也很实用,里面的类库都是独立的,随时都可以提取出来放到自己的其他项目中,即使你把它当作一个框架,你还可以把它当作一个工具包。 6、用什么开发工具去开发canphp比较好?答:php...
CanPHP框架以面向应用为主,不纠结于OOP,不纠结于MVC,不纠结于设计模式,不拘一格,力求简单快速优质的完成项目开发,是中小型项目开发首选php框架。 CanPHP框架(CP) 2.0 升级日志: 1、重构了数据库层,内置数据...
1. Model层:在CanPHP中,模型类用于与数据库交互,可以实现数据的增删查改操作。例如,用户管理模型会包含用户注册、登录、修改信息等方法。 2. View层:视图文件主要包含HTML、CSS和JavaScript,用于展示后台管理...
- `library`:库文件夹,包含核心框架类和用户自定义的类库。 - `public`:公共文件夹,通常放置静态资源如CSS、JavaScript和图片。 - `routes`:路由配置文件,定义URL到控制器的映射。 ### 2. MVC模式 - **Model...
2. **配置文件**:框架的配置文件用于设置全局参数,如数据库连接信息、错误处理、路由规则等。在CanPHP中,这些可能位于`Config`目录下。 3. **库和类文件**:PHP框架往往包含各种预定义的类和函数库,用于提供...
答:canphp很简单,很自由,功能也很实用,里面的类库都是独立的,随时都可以提取出来放到自己的其他项目中,即使你把它当作一个框架,你还可以把它当作一个工具包。 6、用什么开发工具去开发canphp比较好? 答:...
在实际项目中,CanPHP 2.0 Beta适用于中小型Web应用的开发,如企业网站、电子商务平台、内容管理系统等。其易用性、灵活性和高性能使其成为PHP开发者的得力工具。通过深入理解和熟练运用CanPHP 2.0 Beta,开发者能够...
"canphp1.1.zip" 是一个包含"PHP CA框架"的压缩文件,这个框架被称为“ca”,在PHP开发领域中被设计为一个强大的工具。CA框架,全称为"Component Architecture",它是为了提高开发效率,提供了一种组件化、模块化的...
CanPHP框架(简称CP),是一个简单、自由、实用、高效的php框架。...CanPHP框架以面向应用为主,不纠结于OOP,不纠结于MVC,不纠结于设计模式,不拘一格,力求简单快速优质的完成项目开发,是中小型项目开发首选php框架。