我正面临一个小问题。我正在开发一个应用程序,需要在MySQL中使用动态表名。使用Codeigniter安全地转义MySQL中的动态表名称
基本上,我有一个基于多种因素(风格,播放长度,发布日期等)从数据库中选择专辑的过程 - 这个过程中有一部分允许用户创建一堆自定义过滤器。
自定义过滤器会向该选择条件中的所有相册的用户返回一个计数。这些相册的ID然后存储在随机生成的散列/序列号表(例如albumSelect_20880f9c05d68a)
我这样做是因为我不想在字段中存储巨大的逗号分隔列表(真的愚蠢) - 我不喜欢发送一个值的数组到一个隐藏的领域,因为这只会增加数据吞吐量(可能一次成千上万的行)
在CodeIgniter中,我使用查询绑定来生成我的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_?)";
我只是想知道如果有办法得到这个工作,或者如果任何人都可以提出一个更好的选择..表名的级联显然是不的选择。
在此先感谢!
戴夫
如果您规范化了数据,则不需要执行此操作*或*存储逗号分隔的相册列表。这被称为“有许多通过”的关系。 – Xeoncross 2012-07-18 20:07:58