Hit9 Blog Wiki Project Links Archives Resumé
Page: First UP Pre Next Back

PHP的mysql数据库操作类-抛弃裸SQL语句

Fork me on GitHub

允许转载, 但转载请注明出处

注:这是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.结构如下:

其中有一条数据:

我们想得到nametel的对应关系:

<?php
$arr=$user->table('t_user p,t_profile q')->where('p.id=q.id')->select('p.name,q.tel')->find();
print_r($arr);

Support:mkdwiki