为我的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 - 一切正常。
删除此密钥我遇到上述问题。但我不需要表前缀。我只想使用一个可以使用前缀的组件,而不仅仅是在我的应用程序中。
答案 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 = '';