Codeigniter Datamapper save () фактически не сохраняется в базе данных - PullRequest
1 голос
/ 25 февраля 2011

Я использую CodeIgniter 1.7.3, Datamapper DMZ 1.7.1 (и нет, обновление не вариант), MySQL 5.1 и Cron Job Boostrapper для приложения, которое я создаю.Я пытаюсь извлечь информацию из файла XML и сохранить ее в базе данных.Получение данных работает нормально, как и получение данных из базы данных, поэтому я знаю, что это не проблема ни с подключением к базе данных, ни с файлом XML.

$this->site = $this->site->get_by_short_name('site');

//Load the XML files into variables so we can do stuff with them.
$doctors = simplexml_load_file(realpath('../xml/doctors.xml'));

foreach ($doctors->children() as $doctor) {
    $dr = new Doctor();
    $attrs = $doctor->attributes();
    /* See if the Doctor already exists. If so, update it.
     * Datamapper won't update fields that don't change, so if nothing's
     * changed, then the DB call won't be made.
     */
    $dr->get_by_drkey($attrs['Key']);
    $dr->drkey = $attrs['Key'];
    $dr->first_name = $doctor->FirstName;
    $dr->middle_name = $doctor->MiddleName;
    $dr->last_name = $doctor->LastName;
    $dr->long_name = $doctor->LongName;
    $dr->degrees = $doctor->Degrees;
    $dr->pic = $doctor->ImageURL;
    $dr->save($this->site);
}

Я проверил возвращаемое значение $dr->save($this->site) и возвращается как «истина» («успешное сохранение»), но данные не сохраняются и ошибки нет.Я пробовал без отношения (удалил требование для этого в базе данных), поэтому он должен сохранить без ошибок, но он все еще не сохраняет.Я также дважды проверил настройку отношений в моделях, и они в порядке.

Я также попытался обойти Datamapper и сделать прямое $this->db->insert('doctors',$data) с данными, преобразованными в массив, но данные все еще неспасти.Я также попытался запустить его из браузера (в обход загрузчика), чтобы увидеть, была ли проблема связана с запуском из командной строки, но это также не сработало.Я также не выполняю автозагрузку каких-либо библиотек сеансов или аутентификации, чтобы не возникала известная проблема с загрузчиком.

Кто-нибудь знает, почему это может не работать?

1 Ответ

0 голосов
/ 28 февраля 2011

Я нашел, что происходит.Оказывается, что атрибуты объектов SimpleXML (отдельных записей) не воспринимались Datamapper как строки, поэтому они не экранировались, и MySQL задыхался.Типирование их при установке значений объекта модели ($dr->first_name = (string)$doctor->First_Name;) устранило эту проблему.

Мне удалось получить запрос вставки через $dr->check_last_query() после попытки сохранения объекта.

...