【问题标题】:Yii: CDbCriteria doesn't replace placeholder with provided valueYii:CDbCriteria 不会用提供的值替换占位符
【发布时间】:2013-07-30 16:40:07
【问题描述】:

我有以下代码:

$criteria=new CDbCriteria;
$criteria->condition = ' action_id 
IN(SELECT action_id FROM action_type WHERE action_name = \'EnableGame\') ';
$criteria->compare('task_id','= '.$taskData->task_id, false, 'AND');
$criteria->compare('value', '= '.$gameData->game_id, false, 'AND');
$enablingActions = TaskActions::model()->findAll($criteria); 

compare 方法中,task_idvalue 不会与提供的值进行比较,但不会在函数中传递。以下是 Yii 如何将上面的代码转换为 SQL 查询:

Querying SQL: SELECT * FROM "task_actions" "t" 
WHERE 
  (( 
    action_id IN(SELECT action_id FROM action_type WHERE action_name = 'EnableGame'
  ) ) 
AND (task_id=:ycp0)) 
AND (value=:ycp1)

为什么我看到占位符 :ycp0ycp1 而不是我设置的值?谢谢!

【问题讨论】:

    标签: php sql yii


    【解决方案1】:

    因为占位符被数据库引擎替换为实际值,甚至 Yii 本身根本看不到查询的“最终”形式。

    但是,有一个选项可以与查询并排记录参数值:将连接的 enableParamLogging 属性设置为 true,这些值将作为同一消息的一部分记录(它继续“与...绑定”)。

    【讨论】:

    • 谢谢@Jon。让我再问你一个想法。我想用$criteria->compare('task_id',':task_id', false, 'AND'); $criteria->params=array(':task_id', $taskData->task_id); 之类的东西替换$criteria->compare('task_id','= '.$taskData->task_id, false, 'AND');,正如你猜想的那样,它在我的情况下不起作用。日志显示:无效参数编号:未定义参数。执行的 SQL 语句是:SELECT * FROM "task_actions" "t" WHERE (( action_id IN(SELECT action_id FROM action_type WHERE action_name = 'EnableGame') ) AND (task_id=:ycp0)) AND (value=:ycp1)。
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2013-01-24
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多