Парсер XML -> JSON -> MySQL на PHP. Как я переносил комментарии из HyperComments в базу данных MaxSite CMS.
Программирование - занятие довольно интересное, особенно когда начинает получаться и видишь желаемый результат. Я не считаю себя программистом на php, однако время от времени приходится изобретать костыли и велосипеды чтобы решить какую-то задачу. Конечно, хочется нормально освоить данный язык, чтобы не убивать целый вечер (а то и не один) на написание своих маленьких скриптов, но времени на всё катастрофически не хватает.
Два года назад, для пробы, в качестве дополнительной системы комментариев, я установил HyperComments. В выборах участвовали также DISQUS, VK и Cackle, и с тех пор, особых изменений на данном рынке не случилось, разве что Cackle стал чуточку привлекательнее.
По большому счёту, никаких дополнительных "плюшек" в развитие блога сторонняя система комментариев не добавила, возможно потому что пользовался бесплатной версией, а может на данном этапе это просто ни к чему. В результате получилось расслоение - часть комментариев была в "родной" системе, другая - хранилась в системе HyperComments.
Надо отдать должное, что даже при бесплатном использовании HyperComments позволяет выгрузить свои данные в формате xml. Ну а дальше, делайте с ними что хотите... собственно, комментариев в этой системе, у меня было не так уж и много - чуть более 600 штук. Одно время сыпалось довольно много спама и система HyperComments, как-то не сильно этому противодействовала. Приходилось вручную удалять и помечать как спам, по 30-40 сообщений в день, с предложением быстрых заработков и прочей ерунды.
Встал вопрос - забить на эти комменты или попытаться перекинуть их в родную базу движка MaxSite CMS (да, я всё ещё никуда не переехал). Обезьяний путь с переносом данных вручную отметив сразу, решив попробовать свои силы в написании парсера на PHP из XML в MySQL базу. Потратил я на это занятие весь вчерашний вечер, заодно открыв много для себя нового. Результатом трудов стал небольшой скрипт (пусть и достаточно кривой, с точки зрения продвинутых PHP-программистов, но сделавший нужную мне работу). Что-то я не знал как сделать иначе, потому оно написано именно так, возможно кому пригодится. Оставляйте комментарии, будет интересно узнать мнение профессионалов.
<?php //подключение к базе данных $OnConnectServer = mysql_connect('localhost', 'database_user', 'database_password') or die ('Not connected : ' . mysql_error()); mysql_select_db('database_name',$OnConnectServer); //формируем именованный массив url_page=>id_page $pages=array(); $query="SELECT page_id,page_slug from mso_page"; $res = mysql_query($query); while ($row=mysql_fetch_array($res)){ $pages[$row['page_slug']]=$row['page_id']; } //подгружаем наш файл комментариев из xml $xml = simplexml_load_file('/путь/к/файлу/comments.xml'); //переводим его из xml в json $json = json_encode($xml); //формируем массив из json $data = json_decode($json,TRUE); //можно проверить как сформировался массив //var_dump($data); //счётчик количества обработанных комментариев $i=0; foreach($data['post'] as $post) { foreach ($post['comments'] as $arrcomment) { //проверяю наличие у поста массива комментариев (велосипед, но работает) if (isset($arrcomment[0]['nick'])) { foreach ($arrcomment as $comment) { //hipercomments выгрузил даты в формате //'Sun, 22 Feb 2015 19:40:46 GMT', //а требуется '2015-02-22 19:40:46' $d1 = strtotime($comment['time']); $date = date("Y-m-d h:i:s", $d1); $url=$post['url']; //формируем запрос $query = "INSERT INTO mso_comments (comments_page_id, comments_parent_id, comments_users_id, comments_comusers_id, comments_author_name, comments_author_ip, comments_date, comments_content, comments_rating, comments_approved) VALUES ('$pages[$url]',0,0,0,'$comment[nick]','$comment[ip]','$date','$comment[text]',0,1)"; //вываливаем на экран для проверки и если всё норм, пишем в базу echo $query."\n"; //mysql_query($query); $i++; } } else { $d1 = strtotime($arrcomment['time']); $date = date("Y-m-d h:i:s", $d1); $url=$post['url']; $query = "INSERT INTO mso_comments (comments_page_id, comments_parent_id, comments_users_id, comments_comusers_id, comments_author_name, comments_author_ip, comments_date, comments_content, comments_rating, comments_approved) VALUES ('$pages[$url]',0,0,0,'$arrcomment[nick]','$arrcomment[ip]','$date','$arrcomment[text]',0,1)"; echo $query."\n"; //mysql_query($query); $i++; } } } echo "всего:".$i; ?>
Комментариев: 1
Блин, что я сейчас прочитал? Такое ощущение что я с другой планеты. Как вообще можно что-то понимать в этих ероглифах? Для меня все эти программы чертова магия :)