我面临一个小问题.我正在研究一个需要在
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_?)";
我只是想知道是否有办法让这个工作,或者如果有人可以建议一个更好的选择..表名的连接显然不是一个选项.
提前致谢!
戴夫
转义机制仅适用于数据字符串,不适用于模式名称.换句话说,仅用于表的内容,而不是用于其结构.因此,您必须自己将字符串粘贴到查询中,或者避免以这种方式使用表.的?查询模板将无法帮助您.
原文链接:https://www.f2er.com/php/137239.html如果将字符串粘贴到表名中,则可以使用通常的PHP字符串连接机制.您应该确保根据适当严格的正则表达式检查字符串,以避免sql注入.确保您实际上只粘贴了您生成的格式的单个随机字符串,而不是其他任何内容.
作为替代方案,您可以拥有一个包含所有选择的大表,并使用其他列来保存您的标识哈希,或使用其他一些合适的键来标识单个选择.这样,您就不必在正常操作期间修改数据库模式.我相信大多数开发人员,包括我,宁愿避免程序代码的这种修改.良好的数据库设计适用于固定架构.