我在Doctrine中使用了这个DQL
$q->update('product')
->set('quantity','?')
->where('id=?');
$q->execute(array(20,5));
我检查服务器是否有查询,这是生成的sql
UPDATE product SET quantity = '20', updated_at = '5'
WHERE (id = '2010-04-26 14:34);
所以我需要知道为什么参数不在正确的位置?
答案 0 :(得分:0)
我找到的唯一解决方案是在构建查询时提供参数,而不是在execute的数组参数中提供参数,并且Doctrine不会混淆。像这样:
$q->update('product')
->set('quantity', 20)
->where('id = ?', 5);
$q->execute();
但是,如果您需要使用不同的值多次运行相同的查询,那么您将失去单独准备和放大的性能优势。执行阶段。看来这是唯一的解决方案。
没有性能损失的潜在更好的解决方案: 我还没有验证这一点,但是,如果您使用命名参数而不是匿名参数,我希望错误不会出现?占位符。 Doctrine对命名参数的支持在此处描述:http://www.doctrine-project.org/documentation/manual/1_2/en/dql-doctrine-query-language
编辑:我已经尝试了使用命名参数的替代方法,遗憾的是错误仍然存在。 Doctrine提供了一个错误,指出您不能在同一查询中混合使用命名和匿名参数。这真的应该在很久以前修好了IMO。