qq_诺艳冰华_0
哦我知道了。self::返回它自己实例化的对象。有点相当于$db = DB::getInstance();可以写成$db = new DB();
qq_9987
hen 好
kihoor
因为需要带参数
xvrzhao
对,我也这么觉得
慕粉1522128115
pc.php(启动引擎文件)前面用了一个foreach循环把include.list.php里面的文件都引入了。所以只需要在pc.php中引入include.list.php即可
红客3696464
我的理解是 将sql语句的执行结果返回
坚持MyDream
不是写的东西防反了,是写的顺序反了。正常来说,应该先写总方法,再写不同数据库下实现该方法的操作。但是老师却先写MySQL数据库的操作,再在DB中调用。所以说反了。
penn_z
因为这些类都在pc.php里require了,而且是在pc.php里调用init_db实例化的啊
神王葬天
DB只是规定了做哪些操作,具体执行操作可以分别封装到不同的类中,oracle数据库的具体操作写到oracle相关的类文件中,mysql数据库的操作可以写到mysql数据库相关的类中。
不二之家
还有就是,类库就是面向对象编程,面向对象是基于人类发展的理念来发明的,一切都归于跟本,面向对象符合人类发展历史,而且就目前来看,面向对象是具有跨时代和跨区域的优点,等你熟悉掌握之后你就会明白了,光说不练假把式,我们能告诉你的就只有这些,其他还靠你慢慢领悟了。
落凤雏669
我用的就是mysqli类,可以分享一下。已经过初步测试,能用。深度测试还没做。
<?php
class mysqliDB{
public static $mysqli = null;
/*
* 报错函数
* @param string $err
*/
function error($err){
die("对不起,您的操作有误,错误原因为:" . $err);
}
/*
* 连接数据库
*连接mysqli : mysqli是mysql的增强版本,用pdo连接数据库效率要比mysql直*接连接要慢,综合考虑,本人尝试用mysqli以面象对象的方式操作数据库
* @param string $config
* @param string $dbhost 主机名
* @param string $dbuser 用户名
* @param string $dbpwd 密码
* @param string $dbname 数据库名
* @param string $dbcharset 字符集/编码
* @return boolean
*/
// public function __construct($config = ''){
public function connect($config = ''){
if(!class_exists('mysqli')){
$this->error('不支持mysqli,请先开启');
}
if(is_array($config) && !empty($config)){
extract($config);
if(empty($dbhost)){
$this->error('没有定义数据库配置');
}
}
if(!isset(self::$mysqli)){
try{
self::$mysqli = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
}catch(mysqli_sql_exception $e){
$this->error($e->getMessage);
}
if(self::$mysqli->errno){
error('('. self::$mysqli->errno . ')' . self::$mysqli->error);
return false;
}
if(!self::$mysqli->set_charset("utf8")){
error('('. self::$mysqli->errno . ')' . self::$mysqli->error);
}
return self::$mysqli;
}
}
/*
* 执行sql语句
* @param string $sql
* @return bool 返回成功、资源、失败
*/
function query($sql){
if((($query = mysqli_query(self::$mysqli,$sql))) === false){
$this->error($sql . '<br/>' . mysqli_error(self::$mysqli));
}else{
return $query;
}
}
/*
* 列表
* @param source $query sql语句通过mysqli_query执行出来的资源
* @return array 列表数组
*/
function findAll($query){
return mysqli_fetch_all($query,MYSQLI_ASSOC);
}
/*
* 单条
* @param source $query sql语句通过mysqli_query执行出来的资源
* @return array 单条信息数组
*/
function findOne($query){
return mysqli_fetch_array($query,MYSQLI_ASSOC);
}
/*
* 指定行的指定字段的值
* @param source $query sql语句通过mysqli_query执行出来的资源
* @return array 返回指定行的指定字段值
*/
function findResult($query,$row=0,$field=0){
mysqli_data_seek($query,$row);
return mysqli_fetch_row($query)[$field];
}
/*
* 添加行
* @param string $table
* @param array $arr 添加数组 (二维数组)
* [['name'=>'cat1','age'=>1],['name'=>'cat2','age'=>2],...]
* @return 返回插入的id
*/
function insert($table,$arr){
$keys = array_keys($arr[0]);
array_walk($keys,array('mysqliDB','addSpecialChar'));
$fields = join(',',$keys);
$binds = '('. str_replace(' ',',', trim(str_repeat("? ",count($arr[0])))) . ')';
$types = $this->getTypes($arr[0]);
$this->addSpecialChar($table);
$sql = "INSERT INTO {$table}({$fields}) VALUES {$binds} ";
$stmt = self::$mysqli->prepare($sql);
if(!$stmt){
$this->error("sql stament 为空");
}
foreach($arr as $k => $v){
extract($v);
foreach($v as $k1 => $v1){
eval('$vals[\''. $k . '\'] [\''. $k1 . '\'] = &$' . $k1 . ';');
}
unset($k1,$v1);
}
unset($k,$v);
$store = array();
foreach($vals as $v){
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), $v));
mysqli_stmt_execute($stmt);
$store[] = $stmt->insert_id;
}
unset($v);
return $store;
}
/*
* 注防sql注放按照insert的方法
* 修改函数
* @param string $table
* @param array $arr 修改数组(一维数组)
* @param string $where 条件 array('and' => array('name'=> 'cat1', id=> 7), 'or' => array('sex' => 1));
* @return
*/
function update($table,$arr,$where){
$kArr = array();
foreach($arr as $k => $v){
$v = mysqli_real_escape_string(self::$mysqli,$v);
$kArr[] = $this->addSpecialChar($k) . "='" .$v . "'";
}
$kArr = implode(",", $kArr);
$this->addSpecialChar($table);
$sql = "update " .$table . " set " . $kArr . " where " . $where;
// return $sql;
$this->query($sql);
}
/*
* 删除函数
* @param string $table 表名
* @param string $where 条件
*/
function del($table,$where){
$this->addSpecialChar($table);
$sql = "delete from {$table} where {$where}";
// return $sql;
$this->query($sql);
}
/*
*获取参数类型首字母
* @param array $arr
*/
function getTypes($arr=array()){
$strType = '';
if(!empty($arr)){
foreach($arr as $var){
$chrType = substr((string)gettype($var),0,1);
$strType .= (!in_array($chrType,array("i","d","s"))) ? "b" : $chrType;
}
}
return $strType;
}
/*
* 通过反引号引用字段
* @param unknown $value
* @return string
*/
function addSpecialChar(&$value){
if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){
//不用做处理
}elseif(strpos($value,'`')===false){
$value='`'.trim($value).'`';
}
return $value;
}
}
科密明哥
如果是其他的数据库,如SQL server的数据库,那么你要写一个SQL server的数据库类,并且这个SQL server数据库类所具有的方法及调用这些方法的参数要符合一个通用的标准.这样一来,不管你用工厂模式实例化出什么样的数据库实例,这些数据库实例都具有相同的方法,相同的调用参数,这样一来,程序的可扩展性就提高了.
不同的数据库类实现相同的方法(及调用方法时的参数),这最好先做一个数据库类的接口,制定一个标准,让各种不同的数据库类来实现这个接口的功能.
骡子不会飞
insert传入的是整合到一个数组中的表单的数据,需要表名来指定是哪个表,其他那几个传入的是一个已经处理好的SQL语句,语句中已经带着所需的表了
小明在努力
看情况的,当不需要传参的时候,大多数情况是可以不加括号的;但是有的时候会报错,那就得加上括号。一般来说加上括号创建对象为好。
frgo_03360772
慕粉15830835702
肯定不是啊,工厂类只是决定调用哪一个数据库类,而这里刚好是调用MYSQL类
随便起哟个
inti 一次就可以了,DB可以看作是一个 静态类。
im去流浪
我明白了 之前我测试的时候取得类名不是mysql,所以调用connect方法不是调用自定义的connect方法,而它是调用了myslq的connect方法,所以得不到想要的结果。。。。哈哈 想通了
大脑艾瑞克

因为PC类已经引入啦
戴红领巾的小黄人
嗯,对的
奋斗的大鼻子查理
它是直接实例化 类 的,然后再用实例化的对象调用函数,类是全局变量,不超域都可以用
Sharon_zd
看下一节,工厂类使用的时候,就直接用DB::query 就行了。嘿嘿
最美不过刘亦菲
可以试试看。 括号里面可以给构造函数传参。而且我觉得没有括号感觉怪怪的。你自己试下有没有问题。
lmb_lijiyun
通过工厂模式来进行实例化了
weibo_玖麽炎_0
KC_swag
周末_1991
DB类又封装了一次。直接以sql作为参数
smilelove
那个工厂类的产出是实例化好的mysql类的对象。可以提供不同的数据库类,让那个工厂类实例化出不同的对象来
若风情殇
new $dbtype 这里面 例如 $dbtype 的值是 mysql 那就是 new mysql()
Rod