¥
立即购买

PHP数据库查询生成器

6 浏览
1 试用
0 购买
Dec 8, 2025更新

本提示词专为PHP开发者设计,能够根据指定的数据库表结构和查询需求,生成准确、安全的SQL SELECT查询语句。它结合了数据库设计规范和PHP开发最佳实践,确保生成的查询语句既高效又安全,避免SQL注入等常见安全问题。适用于网站开发、数据分析、报表生成等多种PHP开发场景,帮助开发者快速构建数据库查询功能。

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;

语句说明

  • 查询目的:

    • 在指定分类下检索在线且未被软删除的在售商品,并按销量优先、价格次之进行排序,若价格相同则以 id 倒序确保稳定排序,最多返回 20 条。
  • 字段解释:

    • id:商品主键,用于唯一标识并作为稳定排序的最后断点。
    • name:商品名称,用于关键词模糊匹配与结果展示。
    • price:商品价格,用于价格区间过滤与次级排序。
    • stock:库存数量,筛除无库存商品(>0)。
    • sales:销量指标,作为主要排序依据(降序)。
    • category_id:品类标识,限定在指定分类下检索。
  • 条件分析:

    • status = 'active':只取已上架/有效商品。
    • category_id = :category_id:限定在指定分类。
    • price BETWEEN :min_price AND :max_price:限定价格区间(包含边界)。
    • name LIKE CONCAT('%', :kw, '%'):名称模糊匹配,匹配包含关键词的商品名。
    • stock > 0:仅返回有库存的商品。
    • deleted_at IS NULL:软删除保护,排除已删除记录。
    • ORDER BY sales DESC, price ASC, id DESC:销量高的优先;同销量时价格更低的优先;同价时使用 id DESC 稳定排序。
    • LIMIT 20:限制返回记录数,控制接口负载与响应时间。

使用建议

  • PHP集成代码示例(PDO,命名参数与类型安全)
<?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);
  • 安全注意事项

    • 始终使用预处理与命名参数绑定(已示例),不要将变量直接拼接到 SQL 中。
    • 验证与规范化所有输入:category_id 必须为正整数;价格应为数值且满足 min <= max;关键词限长并去除前后空格。
    • 确保数据库与连接使用 utf8mb4 字符集,避免字符集不一致带来的匹配异常与安全隐患。
    • 不要将用户可控内容拼接进入 ORDER BY 或 LIMIT;本例 LIMIT 为常量 20,排序字段为固定列表。
    • 生产环境隐藏详细 SQL 错误信息,对外统一为通用错误消息。
  • 性能优化提示

    • 索引建议(根据实际数据分布与版本微调):
      • 过滤组合索引:CREATE INDEX idx_products_filter ON products (status, category_id, deleted_at, stock, price);
        • 等值条件置前(status, category_id, deleted_at),提升过滤效率;
        • stock、price 为范围条件,放在后面可配合 Index Condition Pushdown(MySQL 5.6+)减少回表。
      • 单列/小组合索引:确保 category_id、status、deleted_at 至少有选择性较好的索引。
    • LIKE 前置通配符会导致无法使用普通前缀索引,若关键词查询是高频场景:
      • 优先考虑 FULLTEXT(name) 并改为 MATCH(name) AGAINST (... IN BOOLEAN MODE);
      • 或采用搜索引擎(如 Elasticsearch)承载复杂检索。
    • 排序优化:当前排序字段与过滤字段混合,且含范围条件,通常会触发 filesort 属正常现象。确保 sort_buffer_size 合理、LIMIT 小(本例 20)即可。
    • 使用 EXPLAIN 检查执行计划,关注 type、rows、filtered、Extra(Using index condition / Using filesort)。
    • 如需分页,优先使用基于上次游标的“keyset pagination”(如基于 sales/price/id 的断点条件)代替 OFFSET,可避免深分页性能劣化。

注意事项

  • 数据库连接配置要求

    • 使用 utf8mb4 字符集与与之匹配的 _ci(不区分大小写)排序规则,确保 LIKE 模糊匹配符合预期。
    • 建议启用严格 SQL 模式(如 STRICT_TRANS_TABLES)防止静默截断或隐式类型转换。
  • 参数绑定的重要性

    • 价格建议按字符串绑定以匹配 DECIMAL 精度;整型字段使用 PDO::PARAM_INT。
    • 严格校验与规范化输入范围,避免逻辑异常(例如 max_price 小于 min_price)。
  • 错误处理建议

    • 使用 PDO 异常模式(ERRMODE_EXCEPTION)并在外层捕获 PDOException,记录日志但不向客户端泄露内部细节。
    • 对外统一返回稳定的错误结构体(如 JSON),便于前端处理。
    • 可对查询设置合理的超时(如 PDO::ATTR_TIMEOUT)并在慢查询日志中监控与优化。

