我有一个系统性的问题,我没有时间或预算来修复,我希望有一个我可以部署的mysql hack,这将拯救我的小世界免于即将到来的厄运。
我现在管理的系统的创建者没有意识到数据库名称可能包含字母,数字和下划线以外的字符。因此,查询看起来像这样。
SELECT * FROM {$db}.settings
如果数据库名称包含非标准的内容...就像破折号一样。世界终结,所有疑问都破裂了。
db前缀是存在的,因为这个系统现在使用但不能运行多站点功能。
你会认为我可以用..来解决这个问题。
$db = "`{$db}`";
如果只是..你看到它结果是一堆javascript功能发送此数据库名称以跟踪要更新的站点。通过添加这些引号,您可以打破所有这些,而不是获取databasename
,而是获得
`databasename`
所以......为什么我不把数据库名称设置为兼容的东西..这个系统发送到我无法控制数据库名称的外部服务器......
痛苦......
是否有办法在初步查询中对数据库名称进行别名,这将影响所有后续查询。基本上设定一个常数?
这样的东西将适用于所有后续查询。类似的东西:
set `$db` AS database
我可以将$ db变量设置为数据库,它应该运行..如果可能的话?
答案 0 :(得分:0)
如果你总是在一个数据库上运行(连接到数据库后$ db没有改变),那么就在连接问题之后
USE `$db`;
并从所有查询中删除{$db}.
前缀。 USE
查询为当前连接中的将来查询设置活动(默认)数据库。
你没有说出你正在使用的编程语言,所以我将假设PHP。通常,您可以在建立连接时设置默认数据库(mysqli_connect()
, $dbname
parameter)。此外,您可以在连接后调用mysqli_select_db()
之类的功能。
答案 1 :(得分:0)
我会使用以下内容修复查询:
sed -e "s/{\$db}/\`{\$db}\`/g" -i * */* */*/* */*/*/*
有一个很大的警告来测试这个,因为这可能会搞得很多。特别要检查sed
的{{1}}选项是否需要后缀。