Перейти к содержимому

Реферальная программа Мегаплана


Импорт данных из xml в базу данных сайта

#1 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176
0

Отправлено 16 Июнь 2011 - 14:45

Я в базах данных не силен, а тут возникла задача:
Есть xml-файл, содержащий много много структурированной информации вида
<?xml version="1.0" encoding="windows-1251" ?>
<blocks>
<block>
<id>id1</id>
<date>Дата1</date>
<title>Заголовок1</title>
<link>Ссылка1</link>
</block>
<block>
<id>id2</id>
<date>Дата2</date>
<title>Заголовок2</title>
<link>Ссылка2</link>
</block>
...
</blocks>

Вопрос: как эту информацию проще всего перегнать в базу данных сайта?
Типа, создать табличку blocks с полями id, date, title, link и перекачать в нее все данные из исходного файла.
Ну чтоб не вручную вбивать.
На сайте стоит phpMyAdmin.

Есть подозрение, что должны быть некие средства автоматизации этого процесса. Но гугл в поисках не помог. ;)

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Ошибки в базе данных. Что они обозначают?
  2. Обработка PHP-кода - полученного из базы данных
  3. База данных из XML
  4. Проблема с базой данных (импорт и создание)
  5. Проблема с базой данных

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Июнь 2011 - 15:39

Вроде с версии 5.1 MySQL имеется поддержка работы с XML. А так я бы написал скрипт, используя, к примеру, класс SimpleXMLElement - получаем данные из XML и помещаем их в БД.
  • 0


#3 almatar

almatar
  • Пользователь
  • 203 сообщений
  • Репутация: 0

Отправлено 16 Июнь 2011 - 16:03

Это надо наверно в пхпмайамине через вкладку SQL запросы писать типа insert тотото, или как вы упомянули ручками всё создавать. Короч я не програмёр, бес его знает :D
  • 0

#4 yury

yury
    Topic Starter
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 16 Июнь 2011 - 17:01

А так я бы написал скрипт, используя, к примеру, класс SimpleXMLElement - получаем данные из XML и помещаем их в БД.

matroskin8
Напишите, если не сложно. Я с этим делом не сталкивался.
  • 0

#5 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Июнь 2011 - 17:17

В принципе, не сложно. Если вытащить данные из XML в массив будет достаточно? Думаю, затем из массива загонять данные в БД не составит проблемы. Если успею, то сегодня напишу, если нет - завтра.
  • 0


#6 yury

yury
    Topic Starter
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 16 Июнь 2011 - 17:36

Если вытащить данные из XML в массив будет достаточно?

Думаю, да. Дальше я справлюсь.
  • 0

#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Июнь 2011 - 18:03

Ну и отлично :D
В принципе, быстренько набросал. Думаю, все должно быть понятно - код старался максимально комментировать. Даже тестово поместил в БД - все работает. Единственное - это возможная проблема с кодировками... XML не очень дружит с кириллицей, лучше работать с юникодом. Код тестировал - все работает.
XML:
<?xml version="1.0" encoding="utf-8" ?>
<blocks>
<block>
<id>id1</id>
<date>Дата1</date>
<title>Заголовок1</title>
<link>Ссылка1</link>
</block>
<block>
<id>id2</id>
<date>Дата2</date>
<title>Заголовок2</title>
<link>Ссылка2</link>
</block>
</blocks>

PHP:
<?php

mysql_connect("localhost", "root", "") or die("No connect to server");
mysql_select_db("test") or die("No select DB");
mysql_query("set names 'utf-8'");

/* функция дебага массивов */
function arr($arr){
echo '<pre>';
print_r($arr);
echo '</pre>';
}

$file = 'file.xml'; // файл XML
$read = simplexml_load_file($file); // получаем объект класса

//arr($read); // распечатываем массив $read

$xml = $read->block; // $xml - объект-массив, вложенные теги - его свойства

$count = count($xml); // кол-во элементов массива

for($i = 0; $i < $count; $i++){

echo "<p>Ряд для таблицы с id - {$i}</p>";
echo $xml[$i]->id. '<br />'; // вывод id
echo $xml[$i]->date. '<br />'; // вывод date
echo $xml[$i]->title. '<br />'; // вывод title
echo $xml[$i]->link. '<br />'; // вывод link
/* можно поместить в привычные переменные */
$id_xml = $xml[$i]->id;
$date_xml = $xml[$i]->date;
$title_xml = $xml[$i]->title;
$link_xml = $xml[$i]->link;

/* заносим данные в БД */
$res = mysql_query("INSERT INTO `xml` SET
`id_xml`='{$id_xml}',
`date_xml`='{$date_xml}',
`title_xml`='{$title_xml}',
`link_xml`='{$link_xml}'");
}

?>

  • 0


#8 yury

yury
    Topic Starter
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 16 Июнь 2011 - 20:02

Ну и отлично :D
В принципе, быстренько набросал. Думаю, все должно быть понятно - код старался максимально комментировать. Даже тестово поместил в БД - все работает. Единственное - это возможная проблема с кодировками... XML не очень дружит с кириллицей, лучше работать с юникодом. Код тестировал - все работает.

matroskin8,
спасибо, все получилось
Правда пришлось помучиться с кодировками, пока не пришло в голову заменить
mysql_query("set names 'utf-8'");
на
mysql_query("set names 'utf8'");

  • 0

#9 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Июнь 2011 - 21:03

А, точно - эт я уже ошибся в запросе с кодировкой :D
Кстати, надо будет проверить завтра и дописать в запрос условие:
mysql_query("set names 'utf-8'") or die("Can't set charset");

Интересно выведет ли ошибку с такой записью...
  • 0


#10 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 17 Июнь 2011 - 09:58

Проверил... условие или срабатывает при такой записи:
mysql_query("set names 'utf-8'") or die("Can't set charset");

и выводится сообщение о невозможности установить кодировку соединения. Вот что значит не проверять такие простенькие запросы - а я обычно никогда и не проверяю их... теперь будет мне наука :D
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru