首页 > 解决方案 > 从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?

问题描述

我正在开发一个 PHP 工具来执行一些数据库操作。我现在面临一个问题。如果表名包含特殊字符,我将无法进行正确的查询,我知道这是一种罕见的情况。

例如请看下面的查询

INSERT INTO `@#$%."'"12-}.+/_*-ttr*` (`id`, `obj`, `value`) 
        VALUES (NULL, 'hi', 'ttt');

我想为 PHP 变量分配一个表名并且$table_name我想执行这个查询。

$query= "insert in to `{$table_name}` " (`id`, `obj`, `value`) 
                VALUES (NULL, 'hi', 'ttt')

如何正确地将表名分配给 $table_name ?由于表名中的特殊字符,我收到错误。

请注意,我给出的表名非常少见,但我想让我的代码适用于所有情况。

这个问题的版权归Abilash Erikson来自他的变形问题。我打开了一个新问题,以保留我在元评论中的答案

标签: phpmysqlsql

解决方案


根据文档,您可以在使用的刻度内使用几乎任何字符。

标识符在内部转换为 Unicode。它们可能包含以下字符:

  • 不带引号的标识符中允许的字符: ASCII:[0-9,az,AZ$_](基本拉丁字母,数字 0-9,美元,下划线) 扩展:U+0080 .. U+FFFF

  • 带引号的标识符中允许的字符包括完整的 Unicode 基本多语言平面 (BMP),但 U+0000 除外: ASCII:U+0001 .. U+007F 扩展:U+0080 .. U+FFFF

要将表名放入查询中,您可以像这样进行字符串连接:

$query = "insert into `" . $table_name . "` (`id`, `obj`, `value`) VALUES (NULL, 'hi', 'ttt');";

注意:这是非常危险的,因为如果可以从用户(管理面板,...)控制表名,它会打开 SQL 注入的攻击面

为了防止这种情况,只需从表名中转义所有刻度 `(因为允许并封装所有其他字符)

$table_name = str_replace("`","``", $table_name);
$query = "insert into `" . $table_name . "` (`id`, `obj`, `value`) VALUES (NULL, 'hi', 'ttt');";

小提琴可以在这里看到


推荐阅读