You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于查询字符串从wp_invites表取数据时遇SQL语法错误

问题分析与修复

核心错误原因

你的SQL语法错误根源是用单引号包裹了表名和列名。在MySQL/MariaDB中,单引号仅用于包裹字符串值,表名、列名这类标识符需要用反引号()包裹(或在无特殊字符/关键字冲突时省略)。你当前写法把wp_invites和reference`当成了字符串常量,数据库无法识别为表和列,因此抛出语法错误。

额外风险:SQL注入

直接将$_GET['ref']拼接到SQL语句中存在严重SQL注入风险,恶意用户可构造特殊参数篡改查询逻辑甚至破坏数据库,必须用WordPress提供的$wpdb->prepare()方法安全绑定参数。

优化后的代码

<?php
function get_reference(){
    // 先检查ref参数是否存在,避免Undefined index警告
    if (!isset($_GET['ref'])) {
        return '';
    }
    // 清洗输入并转换为字符串
    return strval(sanitize_text_field($_GET['ref']));
}

global $wpdb;

$get_reference = get_reference();

// 仅当ref参数不为空时执行查询
if (!empty($get_reference)) {
    // 使用$wpdb->prepare安全生成SQL语句
    $query = $wpdb->prepare(
        "SELECT * FROM `wp_invites` WHERE `reference` = %s",
        $get_reference
    );
    $result = $wpdb->get_results($query);

    foreach ($result as $row){
        $lead_name = esc_html($row->lead_name); // 输出前转义,防止XSS
        echo '<p>'. $lead_name . '</p>';
    }
}
?>

关键改动说明

  • 将SQL中的单引号'替换为反引号`,修正表名和列名的标识符语法;
  • 使用$wpdb->prepare()绑定参数,%s表示字符串类型参数,自动处理转义,杜绝SQL注入;
  • 增加isset($_GET['ref'])检查,避免未传ref参数时出现PHP警告;
  • 用sanitize_text_field()清洗输入、esc_html()转义输出,防止XSS攻击;
  • 仅当$get_reference不为空时执行查询,避免无效查询。

内容的提问来源于stack exchange,提问作者Freddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:20:46