Codeigniter活动记录使用单引号插入查询

时间:2012-02-27 23:07:23

标签: php codeigniter insert escaping

我正在尝试使用codeigniter活动记录将单个记录添加到数据库表。原始数据是从XML解析的,我已经测试过数据是否存在,并且在各自的变量名中都是正确的。

数据从控制器传递到视图,如下所示:

$data['questionId'] = $question['id'];
$data['answerText'] = $question->answer;
$q = $this->mobile_user_model->save_actual_answers($data);

模型插入函数如下所示:

function save_actual_answers($data) {
    $insert = array(
        'answerText' => $data['answerText'],
        'responseId' => $data['responseId'],
        'questionId' => $data['questionId']
    );
    $q = $this->db->insert('actual_answers', $insert);
    return $q;
}

我遇到的问题是codeigniter不会自动将单引号添加到为answerText提供的字符串值。当我运行该函数时,我收到此错误:

Error Number: 1054
Unknown column 'Dan' in 'field list'
INSERT INTO `actual_answers` (`answerText`, `responseId`, `questionId`)
VALUES (Dan, 12, 7)

这告诉我,answerText的值(在这种情况下是值Dan)试图通过codeigniter输入到表中而没有单引号。但是,如果我自己对单引号进行硬编码并将它们附加到answerText数据,就像这样:

'answerText' => "'" . $data['answerText'] . "'"

查询成功运行,但单引号随字符串一起添加到表中,因此数据库中的记录如下所示:

'Dan'    12    7

以前是否有人遇到过这个问题,或者我做了一些我看不到的严重错误?

2 个答案:

答案 0 :(得分:3)

$data['questionId'] = $question['id'];
$data['answerText'] = $question->answer;

这两条线对我来说似乎有问题。第一行,$ question是一个数组,在第二行,问题是得到属性答案的对象?!你确定你在日志中没有得到任何php错误吗?

此外,在活动记录insert文档中,非常明确地说明了注意:所有值都会自动转义,从而产生更安全的查询。您应该知道是否进行了任何修改因为从这个问题来看,没有什么可猜测的。我认为你应该使用库escape function来引用而不是引用自己。像

这样的东西
$insert = array(
      'answerText' => $this->db->escape_str(data['answerText']),
      'responseId' => $data['responseId'],
      'questionId' => $data['questionId']
);

答案 1 :(得分:3)

感谢您的回答。代码之所以如此,是因为id是问题的属性,而答案是XML中的问题的子元素。它是正确的。我实际上是这样解决的:

$insert = array(
        'answerText' => (string)$data['answerText'], // Needed to declare it was a string 
        'responseId' => $data['responseId'],
        'questionId' => $data['questionId']
    );

对我来说这似乎是一个黑客攻击,但它确实奏效了。问题是,我在项目的其他部分使用了这个插入数组来插入没有这个声明的字符串,它工作正常。我不确定为什么在这种情况下它没有。