php – 使用Codeigniter安全地转义MySQL中的动态表名
我面临一个小问题.我正在研究一个需要在
MySQL中使用动态表名的应用程序.
基本上,我有一个基于多种因素(流派,播放时长,发布日期等)从数据库中选择专辑的过程 – 这个过程的一部分允许用户创建一堆自定义过滤器. 自定义过滤器会向该选择条件中的所有相册的用户返回一个计数.然后将这些专辑的ID存储在一个带有随机生成的哈希/序列号的表中(例如albumSelect_20880f9c05d68a) 我是这样做的,因为我不想在一个字段中存储一个巨大的逗号分隔列表(真的很傻) – 我并不想在我的HTML中向一个隐藏字段发送一个值数组,因为这会增加数据吞吐量(一次可能有数千行) 在CodeIgniter中,我使用Query Bindings来生成我的SQL查询,如下所示: select * from artists where artistName = ? AND albumTitle = ? 然后,当我参数化查询时,查询会自动转义 $query = $this->db->query($sql,array("Singer","Album")); 现在是棘手的部分 如果我写我的查询看起来像这样: $sql = "select albumid from albums where albumid in (select albumid from albumSelect_?)"; $this->db->query($sql,array('20880f9c05d68a')); 生成的查询变为: select `albumid` from `albums` where `albumid` in (select `albumid` from `albumSelect_'20880f9c05d68a'`) 而且非常正确,但显然查询无效. 编辑:更多信息 查询可以是更大查询的一部分,具体取决于用户选择的条件.例如 $sql = "select albumid from albums where albumid in(select albumid from tags where tag = ?) AND albumid in(select albumid from albumSelect_?)"; 我只是想知道是否有办法让这个工作,或者如果有人可以建议一个更好的选择..表名的连接显然不是一个选项. 提前致谢! 戴夫
转义机制仅适用于数据字符串,不适用于模式名称.换句话说,仅用于表的内容,而不是用于其结构.因此,您必须自己将字符串粘贴到查询中,或者避免以这种方式使用表.的?查询模板将无法帮助您.
如果将字符串粘贴到表名中,则可以使用通常的PHP字符串连接机制.您应该确保根据适当严格的正则表达式检查字符串,以避免SQL注入.确保您实际上只粘贴了您生成的格式的单个随机字符串,而不是其他任何内容. 作为替代方案,您可以拥有一个包含所有选择的大表,并使用其他列来保存您的标识哈希,或使用其他一些合适的键来标识单个选择.这样,您就不必在正常操作期间修改数据库模式.我相信大多数开发人员,包括我,宁愿避免程序代码的这种修改.良好的数据库设计适用于固定架构. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |