注:这是hit9的项目php-mysql-orm的wiki
php-mysql-orm on Github: watch it!
1.开始
首先,我们建立好数据库mydb,和表user
create database mydb; use mydb; create table t_user( name char(20), email char(30), id int primary key auto_increment );
表格如下:
建立settings.php:
<?php define('DB_HOST','localhost'); define('DB_NAME','mydb'); define('DB_USER','root'); define('DB_PASSWD','123456'); define('TABLE_PREFIX','t_'); define('DB_CHAR_SET','utf8'); define('QUERY_ERROR',true);
2.实例化
<?php require_once('settings.php'); require_once('../src/db.class.php'); $user=new db('user');
默认的主键是id,如果想指明,用new db($tbl,$my_primary_key)
3.add()
<?php /* add */ $user->name='小明'; $user->email='xiaoming@gamil.com';//注:此处手误写成gamil.com了..,不影响使用^-^ $user->add();
执行结果
数组方式的添加:
<?php $data['name']='小红'; $data['email']='xiaohong@gmail.com'; $user->add($data);
执行结果
4.find()
1.按照主键查找
find($id)
返回一个对象
<?php echo $user->find(2)->name;
2.按照查询条件,结合where()
这种情况,find返回一个二维数组
<?php $re_arr=$user->where('id=1')->find(); print_r($re_arr);
还可以这样
<?php $c['name']='小明'; $re_arr=$user->where($c)->find(); print_r($re_arr);
返回的结果
3.配合select()使用
其实,select()只是告诉程序提取哪些字段.不用select的时候会SQL提取全部字段
<?php $arr=$user->select('name,email')->find(); foreach ($arr as $var) { echo $var['name'],$var['email']; }
当然还可以用数组做参数:
<?php $select=array('name','email'); $arr=$user->select($select)->find(); foreach ($arr as $var) { echo $var['name'],$var['email']; }
5.where()
where()方法接受字符串和数组参数,返回一个数据对象
字符串参数:
<?php $re_arr=$user->where('id=1 AND name="小明"')->find(); print_r($re_arr);
数组参数:
<?php $c['name']='小明'; $c['id']=1; $re_arr=$user->where($c)->find(); print_r($re_arr);
结果:
where 还支持一串长龙式的连贯.也就是where后面还可以继续where
6.limit()
limit()支持数字参数,也支持字符串参数.
<?php $re_arr=$user->where('id>1')->limit('1,3')->find();//从第一条开始,读取3条数据 print_r($re_arr);
另外 ,limit(1)
表示只读一条数据(即limit('0,1')
)
7.orderBy()
<?php $re_arr=$user->where('id>1')->orderBy('email')->find(); print_r($re_arr);
如果想要反序,使用orderBy('email DESC')
8.*like()
<?php echo $re=$user->where('id>1')->namelike('%小%')->getNum();
上例显示了name字段类似'%小%'的数据的数目
9.getBy*()
函数根据某个字段的值得到对应的一条数据记录.
<?php echo $user->getByName('小明')->email;//获取名字叫小明的人的email
注:getBy*()的*处必须是数据库该表的一个字段名(首字母需要大写)
10.getNum()
函数的参数可选:$sql.
参数是sql语句或者使用前面的查询条件,返回查询到的记录个数
<?php echo $user->emaillike('%@gmail.com')->getNum();//获取gmail用户的个数
11.update()
使用对象方式
1.按照主键更新
<?php $user->name='大明'; $user->update(1);
更改后结果:
2.按照条件更新
<?php $user->name='大红'; $user->where('name="小红"')->update();
当然,支持数组条件
<?php $c['name']='小李'; $user->name='大李'; $user->where($c)->update();
使用数组方式
1.按照主键更新
<?php $data['name']='大王'; $user->update(1,$data);
2.按照条件更新
<?php $data['name']='小明'; $user->where('name="大王"')->update($data);
12.delete()
delete()支持按照主键删除和按照查询条件删除.
<?php $user->delete(1);
删除一些数据:
<?php $condition['name']='小明'; $user->where($condition)->delete();
清空表:$user->empty_table();
13.事务处理
<?php /*要么这两条数据全部写入,要不全不写入*/ $user->begin();//开启一个事务 $user->name='小胖'; $user->email='xiaopang@gmail.com'; $re1=$user->add(); $user->name='小惠'; $user->email='xiaohui@gmail.com';//假如id=2已经有记录了,构造一个冲突 $re2=$user->add();//构造一个不可能完成的事件做回滚测试 if($re1 && $re2) { $user->commit();// 如果均顺利执行,commit }else{ $user->rollback();//否则有一个执行失败则回滚 }
Note: Mysql数据库要是INNODB或BDB才支持事务
14.exec_sql()
exec_sql($sql);函数参数是sql语句(支持CURD),查询失败返回false.查询成功返回二维数组结果集(便于foreach);添加,删除,更新返回bool
<?php $re_arr=$user->exec_sql('SELECT name FROM t_user WHERE 1'); foreach ($re_arr as $var) { echo $var['name']; }
尽量避免用裸SQL
15.table()
table()方法可以改变一个db实例的表名属性.参数是真实表名.(不带前缀)
16.多表联合查询
使用table()方法进行多表查询.
新建一个表t_profile.结构如下:
其中有一条数据:
我们想得到name
和tel
的对应关系:
<?php $arr=$user->table('t_user p,t_profile q')->where('p.id=q.id')->select('p.name,q.tel')->find(); print_r($arr);