【问题标题】:Yii CDbCommand binding non quoted paramsYii CDbCommand 绑定非引用参数
【发布时间】:2014-04-30 12:49:34
【问题描述】:

我可以使用Yii CDbCommand 将未引用的参数绑定到查询中吗?

我尝试这样的事情

$sql = "INSERT :sourceTable SELECT * FROM :destTable GROUP BY :column1, :column2";
$params = array(
':sourceTable' => 'source_table_name'
...
);
Yii::app()->db->createCommand($sql)->execute($params);

但是得到一个错误,因为 Yii 参数绑定器在表名上添加了单引号,我的查询中断了。有没有办法在不带引号的情况下绑定 Yii 参数?

谢谢

【问题讨论】:

标签: php mysql sql yii


【解决方案1】:

不要将表名作为参数传递,就这样放(不带前缀):

$sql = "INSERT INTO {{source_table_name}} SELECT * FROM {{dest_table_name}} GROUP BY :column1, :column2";
$params = array(
...
);
Yii::app()->db->createCommand($sql)->execute($params);

【讨论】:

  • 是的,但我想避免使用 Yii 参数绑定器进行 SQL 注入攻击
  • 你会得到用户输入的表名吗?如果不是,那么它如何容易受到 SQL 注入的影响?
  • 我认为在可以生成的任何地方保护您的代码是一种很好的编程习惯。你永远不知道应用程序的其他部分(比如你从中获取变量的部分)会切换到用户输入的 var 值
【解决方案2】:

不确定是否可行。

但是,您可以将变量直接放入查询中,但首先使用CDbSChema::quoteTableName

更多信息在这里:http://www.yiiframework.com/doc/api/1.1/CDbSchema#quoteTableName

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多