php类封装
A. 求个好用的php mysql封装类
<?php
classMMysql{
protectedstatic$_dbh=null;//静态属性,所有数据库实例共用,避免重复连接数据库
protected$_dbType='mysql';
protected$_pconnect=true;//是否使用长连接
protected$_host='localhost';
protected$_port=3306;
protected$_user='root';
protected$_pass='root';
protected$_dbName=null;//数据库名
protected$_sql=false;//最后一条sql语句
protected$_where='';
protected$_order='';
protected$_limit='';
protected$_field='*';
protected$_clear=0;//状态,0表示查询条件干净,1表示查询条件污染
protected$_trans=0;//事务指令数
/**
*初始化类
*@paramarray$conf数据库配置
*/
publicfunction__construct(array$conf){
class_exists('PDO')ordie("PDO:classnotexists.");
$this->_host=$conf['host'];
$this->_port=$conf['port'];
$this->_user=$conf['user'];
$this->_pass=$conf['passwd'];
$this->_dbName=$conf['dbname'];
//连接数据库
if(is_null(self::$_dbh)){
$this->_connect();
}
}
/**
*连接数据库的方法
*/
protectedfunction_connect(){
$dsn=$this->_dbType.':host='.$this->_host.';port='.$this->_port.';dbname='.$this->_dbName;
$options=$this->_pconnect?array(PDO::ATTR_PERSISTENT=>true):array();
try{
$dbh=newPDO($dsn,$this->_user,$this->_pass,$options);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置如果sql语句执行错误则抛出异常,事务会自动回滚
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);//禁用preparedstatements的仿真效果(防SQL注入)
}catch(PDOException$e){
die('Connectionfailed:'.$e->getMessage());
}
$dbh->exec('SETNAMESutf8');
self::$_dbh=$dbh;
}
/**
*字段和表名添加`符号
*保证指令中使用关键字不出错针对mysql
*@paramstring$value
*@returnstring
*/
protectedfunction_addChar($value){
if('*'==$value||false!==strpos($value,'(')||false!==strpos($value,'.')||false!==strpos($value,'`')){
//如果包含*或者使用了sql方法则不作处理
}elseif(false===strpos($value,'`')){
$value='`'.trim($value).'`';
}
return$value;
}
/**
*取得数据表的字段信息
*@paramstring$tbName表名
*@returnarray
*/
protectedfunction_tbFields($tbName){
$sql='SELECTCOLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME="'.$tbName.'"ANDTABLE_SCHEMA="'.$this->_dbName.'"';
$stmt=self::$_dbh->prepare($sql);
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);
$ret=array();
foreach($resultas$key=>$value){
$ret[$value['COLUMN_NAME']]=1;
}
return$ret;
}
/**
*过滤并格式化数据表字段
*@paramstring$tbName数据表名
*@paramarray$dataPOST提交数据
*@returnarray$newdata
*/
protectedfunction_dataFormat($tbName,$data){
if(!is_array($data))returnarray();
$table_column=$this->_tbFields($tbName);
$ret=array();
foreach($dataas$key=>$val){
if(!is_scalar($val))continue;//值不是标量则跳过
if(array_key_exists($key,$table_column)){
$key=$this->_addChar($key);
if(is_int($val)){
$val=intval($val);
}elseif(is_float($val)){
$val=floatval($val);
}elseif(preg_match('/^(w*(+|-|*|/)?w*)$/i',$val)){
//支持在字段的值里面直接使用其它字段,例如(score+1)(name)必须包含括号
$val=$val;
}elseif(is_string($val)){
$val='"'.addslashes($val).'"';
}
$ret[$key]=$val;
}
}
return$ret;
}
/**
*执行查询主要针对SELECT,SHOW等指令
*@paramstring$sqlsql指令
*@returnmixed
*/
protectedfunction_doQuery($sql=''){
$this->_sql=$sql;
$pdostmt=self::$_dbh->prepare($this->_sql);//prepare或者query返回一个PDOStatement
$pdostmt->execute();
$result=$pdostmt->fetchAll(PDO::FETCH_ASSOC);
return$result;
}
/**
*执行语句针对INSERT,UPDATE以及DELETE,exec结果返回受影响的行数
*@paramstring$sqlsql指令
*@returninteger
*/
protectedfunction_doExec($sql=''){
$this->_sql=$sql;
returnself::$_dbh->exec($this->_sql);
}
/**
*执行sql语句,自动判断进行查询或者执行操作
*@paramstring$sqlSQL指令
*@returnmixed
*/
publicfunctiondoSql($sql=''){
$queryIps='INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOADDATA|SELECT.*INTO|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK';
if(preg_match('/^s*"?('.$queryIps.')s+/i',$sql)){
return$this->_doExec($sql);
}
else{
//查询操作
return$this->_doQuery($sql);
}
}
/**
*获取最近一次查询的sql语句
*@returnString执行的SQL
*/
publicfunctiongetLastSql(){
return$this->_sql;
}
/**
*插入方法
*@paramstring$tbName操作的数据表名
*@paramarray$data字段-值的一维数组
*@returnint受影响的行数
*/
publicfunctioninsert($tbName,array$data){
$data=$this->_dataFormat($tbName,$data);
if(!$data)return;
$sql="insertinto".$tbName."(".implode(',',array_keys($data)).")values(".implode(',',array_values($data)).")";
return$this->_doExec($sql);
}
/**
*删除方法
*@paramstring$tbName操作的数据表名
*@returnint受影响的行数
*/
publicfunctiondelete($tbName){
//安全考虑,阻止全表删除
if(!trim($this->_where))returnfalse;
$sql="deletefrom".$tbName."".$this->_where;
$this->_clear=1;
$this->_clear();
return$this->_doExec($sql);
}
/**
*更新函数
*@paramstring$tbName操作的数据表名
*@paramarray$data参数数组
*@returnint受影响的行数
*/
publicfunctionupdate($tbName,array$data){
//安全考虑,阻止全表更新
if(!trim($this->_where))returnfalse;
$data=$this->_dataFormat($tbName,$data);
if(!$data)return;
$valArr='';
foreach($dataas$k=>$v){
$valArr[]=$k.'='.$v;
}
$valStr=implode(',',$valArr);
$sql="update".trim($tbName)."set".trim($valStr)."".trim($this->_where);
return$this->_doExec($sql);
}
/**
*查询函数
*@paramstring$tbName操作的数据表名
*@returnarray结果集
*/
publicfunctionselect($tbName=''){
$sql="select".trim($this->_field)."from".$tbName."".trim($this->_where)."".trim($this->_order)."".trim($this->_limit);
$this->_clear=1;
$this->_clear();
return$this->_doQuery(trim($sql));
}
/**
*@parammixed$option组合条件的二维数组,例:$option['field1']=array(1,'=>','or')
*@return$this
*/
publicfunctionwhere($option){
if($this->_clear>0)$this->_clear();
$this->_where='where';
$logic='and';
if(is_string($option)){
$this->_where.=$option;
}
elseif(is_array($option)){
foreach($optionas$k=>$v){
if(is_array($v)){
$relative=isset($v[1])?$v[1]:'=';
$logic=isset($v[2])?$v[2]:'and';
$condition='('.$this->_addChar($k).''.$relative.''.$v[0].')';
}
else{
$logic='and';
$condition='('.$this->_addChar($k).'='.$v.')';
}
$this->_where.=isset($mark)?$logic.$condition:$condition;
$mark=1;
}
}
return$this;
}
/**
*设置排序
*@parammixed$option排序条件数组例:array('sort'=>'desc')
*@return$this
*/
publicfunctionorder($option){
if($this->_clear>0)$this->_clear();
$this->_order='orderby';
if(is_string($option)){
$this->_order.=$option;
}
elseif(is_array($option)){
foreach($optionas$k=>$v){
$order=$this->_addChar($k).''.$v;
$this->_order.=isset($mark)?','.$order:$order;
$mark=1;
}
}
return$this;
}
/**
*设置查询行数及页数
*@paramint$pagepageSize不为空时为页数,否则为行数
*@paramint$pageSize为空则函数设定取出行数,不为空则设定取出行数及页数
*@return$this
*/
publicfunctionlimit($page,$pageSize=null){
if($this->_clear>0)$this->_clear();
if($pageSize===null){
$this->_limit="limit".$page;
}
else{
$pageval=intval(($page-1)*$pageSize);
$this->_limit="limit".$pageval.",".$pageSize;
}
return$this;
}
/**
*设置查询字段
*@parammixed$field字段数组
*@return$this
*/
publicfunctionfield($field){
if($this->_clear>0)$this->_clear();
if(is_string($field)){
$field=explode(',',$field);
}
$nField=array_map(array($this,'_addChar'),$field);
$this->_field=implode(',',$nField);
return$this;
}
/**
*清理标记函数
*/
protectedfunction_clear(){
$this->_where='';
$this->_order='';
$this->_limit='';
$this->_field='*';
$this->_clear=0;
}
/**
*手动清理标记
*@return$this
*/
publicfunctionclearKey(){
$this->_clear();
return$this;
}
/**
*启动事务
*@returnvoid
*/
publicfunctionstartTrans(){
//数据rollback支持
if($this->_trans==0)self::$_dbh->beginTransaction();
$this->_trans++;
return;
}
/**
*用于非自动提交状态下面的查询提交
*@returnboolen
*/
publicfunctioncommit(){
$result=true;
if($this->_trans>0){
$result=self::$_dbh->commit();
$this->_trans=0;
}
return$result;
}
/**
*事务回滚
*@returnboolen
*/
publicfunctionrollback(){
$result=true;
if($this->_trans>0){
$result=self::$_dbh->rollback();
$this->_trans=0;
}
return$result;
}
/**
*关闭连接
*PHP在脚本结束时会自动关闭连接。
*/
publicfunctionclose(){
if(!is_null(self::$_dbh))self::$_dbh=null;
}
}
B. php实现mysql封装类示例
php封装mysql类
复制代码
代码如下:
<?php
class
Mysql
{
private
$host;
private
$user;
private
$pwd;
private
$dbName;
private
$charset;
private
$conn
=
null;
public
function
__construct()
{
$this->host
=
'localhost';
$this->user
=
'root';
$this->pwd
=
'root';
$this->dbName
=
'test';
$this->connect($this->host,$this->user,$this->pwd);
$this->switchDb($this->dbName);
$this->setChar($this->charset);
}
//负责链接
private
function
connect($h,$u,$p)
{
$conn
=
mysql_connect($h,$u,$p);
$this->conn
=
$conn;
}
//负责切换数据库
public
function
switchDb($db)
{
$sql
=
'use'
.
$db;
$this->query($sql);
}
//负责设置字符集
public
function
setChar($char)
{
$sql
=
'set
names'
.
$char;
$this->query($sql);
}
//负责发送sql查询
public
function
query($sql)
{
return
mysql_query($sql,$this->conn);
}
//负责获取多行多列的select结果
public
function
getAll($sql)
{
$list
=
array();
$rs
=
$this->query($sql);
if
(!$rs)
{
return
false;
}
while
($row
=
mysql_fetch_assoc($rs))
{
$list[]
=
$row;
}
return
$list;
}
public
function
getRow($sql)
{
$rs
=
$this->query($sql);
if(!$rs)
{
return
false;
}
return
mysql_fetch_assoc($rs);
}
public
function
getOne($sql)
{
$rs
=
$this->query($sql);
if
(!$rs)
{
return
false;
}
return
mysql_fetch_assoc($rs);
return
$row[0];
}
public
function
close()
{
mysql_close($this->conn);
}
}
echo
'<pre>';
$mysql
=
new
Mysql();
print_r($mysql);
$sql
=
"insert
into
stu
values
(4,'wangwu','99998')";
if($mysql->query($sql)){
echo
"query成功";
}else
{
echo
"失败";
}
echo
"<br
/>";
$sql
=
"select
*
from
stu";
$arr
=
$mysql->getAll($sql);
print_r($arr);
?>
C. PHP如何封装方法
//下面定义一个方法,这个方法很简单,就是处理2个数的相加问题
functionadd($number1,$number2){
$sum=$number1+$number2;
echo$sum;
}
//我们来调用add()方法
add(1,2);
/**
说明版:
function这个关键字就是声权明方法的。在这个关键字后面的add就是方法的名称,括号中的是参数。
也可以没有参数的。大括号内是方法体。里面是该方法的逻辑。
下面的add(1,2)就是调用add这个方法。如果没有调用方法将不会被执行的。
*/
//定义一个带有返回值的方法
functionre($n1,$n2){
$sum=$n1+$n2;
return$sum;
}
//调用有返回值的方法,调用这个方法,值是5。
echore(2,3);
D. 什么是php中的封装
封装是php面向对象的其中一个特性,将多个可重复使用的函数封装到一专个类里面。在使用时直接实属例化该类的某一个方法,获得需要的数据
如果是私有的方法和属性值,外部无法访问,具有一定的保护作用。
面向对象之封装 例子
class A{
public $name = '老王';
// protected $name = '老王';
//private $name = '老王';
//自己访问
public function saya(){
return $this->name;
}
}
//实例化对象
$b = new A;
//public:外部、家族、自己都可以访问
//protected:家族和自己都可以访问,外部无法访问
//private:自己可以访问,外部和家族都无法访问
echo '外部访问:'.$b->name.'<br>'; //如果是私有的,访问不了
echo '家族访问:'.$b->sayb().'<br>';
echo '自己访问:'.$b->saya().'<br>';
E. php封装一个class类实现mysql改的方法
/**
* 执行更新记录操作
* @param $data 要更新的数据内容,参数可以为数组也可以为字符串,建议数组。
* 为数组时数组key为字段值,数组值为数据取值
* 为字符串时[例:`name`='phpcms',`hits`=`hits`+1]。
* 为数组时[例: array('name'=>'phpcms','password'=>'123456')]
* 数组可使用array('name'=>'+=1', 'base'=>'-=1');程序会自动解析为`name` = `name` + 1, `base` = `base` - 1
* @param $table 数据表
* @param $where 更新数据时的条件
* @return boolean
*/
public function update($data, $table, $where = '') {
if($table == '' or $where == '') {
return false;
}
$where = ' WHERE '.$where;
$field = '';
if(is_string($data) && $data != '') {
$field = $data;
} elseif (is_array($data) && count($data) > 0) {
$fields = array();
foreach($data as $k=>$v) {
switch (substr($v, 0, 2)) {
case '+=':
$v = substr($v,2);
if (is_numeric($v)) {
$fields[] = $this->add_special_char($k).'='.$this->add_special_char($k).'+'.$this->escape_string($v, '', false);
} else {
continue;
}
break;
case '-=':
$v = substr($v,2);
if (is_numeric($v)) {
$fields[] = $this->add_special_char($k).'='.$this->add_special_char($k).'-'.$this->escape_string($v, '', false);
} else {
continue;
}
break;
default:
$fields[] = $this->add_special_char($k).'='.$this->escape_string($v);
}
}
$field = implode(',', $fields);
} else {
return false;
}
$sql = 'UPDATE `'.$this->config['database'].'`.`'.$table.'` SET '.$field.$where;
return $this->execute($sql);
}
/**
* 数据库查询执行方法
* @param $sql 要执行的sql语句
* @return 查询资源句柄
*/
private function execute($sql) {
if(!is_resource($this->link)) {
$this->connect();
}
$this->lastqueryid = mysql_query($sql, $this->link) or $this->halt(mysql_error(), $sql);
$this->querycount++;
return $this->lastqueryid;
}
F. php封装一个class类实现mysql数据库的增删该查
class sqlHelper{
public $conn;
public $dbname="数据库名称";
public $username="数据库用户名";
public $password="数据库密码";
public $host="localhost";
//连接数据库
public function __construct(){
$this->conn=mysql_connect($this->host,$this->username,$this->password);
if(!$this->conn){
die("连接失败".mysql_error());
}
mysql_select_db($this->dbname,$this->conn);
}
//执行查询语句
public function execute_dql($sql){
$res=mysql_query($sql,$this->conn);
return $res;
}
//执行增填改语句
public function execute_dml($sql){
$b=mysql_query($sql,$this->conn);
if(!$b){
return 3;
}else{
if(mysql_affected_rows($this->conn)){
return 1;//表示OK
}else{
return 2;//表示没有行收到影响
}
}
}
}
G. php 封装是什么啊
这个就是语法格式
$this 就代表着当前的类
如果想用类的属性就 $this->name 这么写
H. PHP中,类的封装,调用问题
<?
class Page{
function 分页函数(参数){
$perNumber = 2;
$page = $_GET['page'];
$count = mysql_query("select count(*) from people");
$rs = mysql_fetch_array($count);
$totalNumber = $rs[0];
$totalPage = ceil($totalNumber/$perNumber);
if(!isset($page)){
$page = 1;
}
$startCount = ($page-1)*$perNumber;
$result = mysql_query("select * from people limit $startCount,$perNumber");
$num = mysql_numrows($result);
for($i=0;$i<$num;$i++){
$a = mysql_result($result,$i,"id");
$b = mysql_result($result,$i,"name");
$c = mysql_result($result,$i,"age");
echo "<br />".$a."<br />".$b."<br />".$c."<br />";
}
}
}
?>
I. 现在PHP编程的时候一般是把一个功能的实现封装成一个类还是封装成一个方法
单一功能的实现封装成方法比较方便,比如处理时间(现在回复贴子的时间与上次回复的时间间专隔这个功能封属装成一个方法便可以方便在每个需要的地方调用)。封装成类多数用于模块这种实现多功能的地方。如处理数据库:可以把与数据库有关的功能封装成类,在这个类中实现数据库的连接、查询,添加,删除、修改数据库等方法。还有处理图像,模板处理等等这些模块都可以封装成类有助于代码的可维护性,增强代码的重用性等好处就不多说了