【问题标题】:Yii CDBCommand getText to show all variables in the SQLYii CDBCommand getText 显示 SQL 中的所有变量
【发布时间】:2012-02-10 10:53:41
【问题描述】:

我正在使用 Yii 的 Yii::app()->db->createCommand() 来构建 SQL 查询。为了查看 Yii 生成的 SQL 代码,我使用了 CDBCommand 的 getText() 方法。问题是,当我在包含参数的 SQL 代码上使用 getText() 方法时,例如:

Yii::app()->db->createCommand()
           ->select("name")
           ->from('package')
           ->where('id=:id', array(':id'=>5))
           ->queryRow();

getText() 方法返回以下 SQL:

select name from package where id=:id

代替:

select name from package where id=5

这对于简单的查询很好,但对于具有大量参数的更复杂的查询,将每个参数复制/粘贴到 SQL 代码中进行测试是相当痛苦的。

有什么方法可以直接在 SQL 中使用 getText() 或 Yii 中的其他方法显示参数?

干杯!

【问题讨论】:

    标签: php yii


    【解决方案1】:
    $sql = Yii::app()->db->createCommand()
      ->select("name")
      ->from('package')
      ->where('id=:id', array(':id'=>5))
      ->queryRow();
    
    $query=str_replace(
       array_keys($sql->params),
       array_values($sql->params),
       $sql->getText()
    );
    

    【讨论】:

      【解决方案2】:

      您可以使用 CDbConnetion::enableParamLogging 属性。例如,在 config/main.php 中:

      'db' => array (
              'enableParamLogging' => true,
      

      并且显示和记录的错误将包含绑定值。

      【讨论】:

        【解决方案3】:

        你为什么不试试下面的方法。我不是专家,如果它不适合你的问题,我只是发帖,请原谅我......

                       $connection=Yii::app()->db;
                    $id=5; // you can able to change by "GET" or "POST" methods
            $sql="SELECT name FROM package WHERE id = :id ";
            $command = $connection->createCommand($sql);
            $command->bindParam(":id",$id,PDO::PARAM_STR);
            $dataReader=$command->query();          
            $rows=$dataReader->readAll();
            $namevalue=array();
            foreach($rows as $max)
            {
            $namevalue = $max['name'];
            }   
            echo $namevalue; // which is the value u need
        

        谢谢...

        【讨论】:

          【解决方案4】:

          看起来你正在关注 Yii 正在准备的 PDOStatement:

          $cmd = Yii::app()->createCommand();
          
          $cmd->select("name")
                 ->from('package')
                 ->where('id=:id', array(':id'=>5))
                 ->queryRow();
          
          // returns a PDO Statement - http://php.net/manual/en/class.pdostatement.php
          Yii::log($cmd->getPdoStatement()->queryString);
          

          这对你有用吗?似乎应该(代码未经测试)。

          【讨论】:

          • 不,这返回了相同的语句,例如“从 id=:id 的包中选择名称”,请参阅本文了解真正的解决方法daveyshafik.com/archives/…。不是 Yii 中的 PDO,但也可以申请到 yii
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 2018-04-10
          • 1970-01-01
          • 2018-05-07
          相关资源
          最近更新 更多