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

bork75

The Team
Регистрация
21 Июн 2008
Сообщения
1.455
Реакции
734
Взял пример парсера с сайта Для просмотра ссылки Войди или Зарегистрируйся и сделал из него парсер с двумя шагами.
- Первый шаг - это забираю с одной страницы url адрес
- Второй шаг - подставляю этот адрес во вторую часть кода и парсю уже нужное на этой странице.

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

// Параметры курла
curl_setopt($ch, CURLOPT_USERAGENT, 'IE20');
curl_setopt($ch, CURLOPT_HEADER, 0);
// Следующая опция необходима для того, чтобы функция curl_exec() возвращала значение а не выводила содержимое переменной на экран
curl_setopt($ch, CURLOPT_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($ch, CURLOPT_USERAGENT, 'IE20');
curl_setopt($ch, CURLOPT_HEADER, 0);
// Следующая опция необходима для того, чтобы функция curl_exec() возвращала значение а не выводила содержимое переменной на экран
curl_setopt($ch, CURLOPT_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 и т.п.
Скрипт обращается на разные страницы одного сайта.
Может нужно что-то убрать или так всё оставить?
 
просто дублирующий функционал вынеси в функцию
function getUrl($url){
$ch = curl_init($url);


и вызывай $text = getUrl('http//sait.ru'.$links[0]);
 
просто дублирующий функционал вынеси в функцию
function getUrl($url){
$ch = curl_init($url);


и вызывай $text = getUrl('http//sait.ru'.$links[0]);
Смысл понятен, но всё равно буду сомневаться в правильности написания, если не сложно, напиши мой код с исправлениями.
 
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_handle, CURLOPT_URL, $url);
    curl_setopt($curl_handle, CURLOPT_USERAGENT, $ua);
    curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl_handle, CURLOPT_HEADER, false);
    $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];
?>
 
Проверьте пожалуйста и мой код, если переключаюсь на укр вариант магазина на странице товара, выдает ошибку:

Код:
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'] > 5 ? $a['Price'] - 5 : 1,
  'priceMinTo' => $a['Price'] > 5 ? $a['Price'] - 2 : 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($r, true);
  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 */
 
тут отлаживать надо)
t1.IF(LENGTH(`name_ua`), `name_ua`, `name_ru`) AS `name`,

Это чтото не то. Тупое решение которое может грозить багами удали тут t1
IF(LENGTH(`name_ua`), `name_ua`, `name_ru`) AS `name`
 
да нет, 15 значений t1 в коде...! это что то не то... скрипт работает, как только переключаюсь на укр вариант магазина, сразу слетает!
 
да нет, 15 значений t1 в коде...! это что то не то... скрипт работает, как только переключаюсь на укр вариант магазина, сразу слетает!

Либо, как сказали выше убирай t1, либо правь метод LanguagesManager::sql_prepareField(), чтобы ему алиас таблицы можно было передавать и передавай t1
 
Да, спасибо за помощь, так и думали что ошибка в неправильно составленном запросе к базе с учетом языков! Исправили, залили, все гуд теперь!)
Но правда очень много товаров с укр версии выпало с индекса, вот это жаль уже((( ошибку просто никто не замечал, все пользовались стандартным языком магазина...
 
ошибку просто никто не замечал, все пользовались стандартным языком магазина...
Для этого есть функции задающие пользовательский обработчик исключений:
PHP:
set_exception_handler(array($this,'handleException'));
set_error_handler(array($this,'handleError'),error_reporting());
Реализации функций тут:
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

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