为我的Yii应用程序做一个小组件。代码
$connection = Yii::app()->getComponent('db');
$sql = 'SELECT * FROM {{settings}}';
$command = $connection->createCommand($sql);
引发错误
SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以找到在第1行的“ {settings}}”附近使用的正确语法。执行的SQL语句为:SELECT * FROM {{settings}}
告诉我出了什么问题。我不能使用花括号来转义表名吗?
谢谢
更新:
看来这是Yii Query Bulduer错误。
如果我使用此配置
'db'=>array(
'connectionString' => '...',
'emulatePrepare' => ...,
'username' => '...',
'password' => '...',
'charset' => '...',
'tablePrefix' => ''
),
注意空的tablePrefix-一切正常。
删除此键,我遇到了上述问题。但是我不需要表前缀。我只想使用一个可以与前缀一起使用的组件,而不仅仅是在我的应用程序中。
抱歉,我刚刚意识到您的更新实际上是在说什么。
如果我使用此配置
'db'=>array( 'connectionString' => '...', 'emulatePrepare' => ..., 'username' => '...', 'password' => '...', 'charset' => '...', 'tablePrefix' => '' ),
注意空的tablePrefix-一切正常。
是的,当然可以。您已经定义tablePrefix
为一个空字符串(而且,正如我已经指出的那样,自v.1.1.6版本开始支持空字符串前缀)。
删除此键,我遇到了上述问题。但是我不需要表前缀。我只想使用一个可以与前缀一起使用的组件,而不仅仅是在我的应用程序中。
如果您未定义tablePrefix
,则将其与null
true进行比较(并且正如我之前所指出的,CDbCommand::setText()
替换非null前缀):
if($this->_connection->tablePrefix!==null && $value!='')
$this->_text=preg_replace('/{{(.*?)}}/',$this->_connection->tablePrefix.'\1',$value);
因此,您必须自己替换大括号,否则必须显式设置tablePrefix
为空字符串。如果您无法控制配置文件,但要确保tablePrefix
已设置,则可以手动覆盖它:
if (!isset($connection->tablePrefix)) $connection->tablePrefix = '';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句