php - 从 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来自他的变形问题。我打开了一个新问题,以保留我在元评论中的答案
解决方案
根据文档,您可以在使用的刻度内使用几乎任何字符。
标识符在内部转换为 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');";
小提琴可以在这里看到
推荐阅读
- python - 在 2 个不同的列中滚动平均值并在 Python 中创建一列
- c++ - 龙格库塔和 PGPLOT
- alsa - 如何在 ALSA 中设置周期大小,重访
- python - 如何在 Python 中为 LinearNDInterpolator 使用 Qhull 选项?
- python - Python 随机午餐生成器打印餐厅类型
- spring-boot - 如何验证使用 Jackson 多态反序列化反序列化的对象
- r - 基于长格式组计算中位数
- react-native - 如何在聊天应用程序中显示发件人的用户名?
- ssl - Javamail如何连接到IMAPs邮件服务器,没有证书验证
- c - 为什么没有打印字符串?C