2012-02-27 122 views
1

我正尝试使用codeigniter活动记录将单个记录添加到数据库表。原始数据是从XML中解析出来的,并且我已经测试过数据存储在当前并且在其各自的变量名中是正确的。Codeigniter活动记录使用单引号插入查询

数据从控制器传递给这样的观点:

$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; 
} 

我遇到的问题是,笨不自动将单引号添加到为answerText提供的字符串值。当我运行的功能,我得到这个错误:

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

这告诉我,由笨而不单引号进入表answerText值(在这种情况下,值丹)正在尝试。但是,如果我硬编码的单引号我和他们追加到answerText数据,就像这样:

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

查询成功运行,但单引号与串入表中添加,所以在记录数据库是这样的:

'Dan' 12 7 

有没有人遇到过这个问题,还是我做一些明显错误,我不能看?

回答

2
$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'] 
); 
3

感谢您的回答。代码的原因是因为id是问题的属性,答案是XML中问题的子元素。它是正确的。其实我固定它是这样的:

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

这似乎是一个黑客给我,但它的工作。事情是,我已经在项目的其他部分使用这个插入数组来插入没有这个声明的字符串,并且它工作正常。我不确定为什么在这种情况下它没有。

+1

这与Jasonw的建议基本不一样吗? – jogojapan 2012-02-29 05:21:17

+0

虽然它不一样,是吗? – SheedySheedySheedy 2012-02-29 20:15:22

+0

这只是我注意到你没有接受Jasonw的回答,尽管看起来你最终得到的结果基本上是Jasonw所建议的。但也许我错过了一个关键的区别。对困惑感到抱歉。 – jogojapan 2012-03-01 01:02:12