
在 WordPress 中使用 $wpdb 执行自定义查询时,直接将 PHP 变量拼入 SQL 字符串易导致语法错误或 SQL 注入风险;应使用变量插值(双引号内直接写 $var)或字符串连接('...' . $var . '...'),并优先采用 $wpdb->prepare() 防注入。
在 wordpress 中使用 $wpdb 执行自定义查询时,直接将 php 变量拼入 sql 字符串易导致语法错误或 sql 注入风险;应使用变量插值(双引号内直接写 `$var`)或字符串连接(`'...' . $var . '...'`),并优先采用 `$wpdb->prepare()` 防注入。
在 WordPress 开发中,开发者常需通过 $wpdb 执行自定义数据库查询。但如示例所示,当尝试将动态变量(如 get_the_title() 返回的标题)嵌入 SQL 字符串时,极易因字符串拼接错误导致查询失败——典型表现是返回空结果或 PHP 解析错误。
错误写法(问题根源):
$title = get_the_title(); $query = "SELECT * FROM demos_13_amelia_users WHERE `status` = 'visible' AND `type` = 'provider' AND `firstName` = '.$title.'";
该写法混淆了 PHP 字符串语法:在双引号字符串中,'.$title.' 被当作字面量处理,而非变量插值,最终生成非法 SQL(如 ...firstName = '.Perry.'),数据库无法识别。
正确写法一:双引号变量插值(仅限可信、已过滤数据)
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
$title = sanitize_text_field(get_the_title()); // 基础过滤
$query = "SELECT * FROM {$wpdb->prefix}amelia_users
WHERE `status` = 'visible'
AND `type` = 'provider'
AND `firstName` = '$title'";
$employees = $wpdb->get_results($query);
正确写法二:点号连接(更清晰,推荐用于简单场景)
$query = "SELECT * FROM {$wpdb->prefix}amelia_users
WHERE `status` = 'visible'
AND `type` = 'provider'
AND `firstName` = '" . $wpdb->esc_like($title) . "'";
$employees = $wpdb->get_results($query);
✅ 强烈推荐:使用 $wpdb->prepare()(最安全)
它自动转义参数,杜绝 SQL 注入,是 WordPress 官方强制要求的最佳实践:
$title = get_the_title();
$query = $wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}amelia_users
WHERE `status` = %s
AND `type` = %s
AND `firstName` = %s",
'visible',
'provider',
$title
);
$employees = $wpdb->get_results($query);
⚠️ 关键注意事项:
- 永远不要将未经处理的用户输入(如 $_GET、$_POST)直接拼入 SQL;
- 表名建议使用 {$wpdb->prefix}table_name 替代硬编码前缀,确保多站点兼容;
- get_the_title() 在循环中可能返回空值或特殊字符(如单引号),务必配合 sanitize_text_field() 或 $wpdb->esc_like() 预处理;
- 若需模糊匹配(如 LIKE),应结合 $wpdb->esc_like() 与通配符:%s → $wpdb->esc_like($title)。
掌握这三种拼接方式,并始终优先选用 $wpdb->prepare(),可兼顾代码健壮性、可读性与安全性。










