首页 文章

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

提问于
浏览
1

我正在尝试使用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 回答

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

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

    此外,在活动记录insert文档中,非常清楚地说明了 Note: All values are escaped automatically producing safer queries. 你应该真的知道你是否做了任何修改,因为从这个问题来看,没有太多可以猜测的 . 我认为你应该引用库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']
        );
    

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

相关问题