在使用SQL进行预处理语句的数据访问对象中,我有几个初始化了SQL和绑定变量的字符串。其中之一是
private $insertQuestionSql = "
INSERT IGNORE INTO bgt.question_models (nodeId, questionId, parentId, state, version,
questionText, userResponseText)
VALUES (NID, QID, PID, ST, V, QT, URT)";
该语句在与DAO函数
相同的类中声明和使用public function createQuestion(QuestionTemplateModel $qt) {
//create database connection and initialize transaction
$connection = Yii::app()->db;
$transaction = $connection->beginTransaction();
try {
$command = $connection->createCommand($this->insertQuestionSql);
在Yii中,$connection
是CDbConnection
的一个实例,并通过createCommand
函数返回CDbCommand
的一个实例。
因为我在类中访问这个属性,所以我应该能够访问字符串变量。为什么这里没有发生这种情况?
完整的错误是
"Unknown property 'insertQuestionSql' for class 'QuestionDAOTest'."
无论
是否存在,此行为都会发生- 更改SQL字符串 删除第一个换行符
另外,删除$this->
会导致undefined variable: insertQuestionSql
错误。即使将访问修饰符同时更改为public
和protected
我不知道这是否对任何人都有帮助,但我想到了一个解决办法。
首先,CDbCommand::bindParam
遵循标准的PHP PDOStatement::bindParam()
语法,其中要绑定变量的占位符必须具有:
前缀。如果没有这个前缀,变量就不会绑定到SQL语句。
第二,由于某种原因,尽管在调用变量时使用了$this->
前缀,但在类内访问时总是发现private $insertQuestionSql
是一个未知属性。我通过将属性转换为static
并通过
$command = $connection->createConnection(QuestionDAO::$insertQuestionSql);