За последние 24 часа нас посетили 5823 программиста и 697 роботов. Сейчас ищут 225 программистов ...

Не могу использовать спарсиную цифру с другого сайта

Тема в разделе "PHP для новичков", создана пользователем the_h, 12 июн 2019 в 07:54.

  1. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    1. Мне нужно спарсить котировку с другого сайта, это получилось.
    2. С этой цифрой мне нужно совершить арифметические действия - это не получается
    Видимо $content воспринимается как текст или как ноль и любое действие с этой переменной выдаёт ноль. Вся арифметика в конце кода. Помогите пожалуйста. В php третий день :)

    PHP:
    1. <?php
    2. $cache_lifetime = 3600;
    3. $cache_file = "cache/kurs.html";
    4. $cache_content = false;
    5.  
    6. if ( file_exists($cache_file) ) {
    7. $cache_modified = time() - @filemtime($cache_file);
    8. if ( $cache_modified < $cache_lifetime ) {
    9. $cache_content = file_get_contents($cache_file);
    10. }
    11. }
    12.  
    13. $content = file_get_contents('https://zoloto-md.ru/quotes-online');
    14. $pos = strpos($content, '<span class="quote-down quote_xau_rur">');
    15. $content = substr($content, $pos);
    16. $pos = strpos($content, '</span>');
    17. $content = substr($content, 0, $pos);
    18.  
    19. if ( $cache_content === false ) {
    20. $cache_content = $content;
    21. $fp = @fopen($cache_file, "w");
    22. if ( $fp ) {
    23. @fwrite($fp, $cache_content);
    24. @fclose($fp);
    25. }
    26. }
    27.  
    28. $rub = (int)$content;
    29. $_999 = ($rub/33.1);
    30. $_958 = ( $_999*0.958 );
    31. $_750 = ( $_999*0.75 );
    32. $_585 = ( $_999*0.585 );
    33. $_375 = ( $_999*0.375 );
    34.  
    35. ?>
    36.  
    37. <p> <?php echo $content; ?> </p>
    38. <p> <?php echo $rub; ?> </p>
    39. <p> <?php echo $_999; ?> </p>
    40. <p> <?php echo $_958; ?> </p>
    41. <p> <?php echo $_750; ?> </p>
    42. <p> <?php echo $_585; ?> </p>
    43. <p> <?php echo $_375; ?> </p>
     
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    тут что у вас?
    PHP:
    1.  <?php echo $content; ?>
     
  3. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    Это вывод спарсинной котировки с сайта донора.
    Дальше мне нужно разделить или умножить эту цифру

    Вот можно упростить задачу:
    PHP:
    1. <?php
    2. $content = file_get_contents('https://zoloto-md.ru/quotes-online');
    3. $pos = strpos($content, '<span class="quote-down quote_xau_rur">');
    4. $content = substr($content, $pos);
    5. $pos = strpos($content, '</span>');
    6. $content = substr($content, 0, $pos);
    7.  
    8. $rub = (int)$content;
    9. $_999 = ($rub/33.1);
    10.  
    11. ?>
    12. <p> <?php echo $content; ?> </p>
    13. <p> <?php echo $_999; ?> </p>
    Мне выдаёт:

    Код (Text):
    1. [цифра] - спарсинная котировка с сайта донора
    2. 0
    Почему котировка при делении выдаёт ноль? Так же как и при других арифметических действиях
     
  4. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    блин покажи просто это:
    PHP:
    1. <?php echo $content; ?>
     
  5. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    86664.7539
     
  6. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    @the_h врете:
    PHP:
    1. $content = '86664.7539';
    2. $rub = (int)$content;
    3. $_999 = ($rub/33.1);
    4. echo $_999;   //2618.247734139
    так что у вас тут?
    PHP:
    1. <?php echo $content; ?>
    --- Добавлено ---
    ладно, так можно до бесконечно, у вас в $content:
    HTML:
    1. <span class="quote-down quote_xau_rur">86671.6063</span>
     
    #6 Artur_hopf, 12 июн 2019 в 11:21
    Последнее редактирование: 12 июн 2019 в 11:35
  7. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    $content - постоянно меняющаяся цифра с сайта донора
    мне нужно разделить $content на 33,1

    Я пробовал по разному
    PHP:
    1. $rub = ($content/33,1);
    2. echo $rub // выдает 0
    3.  
    4. $rub = (int)$content;
    5. $_999 = ($rub/33.1);
    6. echo $_999 // выдает 0
    7.  
    8. $rub = (int)$content;
    9. $num331 = '33.1';
    10. $_999 = ($rub/$num331);
    11. echo $_999 // выдает 0
    Как мне $content разделить или умножить на что-нибудь?
    Может проблема в том, что все цифры не целые, а с запятой?
     
  8. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    @the_h 100 рублей и я ткну пальцем где ты ошибся :p
     
  9. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    114
    Симпатии:
    21
    Адрес:
    Одесса
    Я чёта не пойму, что преследуется в попытке получить целое число из вещественного, представленного в виде строки? Ноль, он и в Африке ноль.
    $rub = floatval($content);
    Не?
    --- Добавлено ---
    Или, коль нужно именно целое:
    $rub = ceil($content);
    $rub = floor($content);
    --- Добавлено ---
    PHP:
    1. define('DEG_TO_RAD', 0.017453292519943295769236907684886);
    2. define('EARTH_R_IN_M', 6372797.560856);
    3.  
    4. function distLatLon($lat1, $lon1, $lat2, $lon2) {
    5.     $latArc = ($lat1 - $lat2) * DEG_TO_RAD;
    6.     $lonArc = ($lon1 - $lon2) * DEG_TO_RAD;
    7.     $latH = pow(sin($latArc * 0.5), 2);
    8.     $lonH = pow(sin($lonArc * 0.5), 2);
    9.     $tmp = cos($lat1 * DEG_TO_RAD) * cos($lat2 * DEG_TO_RAD);
    10.     return ceil(EARTH_R_IN_M * 2 * asin(sqrt($latH + $tmp * $lonH)));
    11. }
    Вот где весело)
     
  10. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    PHP:
    1. $rub = floatval($content);
    2. $_999 = $rub/33.1;
    3. $_998 = $rub+50;
    4.  
    5. <p> <?php echo $content; ?> </p>
    6. <p> <?php echo $rub; ?> </p>
    7. <p> <?php echo $_999; ?> </p>
    8. <p> <?php echo $_998; ?> </p>
    Ответ:
    Код (Text):
    1. 86612.2950
    2. 0
    3. 0
    4. 50
    PHP:
    1. $rub = ceil($content);
    2. $_999 = $rub/33.1;
    3. $_998 = $rub+50;
    4.  
    5. <p> <?php echo $content; ?> </p>
    6. <p> <?php echo $rub; ?> </p>
    7. <p> <?php echo $_999; ?> </p>
    8. <p> <?php echo $_998; ?> </p>
    Ответ:
    Код (Text):
    1. 86612.2950
    2. 0
    3. 0
    4. 50
    Если $content не парсить, а задать вручную, то удаётся получить все действия которые мне требуются.
    Может быть я парсю как-то не правильно?

    PHP:
    1. $content = file_get_contents('https://zoloto-md.ru/quotes-online'); // страница донор
    2. $pos = strpos($content, '<span class="quote-down quote_xau_rur">'); // строчка которая идёт перед моими данными
    3. $content = substr($content, $pos); // удаляем всё, что есть моих данных
    4. $pos = strpos($content, '</span>'); // данные которые мне нужны идут до этого текста
    5. $content = substr($content, 0, $pos); // удаляем всё что идёт на страничке после моих данных
    6. // получаем одну единственную цифру
    7. // цифра не целая, формата 86605.8050
    8. // постоянно меняется, но я хочу чтобы обновлялась раз в час
     
  11. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    @the_h я уже писал где у тебя ошибка :)
     
  12. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    Я не вижу ответа на мой вопрос.
    Да, у меня в $content именно это.
    Где ошибка то?
     
  13. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    Мде, до сих пор не дошло что ли, а так дойдет:
    PHP:
    1. <?php
    2. $content = '<span class="quote-down quote_xau_rur">86671.6063';
    3. $rub = floatval($content); // нолик ноль
    4. ?>
    Ты строку пытаешься превратить в число, так понятнее?

    если бы было написано так, ничего бы не изменилось в твоем коде:
    PHP:
    1. <?php
    2. $content = 'координаты корабля 86671.6063';
    3. $rub = floatval($content); // нолик ноль
    4. ?>
     
    #13 Artur_hopf, 13 июн 2019 в 17:41
    Последнее редактирование: 13 июн 2019 в 17:49
    acso нравится это.
  14. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.009
    Симпатии:
    166
    @the_h, посмотри наконец в браузере код html
     
  15. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    @Valick да он его посмотрел блин, в этом и суть .
     
  16. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    114
    Симпатии:
    21
    Адрес:
    Одесса
    Короче)) Держите код и учите матчасть ;)
    PHP:
    1. header('Content-type: text/html; charset=utf-8');
    2.  
    3. $ch = curl_init();
    4. curl_setopt($ch, CURLOPT_URL, "https://zoloto-md.ru/quotes-online");
    5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    6. $body = curl_exec($ch);
    7.    
    8. define('start_part', '<span class="quote-down quote_xau_rur">');
    9. define('end_part', '</span>');
    10.    
    11. $pos_start = strpos($body, start_part) + strlen(start_part);
    12. $pos_end = strpos($body, end_part, $pos_start);
    13. $len = $pos_end - $pos_start;
    14.    
    15. $content = substr($body, $pos_start, $len);
    16. $rub = floatval($content);
    17. $_999 = $rub / 33.1;
    18. $_998 = $rub + 50;
    19.    
    20.    
    21. echo $content . '<br>';
    22. echo $rub . '<br>';
    23. echo $_999 . '<br>';
    24. echo $_998;
    Результат тут: http://acso.com.ua/test/gold.php
     
  17. the_h

    the_h Новичок

    С нами с:
    Среда
    Сообщения:
    7
    Симпатии:
    0
    Спасибо. Всё работает.
    Подскажите пожалуйста как в данном случае проще реализовать обновление котировки раз в час?
     
  18. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    906
    Симпатии:
    130
    Ajax запросом через setTimeout или setInterval.
     
  19. acso

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

    С нами с:
    15 апр 2010
    Сообщения:
    114
    Симпатии:
    21
    Адрес:
    Одесса
    А кто этот аякс будет раз в час дергать? Крон. Многие хостеры позволяют выполнять скрипт по расписанию.
    Я, иногда, использую сервис на делфи, который обрабатывает основную логику и, по таймеру, дёргает нужный скрипт на пхп по урлу.
    --- Добавлено ---
    Спасибо не плескается)) Кнопка есть для этого.
    --- Добавлено ---
    Имхо, обновление можно повесить на юзеров. Хранить в бд историю котировок и время последнего обновления. Клиент зашел на сайт, проверяем время последнего обновления: меньше часа - отдаем из бд, больше - берем свежие данные, кладем в бд, отдаем клиенту.
    --- Добавлено ---
    Но, в данном случае, у вас не будет истории котировок. Если никто на сайт не заходил, то и в историю ничего добавляться не будет. Так что копайте в сторону крона.
    --- Добавлено ---
    upload_2019-6-14_19-51-3.png
    Обратите внимание на футер - курс валют. Я это сделал на кроне.
     
    the_h нравится это.