在 Kohana 3 中,您现在可以在查询中绑定命名参数,但如何转义无法绑定的参数?
在 Kohana 3 中,我可以像这样在查询中绑定参数,
$query = 'SELECT name FROM users WHERE id = :id';
这很简洁,但有时我希望其他内容是可配置的,例如表名称。当我使用命名参数作为表名时,它会失败。我刚刚在这种情况下构建了字符串。
我的问题是,在进行这种字符串构建时如何转义潜在的坏字符?在 Kohana 2.x 中,您可以执行 $this->db->escape()
但由于 Kohana 3 完全不同,我想有一种新方法吗?
In Kohana 3, I can bind a param in a query like so
$query = 'SELECT name FROM users WHERE id = :id';
This is neat, but sometimes I want other things to be configurable, like the table name. When I use a named param for table name, it fails. I have just been building the string in these circumstances.
My question is, how can I escape potentially bad characters when doing this kind of string building? In Kohana 2.x, you could do $this->db->escape()
but since Kohana 3 is radically different, I'd imagine there is a new way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
我从来没有使用过 kohana,所以如果这个评论完全不相关,我很抱歉,但我对你想要做的事情有一些评论:
当我使用命名参数作为表名时,它会失败。
我认为这是因为它依赖于底层数据库的参数机制,并且我不知道有任何数据库允许您在查询中提供表名作为参数。所以是的,很可能你必须自己构建一个字符串。
在进行这种字符串构建时,如何转义潜在的坏字符?
这个问题看起来很奇怪......要么你的一些表名中有潜在的坏字符......如果是这样,为什么?否则您将从不受信任的来源(用户?)接收表名称。这对我来说听起来是个坏主意。如果他们尝试从他们不应该访问的表中读取数据怎么办?拥有一个明确定义的允许表名列表并检查该表是否存在于该列表中,而不是转义潜在的错误表名,不是更好吗?
我有一个最后的观察:如果您能够更改查询中的表名称并且它仍然有效,这可能表明您的数据库未正确规范化。也许您可以合并表并添加一个包含分组信息的额外列,然后使用 WHERE 子句选择所需的数据?我需要更多地了解你的模型才能提出更具体的建议。
我不确定这是否有助于回答您的问题,但这些是我阅读您的问题时的想法。我希望你能使用其中的一些。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
只是为了补充 Mark Byers 的答案,表名参数化失败的原因是参数被转义为值,而表名是标识符。可能发生的情况是表名被引号括起来,而它应该被反引号括起来。
然而,正如马克所说,需要转义表名表明设计不好。它们应该被硬编码或存储在某个配置文件中,该配置文件的内容可以被信任,无论如何都不需要转义。试图覆盖所有基础以至于您不信任自己的配置很可能是浪费时间。
Just to add to Mark Byers's answer, the reason that the parametrization of the table name is failing is that parameters are escaped as values, while a table name is an identifier. What's probably happening is that the table name is being wrapped in quotes, while it should be being wrapped in backticks instead.
However, as Mark says, a need to escape table names suggests bad design. They should either be hard coded or stored in some configuration file whose contents can be trusted not to need escaping anyway. Trying to cover all of your bases to such an extent that you don't trust your own configuration is most likely a waste of time.