DAO(Data Access Objects 数据库访问对象)
Yii 包含了一个建立在 PHP PDO 之上的数据访问层 (DAO)。DAO为不同的数据库提供了一套统一的API。
示例:
以 Yii 2.0 基础版为例,高级版类似。
首先,在 basic 目录下新建一个文件夹 entity,然后在 basic/entity 目录下新建 basicUser.php 文件,里面封装了对 basic_user 表的 CURD 操作(增、删、改、查),内容如下:
db; // 实例化一个db组件
$sql = 'INSERT '.self::TABLE_NAME.'(username,passwd) VALUES("jack","123456")';
$command = $db->createCommand($sql);
$command->execute(); // 执行sql语句,返回值为受影响的行数
return $db->lastInsertID; // 获取新增记录的主键id */
/* // 通过面向对象编程的方式
$res = \Yii::$app->db->createCommand()
->insert(self::TABLE_NAME, array('username'=>'rose', 'passwd'=>'888888'))
->execute(); // 新增操作,返回的是受影响的行数
return \Yii::$app->db->lastInsertID; */
// 同时插入多条记录
// INSERT table_name(columns) VALUES(val1),(val2)
$res = \Yii::$app->db->createCommand()
->batchInsert(self::TABLE_NAME, array('username','passwd'), array(array('user1','111111'), array('user2','222222')))
->execute();
return \Yii::$app->db->lastInsertID; // 注意这里返回的是批量插入的第一条记录的主键id
}
/**
* 删除记录
*/
public function del(){
$res = \Yii::$app->db->createCommand()
->delete(self::TABLE_NAME, ['id'=>3])
->execute(); // 删除操作,返回的是受影响的行数
return $res;
}
/**
* 更新记录
*/
public function update(){
$res = \Yii::$app->db->createCommand()
->update(self::TABLE_NAME, ['username'=>'newuser'], ['id'=>2])
->execute(); // 更改操作,返回的是受影响的行数
return $res;
}
/**
* 查询多条记录(查询操作是增、删、改、查中,最为复杂的操作)
*/
public function query(){
$sql = 'SELECT * FROM '.self::TABLE_NAME;
$res = \Yii::$app->db->createCommand($sql)
->queryAll(); // 返回二维数组
return $res;
}
/**
* 查询单条记录
*/
public function getUserInfo($username){
/* // 这种sql语句的写法不安全,容易引起sql注入
$sql = 'SELECT * FROM '.self::TABLE_NAME.' WHERE username="'.$username.'"';
$res = \Yii::$app->db->createCommand($sql)
->queryOne(); // 返回一维数组
return $res; */
// 使用参数绑定,php的pdo扩展支持参数绑定的形式来书写sql,可预防sql注入
$sql = 'SELECT * FROM '.self::TABLE_NAME.' WHERE username=:uname'; // 使用占位符 :uname
$res = \Yii::$app->db->createCommand($sql)
->bindValues(array(':uname'=>$username)) // 参数绑定
->queryOne(); // 返回一维数组
return $res;
// 增、删、改、查操作,都可以使用参数绑定的方式,防止sql注入
}
/**
* 事务的操作
*/
public function trans(){
$db = \Yii::$app->db;
$trans = $db->beginTransaction();
try {
//...
$trans->commit();
return true;
} catch (\Exception $e) {
$trans->rollBack();
return false;
}
}
}
然后,修改数据库配置文件 basic/config/db.php,如下:
'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
再在MySQL数据库中新建一个数据库 test,创建数据表 basic_user,包含字段id、username、passwd。
最后,在 basic/controllers 目录下新建一个控制器 TestController.php,内容如下:
add();
var_dump($res);
}
/**
* 删除记录
*/
public function actionDel(){
$res = (new BasicUser())->del();
var_dump($res);
}
/**
* 编辑记录
*/
public function actionEdit(){
$res = (new BasicUser())->update();
var_dump($res);
}
/**
* 查询多条记录
*/
public function actionQuery(){
$res = (new BasicUser())->query();
echo json_encode($res);
}
/**
* 查询单个用户信息
*/
public function actionGetInfo(){
$res = (new BasicUser())->getUserInfo('jack');
var_dump($res);
}
}
在浏览器地址栏分别访问以下地址,查看对应的效果:
http://basic.com/test/add
http://basic.com/test/del
http://basic.com/test/edit
http://basic.com/test/query
http://basic.com/test/get-info