gpt4 book ai didi

php - 反引号 MySQL 实体

转载 作者:行者123 更新时间:2023-11-30 23:59:50 25 4
gpt4 key购买 nike

我有以下方法可以保护 MySQL 实体:

public function Tick($string)
{
$string = explode('.', str_replace('`', '', $string));

foreach ($string as $key => $value)
{
if ($value != '*')
{
$string[$key] = '`' . trim($value) . '`';
}
}

return implode('.', $string);
}

这对我的使用来说效果很好。

它保护数据库、表、字段名甚至 * 运算符,但是现在我还希望它保护函数调用,即:

AVG(database.employees.salary)

应该变成:

AVG(`database`.`employees`.`salary`) and not `AVG(database`.`employees`.`salary)`

我该怎么办?我应该使用正则表达式吗?

另外,我怎样才能支持更高级的东西,来自:

MAX(AVG(database.table.field1), MAX(database.table.field2))

收件人:

MAX(AVG(`database`.`table`.`field1`), MAX(`database`.`table`.`field2`))

请记住,我想让这个方法尽可能简单/快速,因为它几乎遍历了我数据库中的所有实体名称。

最佳答案

如果这是引用 SQL 语句的一部分,并且它们只有您描述的复杂性,那么 RegEx 是一种很好的方法。另一方面,如果您需要对完整的 SQL 语句或更复杂的语句组件(例如“MAX(AVG(val),MAX(val2))”)执行此操作,则需要标记化或解析字符串并对其有更深入的理解,以便准确地进行引用。

鉴于正则表达式方法,您可能会发现更容易将函数名称分解为一个步骤,然后使用您当前的代码来引用数据库/表/列名称。这可以在一个 RE 中完成,但要做到正确会比较困难。

无论哪种方式,我都强烈建议编写一些单元测试用例。事实上,这是这种方法的理想情况:编写测试很容易,您有一些可用的现有案例(您不想破坏),并且您只需再添加一个案例。

您的测试可以像这样简单地开始:

assert '`ticked`' == Tick('ticked');
assert '`table`.`ticked`' == Tick('table.ticked');
assert 'db`.`table`.`ticked`' == Tick('db.table.ticked');

然后添加:

assert 'FN(`ticked`)' == Tick('FN(ticked)');
etc.

关于php - 反引号 MySQL 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com