您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# PHP如何实现多条件查询数据库
## 前言
在Web开发中,数据库查询是最常见的操作之一。实际业务场景中,用户往往需要通过多个条件组合来筛选数据。本文将详细介绍PHP中实现多条件查询数据库的多种方法,包括基础SQL拼接、预处理语句以及框架实现方案。
---
## 一、基础SQL拼接实现
### 1.1 表单设计
```html
<form method="GET" action="search.php">
<input type="text" name="keyword" placeholder="关键词">
<select name="category">
<option value="">所有分类</option>
<option value="1">电子产品</option>
<option value="2">图书</option>
</select>
<input type="number" name="min_price" placeholder="最低价">
<button type="submit">搜索</button>
</form>
<?php
// 获取参数
$keyword = $_GET['keyword'] ?? '';
$category = $_GET['category'] ?? '';
$minPrice = $_GET['min_price'] ?? '';
// 基础SQL
$sql = "SELECT * FROM products WHERE 1=1";
// 动态拼接条件
if (!empty($keyword)) {
$sql .= " AND name LIKE '%$keyword%'";
}
if (!empty($category)) {
$sql .= " AND category_id = $category";
}
if (!empty($minPrice)) {
$sql .= " AND price >= $minPrice";
}
// 执行查询
$result = mysqli_query($conn, $sql);
优点:实现简单直接
缺点:存在SQL注入风险,需要手动转义参数
<?php
$params = [];
$conditions = [];
$sql = "SELECT * FROM products WHERE 1=1";
if (!empty($_GET['keyword'])) {
$conditions[] = "name LIKE ?";
$params[] = '%'.$_GET['keyword'].'%';
}
if (!empty($_GET['category'])) {
$conditions[] = "category_id = ?";
$params[] = $_GET['category'];
}
if (!empty($_GET['min_price'])) {
$conditions[] = "price >= ?";
$params[] = $_GET['min_price'];
}
if (!empty($conditions)) {
$sql .= " AND " . implode(" AND ", $conditions);
}
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$types = '';
$values = [];
if (!empty($_GET['keyword'])) {
$conditions[] = "name LIKE ?";
$types .= 's';
$values[] = '%'.$_GET['keyword'].'%';
}
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($types, ...$values);
$stmt->execute();
优点:有效防止SQL注入
缺点:代码量稍多
$query = Product::query();
if ($request->has('keyword')) {
$query->where('name', 'LIKE', '%'.$request->keyword.'%');
}
if ($request->filled('category')) {
$query->where('category_id', $request->category);
}
$results = $query->get();
$map = [];
if (!empty($_GET['keyword'])) {
$map[] = ['name', 'like', '%'.$_GET['keyword'].'%'];
}
$list = Db::name('products')
->where($map)
->select();
优点:语法简洁,链式调用
缺点:需要学习框架语法
$orderField = in_array($_GET['sort'], ['price', 'sales'])
? $_GET['sort'] : 'id';
$orderType = $_GET['order'] == 'desc' ? 'DESC' : 'ASC';
$sql .= " ORDER BY $orderField $orderType";
$page = max(1, $_GET['page'] ?? 1);
$perPage = 15;
$offset = ($page - 1) * $perPage;
$sql .= " LIMIT $offset, $perPage";
$cacheKey = md5(serialize($_GET));
if (!$results = $cache->get($cacheKey)) {
$results = $db->query($sql);
$cache->set($cacheKey, $results, 3600);
}
永远不要信任用户输入
filter_input()
过滤输入(int)$_GET['id']
最小权限原则
错误处理
try {
// 数据库操作
} catch (PDOException $e) {
error_log($e->getMessage());
// 显示友好错误
}
实现多条件查询需要平衡开发效率与安全性。对于简单项目,预处理语句是最佳选择;使用框架时,优先采用其查询构建器。记得始终考虑性能和安全性,特别是在处理复杂查询时。
通过本文介绍的方法,您应该能够灵活应对各种多条件查询场景,构建出既安全又高效的数据库查询功能。 “`
注:实际字数约1200字,可根据需要增减示例或扩展特定部分的说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。