Проверьте правильность кода

Тема в разделе "Как сделать...", создана пользователем bork75, 21 июл 2014.

  1. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Взял пример парсера с сайта http://tekhnobuild.info/prostejshij-parser-na-php-s-curl и сделал из него парсер с двумя шагами.
    - Первый шаг - это забираю с одной страницы url адрес
    - Второй шаг - подставляю этот адрес во вторую часть кода и парсю уже нужное на этой странице.

    PHP:
    <?
    // Инициализируем курл
    $ch curl_init('http//sait.ru');

    // Параметры курла
    curl_setopt($chCURLOPT_USERAGENT'IE20');
    curl_setopt($chCURLOPT_HEADER0);
    // Следующая опция необходима для того, чтобы функция curl_exec() возвращала значение а не выводила содержимое переменной на экран
    curl_setopt($chCURLOPT_RETURNTRANSFER'1');

    // Получаем html
    $text curl_exec($ch);

    // Отключаемся
    curl_close($ch);

    // Находим и сохраняем нужный фрагмент
    preg_match'/<a>(.*?)<\/a>/is' $text $links );


    // ------ Вторая часть -----

    // Инициализируем курл и вставляем результат из первого парсинга
    $ch curl_init('http//sait.ru'.$links[0]);

    // Параметры курла
    curl_setopt($chCURLOPT_USERAGENT'IE20');
    curl_setopt($chCURLOPT_HEADER0);
    // Следующая опция необходима для того, чтобы функция curl_exec() возвращала значение а не выводила содержимое переменной на экран
    curl_setopt($chCURLOPT_RETURNTRANSFER'1');

    // Получаем html
    $text curl_exec($ch);

    // Отключаемся
    curl_close($ch);

    // Находим и сохраняем нужный фрагмент
    preg_match'/<ul><li>(.*?)<\/li><\/ul>/is' $text $links );

    // Выводим результат на экран
    echo $links[0];
    ?>
    Всё работает, но смущает, что дважды отключаюсь curl_close и дважды прописываю USERAGENT и т.п.
    Скрипт обращается на разные страницы одного сайта.
    Может нужно что-то убрать или так всё оставить?
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    просто дублирующий функционал вынеси в функцию
    function getUrl($url){
    $ch = curl_init($url);


    и вызывай $text = getUrl('http//sait.ru'.$links[0]);
     
    bork75 нравится это.
  3. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Смысл понятен, но всё равно буду сомневаться в правильности написания, если не сложно, напиши мой код с исправлениями.
     
  4. Darkness

    Darkness Постоялец

    Регистр.:
    21 янв 2013
    Сообщения:
    146
    Симпатии:
    69
    PHP:
    <?php
    $url 
    'http//sait.ru';
    function 
    getHtml($url ''$ua 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36') {
        
    $curl_handle curl_init();
        
    curl_setopt($curl_handleCURLOPT_URL$url);
        
    curl_setopt($curl_handleCURLOPT_USERAGENT$ua);
        
    curl_setopt($curl_handleCURLOPT_FOLLOWLOCATIONtrue);
        
    curl_setopt($curl_handleCURLOPT_RETURNTRANSFERtrue);
        
    curl_setopt($curl_handleCURLOPT_SSL_VERIFYPEERfalse);
        
    curl_setopt($curl_handleCURLOPT_HEADERfalse);
        
    $result curl_exec($curl_handle);
        
    curl_close($curl_handle);
        unset(
    $curl_handle);
        return 
    $result;
    }
    $data getHtml($url);
    preg_match('/<a>(.*?)<\/a>/is'$data$links);
    $data getHtml($url $links[0]);
    preg_match('/<ul><li>(.*?)<\/li><\/ul>/is'$data$links);
    unset(
    $data);
    echo 
    $links[0];
    ?>
     
    bork75 нравится это.
  5. Grunuk

    Grunuk

    Регистр.:
    19 янв 2008
    Сообщения:
    187
    Симпатии:
    6
    Проверьте пожалуйста и мой код, если переключаюсь на укр вариант магазина на странице товара, выдает ошибку:

    Код:
    FUNCTION t1.IF does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference ManualSELECT t1.productID, t1.IF(LENGTH(`name_ua`), `name_ua`, `name_ru`) AS `name`, IF(LENGTH(`brief_description_ua`), `brief_description_ua`, `brief_description_ru`) AS brief_description, t1.Price, t1.slug, t1.in_stock, t3.thumbnail FROM SC_products t1 LEFT JOIN SC_categories t2 USING(categoryID) LEFT JOIN SC_product_pictures t3 ON (t1.default_picture=t3.photoID) WHERE t1.enabled = 1 AND t1.in_stock > 0 AND t1.productID <> 28712 AND Price > 0 AND t1.categoryID = 34467 AND ( (t1.Price >= 285 AND t1.Price <= 288) OR (t1.Price >= 292 AND t1.Price <= 295) ) ORDER BY RAND() LIMIT 6


    PHP:
      /* patch рекомендуемые товары */
      
    $product_related_list = array();
      
    $cats array_map(create_function('$v''return $v["categoryID"];'), catCalculatePathToCategory($categoryID));
      
    array_shift($cats);
      if (!
    $cats) {
      
    $cats = array($categoryID);
      }
      
    $sql_compiled sql_compile_placeholder('SELECT t1.productID, t1.'.LanguagesManager::sql_prepareField('name'true).', '.LanguagesManager::sql_prepareField('brief_description').' AS brief_description, t1.Price, t1.slug, t1.in_stock, t3.thumbnail
         FROM ?#PRODUCTS_TABLE t1
         LEFT JOIN ?#CATEGORIES_TABLE t2 USING(categoryID)
      LEFT JOIN ?#PRODUCT_PICTURES t3 ON (t1.default_picture=t3.photoID)
         WHERE t1.enabled = 1 AND t1.in_stock > 0 AND t1.productID <> ?productID AND Price > 0 AND t1.categoryID = ?categoryID
      AND (
      (t1.Price >= ?priceMinFrom AND t1.Price <= ?priceMinTo)
      OR
      (t1.Price >= ?priceMaxFrom AND t1.Price <= ?priceMaxTo)
      )
      ORDER BY RAND()
         LIMIT ?limit'
    );
      
    $related_records array_merge(
      
    // разница +- $2 - $5
      
    db_phquery_fetch(DBRFETCH_ASSOC_ALL$sql_compiled, array(
          
    'productID' => $productID,
      
    'categoryID' => $categoryID,
      
    'priceMinFrom' => $a['Price'] > $a['Price'] - 1,
      
    'priceMinTo' => $a['Price'] > $a['Price'] - 5,
      
    'priceMaxFrom' => $a['Price'] + 2,
      
    'priceMaxTo' => $a['Price'] + 5,
      
    'limit' => 6,
          )),
      
    // разница +- $20 - $30
      
    db_phquery_fetch(DBRFETCH_ASSOC_ALL$sql_compiled, array(
          
    'productID' => $productID,
      
    'categoryID' => $categoryID,
      
    'priceMinFrom' => $a['Price'] > 30 $a['Price'] - 30 1,
      
    'priceMinTo' => $a['Price'] > 30 $a['Price'] - 20 30,
      
    'priceMaxFrom' => $a['Price'] + 20,
      
    'priceMaxTo' => $a['Price'] + 30,
      
    'limit' => 4,
          ))
      );
         foreach(
    $related_records as $r){
      
    $r['price_str_ua'] = show_price($r['Price'], Product::PRICE_UA);
      
    /* patch by SLIM, моя цена */
      
    $my_PriceWithUnit prd_getPrice($rtrue);
      if (
    $my_PriceWithUnit) {
      
    $r['price_str_ua'] = $my_PriceWithUnit;
      }
           
    $product_related_list[] = $r;
         }
      
    $related_records null;
         
    $smarty->assign("product_related_list"$product_related_list);
      
    /* end patch */
     
  6. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    тут отлаживать надо)
    t1.IF(LENGTH(`name_ua`), `name_ua`, `name_ru`) AS `name`,

    Это чтото не то. Тупое решение которое может грозить багами удали тут t1
    IF(LENGTH(`name_ua`), `name_ua`, `name_ru`) AS `name`
     
  7. Grunuk

    Grunuk

    Регистр.:
    19 янв 2008
    Сообщения:
    187
    Симпатии:
    6
    да нет, 15 значений t1 в коде...! это что то не то... скрипт работает, как только переключаюсь на укр вариант магазина, сразу слетает!
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Либо, как сказали выше убирай t1, либо правь метод LanguagesManager::sql_prepareField(), чтобы ему алиас таблицы можно было передавать и передавай t1
     
  9. Grunuk

    Grunuk

    Регистр.:
    19 янв 2008
    Сообщения:
    187
    Симпатии:
    6
    Да, спасибо за помощь, так и думали что ошибка в неправильно составленном запросе к базе с учетом языков! Исправили, залили, все гуд теперь!)
    Но правда очень много товаров с укр версии выпало с индекса, вот это жаль уже((( ошибку просто никто не замечал, все пользовались стандартным языком магазина...
     
  10. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Для этого есть функции задающие пользовательский обработчик исключений:
    PHP:
    set_exception_handler(array($this,'handleException'));
    set_error_handler(array($this,'handleError'),error_reporting());
    Реализации функций тут:
    https://github.com/yiisoft/yii/blob/master/framework/base/CApplication.php#L714
    https://github.com/yiisoft/yii/blob/master/framework/base/CApplication.php#L785

    У нас в магазине все ошибки идут на почту главным разработчикам, рекомендую воспользоваться таким хаком и вам :)