【问题标题】:Yii sql query bindings, with params, do not work properlyYii sql 查询绑定,带参数,不能正常工作
【发布时间】:2012-08-12 15:33:31
【问题描述】:

我是 Yii 的新手,一切看起来都不错,但问题是,当我使用绑定参数时,例如 (DAO stile):

$command = $this->conn->createCommand($sql);

$command->bindColumn("title", "test_title");

$result = $command->query();

或(活动记录):

$row = Movies::model()->find("m_id=:m_id", array(":m_id"=>27));
    or
$row = Movies::model()->findByPk(24); 

我已经尝试了所有方法: 1) 向 mysql config 添加了一个配置参数。在 main.php - 'enableParamLogging' => true
2) 将字符串从 ' 更改为 " 3) 添加另一个参数以防 mysql 版本 - 'emulatePrepare'=>true

没有什么对我有用。 我认为问题出在参数上,但 bindColumn 方法没有使用它,所以我的假设是 Yii 的某些模块没有包含在配置文件中或类似的东西中。

我的模型看起来像这样(在 /models 目录中创建):

class Movies extends CActiveRecord {

  public static function model($className = __CLASS__) {
    parent::model($className);

  }

}

只是为了让大家避免不必要的问题:在 main.php conf 文件中正确配置了数据库,有一个表 movies,还有一个 PKs 24 和 27。

除了在 DAO 中使用特殊方法绑定某些参数以及在 AR 中使用 findByPk 或 find 之外,所有原生 SQL 都可以正常工作。我希望这很清楚,伙计们不要用明显的简单技术可能性来打扰我,我可以(如你所认为的那样)做错了。

PS 另一个有用的信息 - 打电话时

$command->bindColumn("title", "test_title");

FW 抛出异常 - CDbCommand 及其行为没有名为“bindColumn”的方法或闭包。所以,如上所述,我认为 Yii 没有看到那些特殊的方法,这是肯定的。我该如何修复它?

好的,为什么这段代码也不起作用?没有例外,只是空白页。

$sql = "SELECT title, year_made FROM movies WHERE year_made=':ym'";

$command = $this->conn->createCommand($sql);

$command->bindParam(":ym", "2012", PDO::PARAM_STR);

$result = $command->query();

【问题讨论】:

    标签: php yii


    【解决方案1】:

    DAO 绑定不起作用,因为没有bindColumn。您只有bindParam,将变量绑定到列,或bindValue,将值绑定。 我不知道 AR 查询有什么问题。

    编辑:您的 DAO 代码应如下所示:

    $sql = "SELECT * FROM sometable WHERE title = :title";
    $command = $this->conn->createCommand($sql);
    $command->bindParam(":title", $tile_var);
    $result = $command->query();
    

    【讨论】:

    • 如果我没有在 API 中阅读此内容,我将永远不会使用 bindCoulumn - yiiframework.com/doc/guide/1.1/en/database.dao - 第 6 部分,bindParam 也不起作用。
    • bindColumn 用于在输出时绑定 out 变量。在您调用command->execute() 之后,它用于查询结果对象。如果您想绑定 in 变量(查询条件),请使用我提到的那些。当您说bindParam 不起作用时,您的意思是您遇到了错误吗?
    【解决方案2】:

    你是用 Gii 生成器生成电影模型还是你自己写的?

    编辑:

    据我所知,您必须添加 tableName

    public function tableName() {
        return 'movies';
    }
    

    【讨论】:

    • 感谢关注,是的,为了方便起见,我自己创建了模型并用模型代码编辑了 Q。
    • 很好的尝试,但不,正如 Yii API 中所说,只有当 db 表名不等于类名时,您才应该覆盖 tableName(),我的类名等于。无论如何我都试过了,但正如我所料 - 没什么,而且我没有看到错误/异常,这肯定是 FW 必须抛出的。
    • “无”是指 Yii 返回 0 行吗?您确定存在 m_id = 27 OR PK = 24 的记录吗?你检查过 Yii 是否连接了正确的数据库?我认为唯一的解释是你试图得到不存在的行。任何语法错误都应该引发异常。
    【解决方案3】:

    您可能有两个不同的问题。至少您的 DAO 代码(如果这是您的代码中实际拥有的)绑定错误。

    绑定需要在查询完成之前发生(并且在命令对象上完成),而不是在结果对象上。在此处查看更多信息:http://www.yiiframework.com/doc/guide/1.1/en/database.dao#binding-parameters

    就您的 AR 查询而言,这些也可能存在问题。您可以使用findByAttributes 代替此行(尽管您的行应该可以使用):

    $row = Movies::model()->find("m_id=:m_id", array(":m_id"=>27));
    

    如果您有标准的id 密钥,则以下内容应该可以工作。如果您没有(并且正在使用 m_id,您是否设置了模型的 primaryKey() 功能?

    $row = Movies::model()->findByPk(24); 
    

    此外,如果这改变了您处理结果的方式,您将得到一个模型对象,而不是一行...

    【讨论】:

    • 我编辑了一个问题 - 请仔细阅读。有一个绑定我也尝试过“在查询完成之前”——Yii 抛出一个异常——CDbCommand 并且它的行为没有名为“bindColumn”的方法或闭包。上一版问题中的所有示例和 cmets。
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多