За последние 24 часа нас посетили 18322 программиста и 1821 робот. Сейчас ищут 904 программиста ...

Как устроен парсер XML?

Тема в разделе "Прочие вопросы по PHP", создана пользователем vuzy, 13 мар 2010.

  1. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Недопереведено это типа не сырое, да? :)

    И пока это "не всё сырое" не уйдёт на php.net, толку новичкам от него ноль.
     
  2. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    PHP:
    1.  
    2. <?
    3. foreach ($xml->user as $id)
    4. {
    5. $sql="SELECT userid, username FROM haddan_user WHERE userid='".$id->userid."'";
    6. $sql=mysql_query($sql);
    7. if (!$sql)
    8. {
    9. /*$username=mb_convert_encoding($id->username, "Windows-1251", "UTF-8");
    10. $username=mysql_real_escape_string($username);
    11. $clanname=mb_convert_encoding($id->clanname, "Windows-1251", "UTF-8");
    12. $clanname=mysql_real_escape_string($clanname);
    13. $roomname=mb_convert_encoding($id->roomname, "Windows-1251", "UTF-8");
    14. $roomname=mysql_real_escape_string($roomname);
    15. $align=mb_convert_encoding($id->align, "Windows-1251", "UTF-8");
    16. $align=mysql_real_escape_string($align);*/
    17. $align=explode(';',$id->align);
    18. $time=time();
    19. $newchar="INSERT INTO haddan_user SET userid='".$id->userid."', username='".mysql_real_escape_string($id->username)."', clan='".$id->clan."', sex='".$id->sex."', race='".$id->race."', level='".$id->level."', clanname='".mysql_real_escape_string($id->clanname)."', online='".$id->online."', roomname='".mysql_real_escape_string($id->roomname)."', aligImage='".$align[1]."', aligTitle='".$align[0]."', last_update_time='".$time."'";
    20. mysql_query($newchar) or die ('Ошибка в запросе добавления '.mysql_error());
    21. }
    22. else
    23. {
    24. $updchar="UPDATE haddan_user SET username='".mysql_real_escape_string($id->username)."', clan='".$id->clan."', sex='".$id->sex."', race='".$id->race."', level='".$id->level."', clanname='".mysql_real_escape_string($id->clanname)."', online='".$id->online."', roomname='".mysql_real_escape_string($id->roomname)."', aligImage='".$align[1]."', aligTitle='".$align[0]."', last_update_time='".$time."' WHERE userid='".$id->userid."'";
    25. mysql_query($updchar) or die ('Ошибка в запросе обновления '.mysql_error());
    26. }
    27. }
    28.  
    Вот такая вот проблемма не сохраняет переменные которые в данный момент законвертированы никак не сохраняет... если вводить их в базу то скрипт просто забивает эти места вакуумом... =( а если использовать запрос без них то все в юникоде.
     
  3. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    У insert нет команды set. Либо
    [sql]insert into table (поле1, поле2)
    values (значение1, значение2)[/sql]
    либо
    [sql]insert into table values (значение1, значение2)[/sql]
    Тогда значение1 вставится для первого поля, значение2 - для второго. Обычная последовательность - её можно увидеть в phpMyAdmin, чем выше поле, тем оно "первее".

    Опять двадцать-восемь. Курс лекций молодого бойца. Как не писать дебильный код. Ну, уж без обид. :)

    Работу с БД не надо сувать в цикл. Кол-во запросов будет увеличиваться с каждой итерацией. На некоторых хостингах есть строгое ограничение на количество запросов.

    В твой задаче что нужно? Получить список пользователей, отсутствующих в БД туда занести, существующих обновить. Очевидно, что select можно вынести? Можно. insert можно вынести? Можно.

    PHP:
    1. <?
    2. // получаем все id
    3. $ids = array();
    4. foreach ($xml->user as $user){
    5.     $ids[] = $user->userid;
    6. }
    7.  
    8. // Делаем им select
    9. $sql = 'SELECT userid FROM haddan_user WHERE userid in ('.join(', ', $ids).')';
    Та-адан. Мы выберем всех пользователей, который есть.

    А как узнать id пользователей, которые не были найдены в базе? Очень просто. Выполнить запрос. Составить $exists_ids (существующие ids) и сравнить array_diff().

    Теперь как победить insert в цикле? Категорически просто.

    PHP:
    1. <?
    2. $values = array();
    3.  
    4. foreach ($xml->user as $user){
    5.     $align = explode(';',$user->align);
    6.  
    7.     $values[] = array(
    8.         $user->userid,
    9.         mysql_real_escape_string($id->username),
    10.         $id->clan,
    11.         $id->sex,
    12.         $id->race,
    13.         $id->level,
    14.         mysql_real_escape_string($id->clanname),
    15.         $id->online,
    16.         mysql_real_escape_string($id->roomname),
    17.         $align[1],
    18.         time()
    19.     );
    20. }
    21.  
    22. // Сосяка-рассосяка! Мы созали insert способный сделать всё одним запросом!
    23. $insert = 'INSERT INTO haddan_user (userid, username, clan, sex, race, level, clanname, aligImage, aligTitle, last_update_time) values ('.join('), (', $values).')';
    Но что-то я разп*зделся. Конкретно в данном случае я бы использовал insert ... on duplicate. Правда, не очень понял смысл обновления юзерей. Может, давно не спал, но кажется, что оно бессмысленно.
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  5. vuzy

    vuzy Активный пользователь

    С нами с:
    11 мар 2010
    Сообщения:
    199
    Симпатии:
    0
    Адрес:
    киев
    PHP:
    1. $insert = 'INSERT INTO haddan_user (userid, username, clan, sex, race, level, clanname, aligImage, aligTitle, last_update_time) values ('.join('), (', $values).')';
    что то мне ажется что такой запрос будет добавлять только самую последнюю запись. особенно когда вынесен за цикл ... спасибо за совет учту попробую адаптировать...
     
  6. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    !!! он и правда есть. :) Я столько раз пересматривал доки мускула, но был настолько уверен в его отсутствии, что не обращал внимания. Ну и даун.

    $values массив всех данных из цикоа, мы его соединяем и вставляем в запрос. Будет выглядеть как-то так:
    [sql]insert into table (...) values (...), (...), (...)[/sql]

    Только один косяк, в цикле $values[] надо присваивать строку, а не массив, конечно же.