SQL查询语句

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;

语句说明

  • 查询目的:获取已验证且处于激活状态的用户列表,筛选指定角色集合中、最近登录时间不早于 since 的用户;可选按用户名模糊匹配;按登录时间和ID倒序返回最多50条。
  • 字段解释:
    • id:用户主键ID
    • username:用户名
    • email:邮箱
    • last_login:最后登录时间(建议为DATETIME/TIMESTAMP)
    • role:用户角色
  • 条件分析:
    • role IN (...):仅返回属于给定角色集合的用户。使用命名占位符动态展开,确保参数化,防止注入。
    • is_verified = 1:只包含已完成验证的用户。
    • status = 'active':只包含激活状态的用户。
    • last_login >= :since:仅包含最近登录不早于 since 的用户。
    • 可选 username LIKE:当提供关键字时,进行包含式模糊匹配。使用 ESCAPE '' 并对关键字中的通配符进行转义,避免意外匹配扩大。

使用建议

  • PHP集成代码示例(PDO,命名参数绑定,安全地动态构建 IN 占位符与可选关键字):
<?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;
}
  • 安全注意事项:
    • 严格使用命名参数绑定,不拼接用户输入到SQL字符串中。
    • 角色集合 roles 应来自系统内的白名单(例如 ['admin','editor','viewer']),拒绝未知角色值。
    • 对 LIKE 搜索关键字进行通配符转义,并使用 ESCAPE 子句,防止“模式注入”导致范围扩大。
    • 设置 PDO::ATTR_EMULATE_PREPARES=false,确保真正的服务器端预处理(MySQL 8+)。
    • 使用 utf8mb4 字符集,避免字符截断和编码问题。
  • 性能优化提示:
    • 为过滤与排序设计联合索引(示例,按本查询模式与排序方向):
      • CREATE INDEX idx_users_status_verified_role_lastlogin_id ON users (status, is_verified, role, last_login, id);
      • 该索引有利于等值条件(status, is_verified, role)与范围/排序(last_login, id)的组合。
    • 对包含式模糊匹配 '%kw%',普通B-Tree索引难以利用。数据量大且搜索频繁时,考虑:
      • 建立 FULLTEXT(username) 并使用 MATCH ... AGAINST 进行全文搜索(MySQL 8.0+,适合英文或分词友好的语言)。
      • 或外部检索服务(如 Elasticsearch)。
    • 确保 last_login 列上没有函数操作(例如不对列做函数包裹),保留索引可用性。
    • 使用 EXPLAIN 检查执行计划,确认使用了预期索引;必要时增加 ANALYZE FORMAT=JSON 获取更详细诊断。

注意事项

  • 数据库连接配置要求:
    • DSN 应包含 charset=utf8mb4;服务器端建议设置 collation 至 utf8mb4_0900_ai_ci(MySQL 8.0)以获得一致排序/比较行为。
    • 建议统一应用与数据库使用 UTC 时间,避免时区差异影响 last_login 比较。
  • 参数绑定的重要性:
    • IN 子句必须动态展开为多个命名占位符(:role_0, :role_1, ...),MySQL/PDO 不支持直接绑定数组至单一 :roles 占位符。
    • 确保 roles 非空;为空时应短路返回或改为 WHERE 1=0,避免生成非法 SQL。
    • :since 建议传入“YYYY-MM-DD HH:MM:SS”格式字符串(与列类型一致)。
  • 错误处理建议:
    • 启用 PDO::ERRMODE_EXCEPTION 并使用 try/catch 捕获异常;对外返回通用错误信息,详细错误写入安全日志。
    • 对查询结果进行大小限制(本查询 LIMIT 50),防止一次性拉取过多数据。
    • 在高并发场景下,监控慢查询日志,适时调整索引或增加覆盖字段。

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;

