CDbConnection和大括号

时间:2014-05-10 12:35:03

标签: php mysql yii yii-components

为我的Yii应用做一个小组件。 代码

$connection = Yii::app()->getComponent('db');
$sql = 'SELECT * FROM {{settings}}';
$command = $connection->createCommand($sql); 

引发错误

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在“{settings}}”附近使用正确的语法   第1行。执行的SQL语句是:SELECT * FROM {{settings}}

告诉我出了什么问题。我不能用大括号来逃避表名?

由于

更新

这似乎是Yii Query Bulduer的错误。

如果我使用此配置

'db'=>array(
    'connectionString' => '...',
    'emulatePrepare' => ...,
    'username' => '...',
    'password' => '...',
    'charset' => '...',
    'tablePrefix' => ''
),

注意空tablePrefix - 一切正常。

删除此密钥我遇到上述问题。但我不需要表前缀。我只想使用一个可以使用前缀的组件,而不仅仅是在我的应用程序中。

1 个答案:

答案 0 :(得分:2)

抱歉,我刚刚意识到您的更新实际上是在说什么。

  

如果我使用此配置

'db'=>array(
    'connectionString' => '...',
    'emulatePrepare' => ...,
    'username' => '...',
    'password' => '...',
    'charset' => '...',
    'tablePrefix' => ''
),
     

注意空tablePrefix - 一切正常。

是的,当然是这样的:你已经将tablePrefix定义为空字符串(并且,因为我已经pointed out,因为v.1.1,空字符串前缀为supported 0.6)。

  

删除此密钥我遇到上述问题。但我不需要表前缀。我只想使用一个可以使用前缀的组件,而不仅仅是在我的应用程序中。

如果您没有定义tablePrefix,那么将其与null进行比较将是正确的(正如我之前也指出的那样,CDbCommand::setText() replaces non-null prefixes):

if($this->_connection->tablePrefix!==null && $value!='')
    $this->_text=preg_replace('/{{(.*?)}}/',$this->_connection->tablePrefix.'\1',$value);

因此,您必须自己替换大括号,或者明确将tablePrefix设置为空字符串。如果您无法控制配置文件,但想确保设置tablePrefix,则可以手动覆盖它:

if (!isset($connection->tablePrefix)) $connection->tablePrefix = '';