0%

数据库大作业笔记(八)

PHP与数据库中的查询

查询构造器

典型用法:

1
2
3
4
5
6
$rows = (new \yii\db\Query())
->select(['id', 'email'])
->from('user')
->where(['last_name' => 'Smith'])
->limit(10)
->all();

上面的代码将会生成并执行如下的SQL语句,其中 :last_name 参数绑定了 字符串 'Smith'

1
2
3
4
SELECT `id`, `email` 
FROM `user`
WHERE `last_name` = :last_name
LIMIT 10
创建查询
1
2
3
4
5
6
7
8
$query->select(['user.id AS user_id', 'email']);
// 等同于:
$query->select(['user_id' => 'user.id', 'email']);
// 等同于:
$query->select('user.id AS user_id, email');

// SELECT * FROM `user`
$query->from('user');

SQL 语句当中的 WHERE 子句:

  • 字符串格式,例如:'status=1'
  • 哈希格式,例如: ['status' => 1, 'type' => 2]
  • 操作符格式,例如:['like', 'name', 'test']
  • 对象格式,例如:new LikeCondition('name', 'LIKE', 'test')
1
2
3
4
5
6
7
$query->where('status=1');

// 或使用参数绑定来绑定动态参数值
$query->where('status=:status', [':status' => $status]);

// 原生 SQL 在日期字段上使用 MySQL YEAR() 函数
$query->where('YEAR(somedate) = 2015');

千万不要像如下的例子一样直接在条件语句当中嵌入变量,特别是当这些变量来源于终端用户输入的时候, 因为这样我们的软件将很容易受到 SQL 注入的攻击。(嘘~我的代码里就这样写过,悄咪咪的)

1
2
// 危险!千万别这样干,除非你非常的确定 $status 是一个整型数值。
$query->where("status=$status");
1
2
3
4
5
6
7
8
9
10
$status = 10;
$search = 'yii';

$query->where(['status' => $status]);

if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//如果 $search 不为空,那么将会生成如下 SQL 语句:
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')

这次作业中的查询主要用了like操作符:

like:第一个操作数应为一个字段名称或 DB 表达式, 第二个操作数可以使字符串或数组, 代表第一个操作数需要模糊查询的值。比如,[‘like’, ‘name’, ‘tester’] 会生成 name LIKE ‘%tester%’。 如果范围值是一个数组,那么将会生成用 AND 串联起来的 多个 like 语句。例如,[‘like’, ‘name’, [‘test’, ‘sample’]] 将会生成 name LIKE ‘%test%’ AND name LIKE ‘%sample%’

过滤条件

filterWhere()用于通常需要忽略用户输入的空值。

andfilterWhere()类似于andWhere()

使用yii\helpers\Html::submitButton() 方法生成提交按钮