语句说明

  • 查询目的:

    • 统计指定商户在给定时间范围内已付款订单,按支付方式汇总订单数量与成交总额,并按成交总额与订单数降序取前10个支付方式。
  • 字段解释:

    • payment_method:支付方式标识(如 wechat, alipay, credit_card 等),用于分组。
    • order_count:该支付方式下的已付款订单数量。
    • total_amount:该支付方式下的已付款订单总金额之和。
  • 条件分析:

    • status = 'paid':仅统计已付款订单,避免包含未支付/已取消等状态。
    • paid_at BETWEEN :start AND :end:限制统计时间范围(包含边界)。如需“左闭右开”区间可改为 paid_at >= :start AND paid_at < :end。
    • merchant_id = :merchant_id:限定商户范围。
    • GROUP BY payment_method:按支付方式聚合。
    • ORDER BY total_amount DESC, order_count DESC:先按总金额降序,再按订单数降序进行排序。
    • LIMIT 10:仅返回前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'], ... ]
    
  • 安全注意事项

    • 使用 PDO 预处理+命名参数绑定,严禁字符串拼接参数,防止SQL注入。
    • 校验并规范化输入:
      • merchant_id 应为整数且通过白名单/类型转换处理。
      • :start 与 :end 应为合法的日期时间字符串;建议统一为 UTC。
    • 不要将 LIMIT 的值作为用户可控参数直接拼接;本查询中 LIMIT 为固定字面量 10。
  • 性能优化提示

    • 索引建议(根据查询模式与数据分布调整):
      • 复合索引:(merchant_id, status, paid_at, payment_method)
        • 前缀 (merchant_id, status, paid_at) 高选择性过滤时间窗口内的目标商户与已付款订单;
        • 追加 payment_method 有助于分组阶段的扫描有序性,减少额外排序代价。
      • 如果 total_amount 为常用聚合字段且读多写少,可考虑将 total_amount 置于上述索引的末尾,使其尽可能成为覆盖索引:(merchant_id, status, paid_at, payment_method, total_amount)。注意索引体积权衡。
    • 时间区间过滤:
      • 若统计按日/按月,优先采用左闭右开区间:paid_at >= :start AND paid_at < :end,避免“整日末秒”的边界问题,并利于使用范围条件。
    • 执行计划验证:
      • 使用 EXPLAIN 查看是否命中合适的复合索引、避免全表扫描与大范围回表。
    • 大数据量优化思路:
      • 对 orders 按时间或 merchant_id 进行分区可减少扫描范围(需评估写入与维护成本)。
      • 高频统计可考虑物化汇总表(按日/按支付方式聚合),定时增量维护以加速查询。

注意事项

  • 数据库连接配置要求

    • 使用 utf8mb4 编码。
    • 设置合适的时区策略:建议数据库存 UTC,应用层负责时区转换;或在 SQL 中使用 CONVERT_TZ 明确转换(会影响索引利用,谨慎使用)。
    • 开启 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION,便于错误捕获。
  • 参数绑定的重要性

    • 始终使用命名参数绑定 (:start, :end, :merchant_id),避免字符串拼接。
    • 确保绑定的类型与列类型一致:merchant_id 为整数;时间为 DATETIME/TIMESTAMP 格式字符串。
  • 错误处理建议

    • 对时间范围做基本校验(:start <= :end),并在无结果时返回空数组而非报错。
    • 记录慢查询日志(slow query log),针对超时或扫描行数过多的情况进行索引或查询改写优化。
    • 在只读统计场景可使用从库分担查询压力,但注意主从延迟对实时性的影响。

示例详情

解决的问题

  • 将“表名+查询需求+排序+数量限制”快速转化为可直接使用的安全高效查询语句与清晰说明,减少反复试错和沟通成本
  • 覆盖电商商品、用户账户、订单统计、CMS 内容、运营报表等高频场景,帮助个人与团队在紧凑迭代中稳定交付
  • 内置安全与性能守护:默认规避风险写法、强调参数绑定与索引思路,降低线上隐患
  • 输出结构统一(查询语句+语义说明+使用建议+注意事项),便于复制粘贴、代码评审、知识沉淀
  • 用更少的输入获得更标准的结果,显著提升开发效率与交付质量,促进团队规范化与新人快速上手

适用用户

PHP初级开发者

基于简短业务描述一键生成可用查询,按提示完成参数绑定与分页,快速交付用户列表、商品搜索、订单明细等页面。

资深PHP工程师与技术负责人

用作团队SQL规范化工具,统一字段选择、排序与安全策略,节省代码评审时间,并可批量复用到多模块。

数据报表开发者(PHP驱动)

快速产出统计类查询(按日销量、活跃用户、转化漏斗),附带优化与使用建议,稳定支撑导出与大页报表。

特征总结

按业务描述自动生成SELECT查询,字段筛选、联表、排序分页一并给出,可直接粘贴使用。
自动给出参数绑定示例与注意点,防止拼接错误与注入风险,降低线上事故概率。
结合表结构与索引情况给出优化建议,帮助大数据量查询稳定响应,减少不必要扫描。
每条语句都配套目的说明与字段释义,让团队成员快速对齐意图,减少沟通与调试时间。
支持按客户需求设置排序与分页,统一返回格式与限制,一次修改即可覆盖多处调用。
内置常见场景模板:用户检索、商品筛选、订单统计、内容查询,开箱即用快速搭建页面与报表。
生成结果遵循安全规范与语法校验,避免过时写法,减少上线后因语句问题导致的回滚。
提供可复制的PHP集成示例与错误处理建议,新人也能照着接入,老手可快速统一团队风格。
从需求到SQL一步到位,减少往返沟通与手写出错,让你把更多时间投入到业务逻辑与体验。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 635 tokens
- 4 个可调节参数
{ 表名称 } { 查询需求描述 } { 排序要求 } { 记录数量限制 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59