不止热门角色,我们为你扩展了更多细分角色分类,覆盖职场提升、商业增长、内容创作、学习规划等多元场景。精准匹配不同目标,让每一次生成都更有方向、更高命中率。
立即探索更多角色分类,找到属于你的增长加速器。
SELECT
id,
name,
price,
stock,
sales,
category_id
FROM products
WHERE
status = 'active'
AND category_id = :category_id
AND price BETWEEN :min_price AND :max_price
AND name LIKE CONCAT('%', :kw, '%')
AND stock > 0
AND deleted_at IS NULL
ORDER BY
sales DESC,
price ASC,
id DESC
LIMIT 20;
查询目的:
字段解释:
条件分析:
<?php
declare(strict_types=1);
$dsn = 'mysql:host=127.0.0.1;dbname=your_db;charset=utf8mb4';
$username = 'your_user';
$password = 'your_pass';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 使用真正的预处理,防止注入与类型歧义
];
$pdo = new PDO($dsn, $username, $password, $options);
// 输入获取与校验(示例,可按实际来源调整)
$categoryId = filter_input(INPUT_GET, 'category_id', FILTER_VALIDATE_INT);
$minPriceIn = $_GET['min_price'] ?? null;
$maxPriceIn = $_GET['max_price'] ?? null;
$kwIn = $_GET['kw'] ?? '';
// 基本校验与清洗
if ($categoryId === false || $categoryId <= 0) {
http_response_code(400);
exit('Invalid category_id');
}
// 对于 DECIMAL(10,2) 等价格字段,使用字符串绑定避免浮点误差
$minPrice = is_numeric($minPriceIn) ? (string)$minPriceIn : '0';
$maxPrice = is_numeric($maxPriceIn) ? (string)$maxPriceIn : $minPrice;
// 保证 min <= max
if (bccomp($minPrice, $maxPrice, 8) === 1) {
[$minPrice, $maxPrice] = [$maxPrice, $minPrice];
}
// 关键词清洗与限长,避免超长输入影响性能
$kw = trim((string)$kwIn);
if ($kw === '') {
// 允许空关键词时,仍可使用 LIKE '%%',如需强制关键词可在此报错
}
$kw = mb_substr($kw, 0, 64);
// 预处理查询
$sql = <<<SQL
SELECT
id,
name,
price,
stock,
sales,
category_id
FROM products
WHERE
status = 'active'
AND category_id = :category_id
AND price BETWEEN :min_price AND :max_price
AND name LIKE CONCAT('%', :kw, '%')
AND stock > 0
AND deleted_at IS NULL
ORDER BY
sales DESC,
price ASC,
id DESC
LIMIT 20
SQL;
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':category_id', $categoryId, PDO::PARAM_INT);
// 对 DECIMAL 使用字符串绑定,避免浮点精度问题
$stmt->bindValue(':min_price', $minPrice, PDO::PARAM_STR);
$stmt->bindValue(':max_price', $maxPrice, PDO::PARAM_STR);
$stmt->bindValue(':kw', $kw, PDO::PARAM_STR);
$stmt->execute();
$products = $stmt->fetchAll();
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => $products,
'count' => count($products),
], JSON_UNESCAPED_UNICODE);
安全注意事项
性能优化提示
数据库连接配置要求
参数绑定的重要性
错误处理建议
SELECT
`id`,
`username`,
`email`,
`last_login`,
`role`
FROM `users`
WHERE
`role` IN (:role_0, :role_1 /* ... 动态展开,至少一个占位符 */)
AND `is_verified` = 1
AND `status` = 'active'
AND `last_login` >= :since
-- 可选条件:当提供关键字 :kw 时,追加下一行(注意在PHP中动态拼接)
-- AND `username` LIKE CONCAT('%', :kw, '%') ESCAPE '\'
ORDER BY `last_login` DESC, `id` DESC
LIMIT 50;
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=app;charset=utf8mb4',
$user,
$pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false, // 使用服务器端预处理
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
// 输入参数(示例)
$roles = ['admin', 'editor']; // 非空数组,建议来源于白名单
$since = '2024-01-01 00:00:00'; // 或使用 (new DateTimeImmutable('...'))->format('Y-m-d H:i:s');
$kw = null; // 可选:当为空字符串或null时不启用模糊匹配
if (empty($roles)) {
// 角色集合为空时,无匹配结果,避免构造非法 IN ()
echo json_encode([]);
exit;
}
// 动态构建 IN 占位符
$rolePlaceholders = [];
$params = [':since' => $since];
foreach (array_values($roles) as $i => $role) {
$ph = ":role_$i";
$rolePlaceholders[] = $ph;
$params[$ph] = $role; // 字符串角色
}
// 基础SQL
$sql = "
SELECT
`id`,
`username`,
`email`,
`last_login`,
`role`
FROM `users`
WHERE
`role` IN (" . implode(',', $rolePlaceholders) . ")
AND `is_verified` = 1
AND `status` = 'active'
AND `last_login` >= :since
";
// 可选关键字过滤
if ($kw !== null && $kw !== '') {
$kw = escape_like($kw);
$sql .= " AND `username` LIKE CONCAT('%', :kw, '%') ESCAPE '\\\\'";
$params[':kw'] = $kw;
}
$sql .= " ORDER BY `last_login` DESC, `id` DESC LIMIT 50";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$rows = $stmt->fetchAll();
echo json_encode($rows, JSON_UNESCAPED_UNICODE);
/**
* 转义 LIKE 关键字中的通配符与反斜杠,以配合 ESCAPE '\'
*/
function escape_like(string $s): string {
// 转义顺序很重要:先反斜杠,再百分号与下划线
$s = str_replace('\\', '\\\\', $s);
$s = str_replace('%', '\\%', $s);
$s = str_replace('_', '\\_', $s);
return $s;
}
status, is_verified, role, last_login, id);SELECT
payment_method,
COUNT(*) AS order_count,
SUM(total_amount) AS total_amount
FROM
orders
WHERE
status = 'paid'
AND paid_at BETWEEN :start AND :end
AND merchant_id = :merchant_id
GROUP BY
payment_method
ORDER BY
total_amount DESC,
order_count DESC
LIMIT 10;
查询目的:
字段解释:
条件分析:
PHP集成代码示例
<?php
// 假设使用 PDO 且已正确配置错误模式与字符集
$sql = "
SELECT
payment_method,
COUNT(*) AS order_count,
SUM(total_amount) AS total_amount
FROM
orders
WHERE
status = 'paid'
AND paid_at BETWEEN :start AND :end
AND merchant_id = :merchant_id
GROUP BY
payment_method
ORDER BY
total_amount DESC,
order_count DESC
LIMIT 10;
";
$stmt = $pdo->prepare($sql);
// 推荐使用 UTC 时间并传入符合数据库列类型的格式,例如 'Y-m-d H:i:s'
$params = [
':start' => $startDateTimeUTC, // e.g. '2025-01-01 00:00:00'
':end' => $endDateTimeUTC, // e.g. '2025-01-31 23:59:59'
':merchant_id' => (int)$merchantId // 确保类型正确
];
$stmt->execute($params);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// $rows 形如:[ ['payment_method'=>'alipay','order_count'=>123,'total_amount'=>'4567.89'], ... ]
安全注意事项
性能优化提示
数据库连接配置要求
参数绑定的重要性
错误处理建议