在 Kohana 3 中,我可以像这样在查询中绑定参数
$query = 'SELECT name FROM users WHERE id = :id';
这很简洁,但有时我希望其他东西可以配置,比如表名。当我使用命名参数作为表名时,它会失败。在这种情况下,我一直在构建字符串。
我的问题是,在进行这种字符串构建时,如何避免潜在的坏字符?在 Kohana 2.x 中,您可以这样做,$this->db->escape()
但由于 Kohana 3 完全不同,我想有一种新方法吗?
只是为了添加 Mark Byers 的答案,表名的参数化失败的原因是参数被转义为values,而表名是identifier。可能发生的情况是表名被包裹在引号中,而它应该被包裹在反引号中。
然而,正如 Mark 所说,需要转义表名表明设计不佳。它们应该被硬编码或存储在某个配置文件中,其内容可以相信不需要转义。试图覆盖你所有的基础,以至于你不相信你自己的配置很可能是浪费时间。
我从未使用过 kohana,如果此评论完全无关紧要,我深表歉意,但我对您正在尝试做的事情有一些评论:
当我使用命名参数作为表名时,它会失败。
我认为这是因为它依赖于底层数据库的参数机制,而且我不知道有任何数据库允许您在查询中将表名作为参数提供。所以是的,很可能你必须自己构建一个字符串。
在进行这种字符串构建时,如何逃避潜在的坏字符?
这个问题似乎很奇怪......要么你的某些表名中有潜在的坏字符......如果是这样,为什么?否则您从不受信任的来源(用户?)接收表名。这对我来说听起来是个坏主意。如果他们试图从他们不应该访问的表中读取怎么办?有一个明确定义的允许表名列表并检查该表是否存在于该列表中,而不是转义潜在的错误表名,这不是更好吗?
我有一个最后的观察:如果您能够在查询中更改表名并且它仍然有效,这可能表明您的数据库未正确规范化。也许您可以组合您的表并添加一个包含有关分组信息的额外列,并使用 WHERE 子句来选择您想要的数据?我需要更多地了解您的模型以提出更具体的建议。
我不确定这是否有助于回答您的问题,但这些是我阅读您的问题时的想法。我希望你可以使用一些。