Codeigniter активных записей вставьте запрос с одинарными кавычками - PullRequest
1 голос
/ 28 февраля 2012

Я пытаюсь добавить одну запись в таблицу базы данных, используя активные записи 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 голосов
/ 28 февраля 2012

Спасибо за ответ. Причина, по которой код такой, заключается в том, что идентификатор является атрибутом вопроса, а ответ - дочерним элементом вопроса в XML. Это правильно. Я на самом деле исправил это так:

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

Мне кажется, что это взлом, но это сработало. Дело в том, что я использовал этот массив вставки в других частях проекта для вставки строк без этого объявления, и он работает нормально. Я не уверен, почему в этом случае это не так.

3 голосов
/ 28 февраля 2012
$data['questionId'] = $question['id'];
$data['answerText'] = $question->answer;

Эти две строки кажутся мне сомнительными. Первая строка, $ question - это массив, а во второй строке - вопрос, объект получает ответ свойства ?! Вы уверены, что не получили ошибку php в журнале?

Кроме того, в активной записи вставка документации указано очень четко Примечание: все значения экранируются автоматически, создавая более безопасные запросы. Вы должны действительно узнать, если вы сделали какие-либо модификации, потому что из вопроса, не так много, чтобы догадаться. Я думаю, что вы должны цитировать, используя библиотеку escape-функцию , а не цитировать себя. Что-то вроде

$insert = array(
      'answerText' => $this->db->escape_str(data['answerText']),
      'responseId' => $data['responseId'],
      'questionId' => $data['questionId']
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...