基于查询字符串从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
相关产品推荐
相关产品推荐

