PDO::ATTR_EMULATE_PREPARES(多重绑定和限制)
Posted
技术标签:
【中文标题】PDO::ATTR_EMULATE_PREPARES(多重绑定和限制)【英文标题】:PDO::ATTR_EMULATE_PREPARES (multiple bind & limit) 【发布时间】:2016-02-24 09:39:33 【问题描述】:我刚刚遇到了一个有趣的问题。我需要在参数数组中指定一个变量,但为 SQL 查询中的每一次出现绑定它,我使用此属性实现了这一点:$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
。但是当我使用它时,另一个带有 LIMIT 的查询不起作用,因为我需要指定 $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
才能使其正常工作(因此 PDO 将其作为 INT 处理,而不是 STRING)。我还尝试将 bindValue 函数与 PDO::PARAM_INT 结合使用,但它仍然不能将 LIMIT 值作为 INT 处理。
【问题讨论】:
请展示您想要实现的目标的示例。绝对不需要在不同的仿真设置之间切换,仿真应该始终关闭,除非绝对不可避免。这只是意味着您需要以一种无需仿真/任何一种形式都可以工作的方式来制定您的查询。你只是遇到了一个边缘情况,而没有看到究竟是什么,很难帮助你。 【参考方案1】:但是当我使用它时,另一个带有 LIMIT 的查询不起作用
您可以即时更改仿真模式,在需要时打开和关闭。
我也尝试将 bindValue 函数与 PDO::PARAM_INT 结合使用,但它仍然不能将 LIMIT 值作为 INT 处理。
确保您确实将值明确转换为 int,如 PDO doesn't cast them for PDO::PARAM_INT。
【讨论】:
【参考方案2】:array (size=5)
':audit_id' => string '1' (length=1)
':audit_id1' => string '1' (length=1)
':audit_id2' => string '1' (length=1)
':audit_id3' => string '1' (length=1)
':audit_id4' => string '1' (length=1)
db_query:
SELECT TYP,OSOBA,o.JMENO FROM ( (SELECT 'd.auditor_prihlasen' AS TYP, prihlasena_osoba_id AS osoba FROM dotaznik d WHERE audit_id = :audit_id AND prihlasena_osoba_id > 0) UNION (SELECT 'd.auditor_vyroba' AS TYP, auditor_vyroba_id AS osoba FROM dotaznik d WHERE audit_id = :audit_id1 AND auditor_vyroba_id > 0) UNION (SELECT 'd.auditor_kvalita' AS TYP, auditor_kvalita_id AS osoba FROM dotaznik d WHERE audit_id = :audit_id2 AND auditor_kvalita_id > 0) UNION (SELECT 'od.odpovedna_osoba' AS TYP, odpovedna_osoba_id AS osoba FROM odpoved od WHERE tema_id IN(SELECT id FROM tema WHERE audit_id = :audit_id3)) UNION (SELECT 'od.odpovedna_osoba' AS TYP, odpovedna_osoba_id_puvodni AS osoba FROM odpoved od WHERE tema_id IN(SELECT id FROM tema WHERE audit_id = :audit_id4) AND odpovedna_osoba_id_puvodni > 0) ) tbls, osoba o WHERE o.id = osoba GROUP BY typ, osoba, jmeno
我希望在没有 audit_id1、audit_id2 等的情况下运行查询。所以它们都只使用一个变量 audit_id
【讨论】:
请用新信息更新您的问题,不要将其作为答案发布。以上是关于PDO::ATTR_EMULATE_PREPARES(多重绑定和限制)的主要内容,如果未能解决你的问题,请参考以下文章