Ответы пользователя по тегу PHP
  • Не получаеться правильно спарсить с PHP Simple Dom Parser?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Не лучший источник для парсинга, но можно сделать например так:
    <?php
    	include 'simple_html_dom.php';
    	
    	$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
    	$cacheFile = dirname(__FILE__).'/'.md5($url);
    	
    	if (!file_exists($cacheFile)) {
    		if ($html = file_get_contents($url)) {
    			file_put_contents($cacheFile, $html);
    		} else die('Can\'t get html');
    	} else {
    		$html = file_get_contents($cacheFile);
    	}
    	
    	$items = [];
    	$dom = str_get_html($html);
    	if ($domElements = $dom->find('div.covGroupBoxContent')){
    		foreach($domElements as $domBox) {
    			if (!strpos($domBox->plaintext, 'Key stats')) continue;
    			if ($domBoxElements = $domBox->find('div.covSmallHeadline')) {
    				$item = [];
    				foreach($domBoxElements as $k=>$element) {
    					if (!$k) continue;
    					$item[] = $element->plaintext;
    					if ($k%2==0) {
    						$items[] = $item;
    						$item = [];
    					}
    				}
    			}
    		}
    	}
    	
    	echo '<pre>';
    	print_r($items);
    	echo '</pre>';


    результат:

    Array
    (
        [0] => Array
            (
                [0] => Maps played
                [1] => 539
            )
    
        [1] => Array
            (
                [0] => Wins / draws / losses
                [1] => 363 / 8 / 168
            )
    
        [2] => Array
            (
                [0] => Total kills
                [1] => 50715
            )
    
        [3] => Array
            (
                [0] => Total deaths
                [1] => 45101
            )
    
        [4] => Array
            (
                [0] => Rounds played
                [1] => 14083
            )
    
        [5] => Array
            (
                [0] => K/D Ratio
                [1] => 1.12
            )
    
        [6] => Array
            (
                [0] => Best player (Average rating)
                [1] => olofmeister (1.15)
            )
    )


    P.S. Кусок с кешированием только не забудь убрать, он нужен только на время отладки, чтобы ускорить процесс и не дергать внешний сервер.
    Ответ написан
  • Нет подключения к базе данных?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    тут тоже похоже ошибка:

    "SET NAME 'utf8'".DB_CHAR

    должно быть

    "SET NAMES '".DB_CHAR."'"
    Ответ написан
  • Почему не срабатывает запрос PDO?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Привет,

    открой консоль браузера ( F12 ), и посмотри ответ от PHP скрипта. Что там в ответе?
    Ответ написан
  • Как сделать мульти-фильтр для таблицы HTML?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Говнокодить, так говнокодить. Используй в фильтрах регулярные выражения, например: E[\s\S]+active :)

    А если серьезно, то алгоритм такой:
    1) Делишь по разделителю(,) на два выражения: EUR, Active
    2) Сравниваешь с значениями столбцов участвующими в поиске
    Ответ написан
  • Проблема с explode и in_array в PHP, почему может не работать?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    вот это:

    Потом вызываю
    $newsCategory = explode( ',' , $newsCategory );

    замени на:

    if (is_array($newsCategory)) die('Интересно зачем я в explode передаю массив, вместо строки вторым параметром?');
    $newsCategory = explode( ',' , $newsCategory );
    Ответ написан
  • Объясните php скрипт?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    тому кто это написал, стоит прострелить колено..

    вот код с комментариями о происходящем
    $inputArr = file('input', FILE_SKIP_EMPTY_LINES); // читаем из файла все данные
    $outputArr = []; // пустой выходной массив
    
    foreach ($inputArr as $line) { // читаем построчно входные данные
    	list($ip, $mask) = explode('/', trim($line)); // разбиваем строку на $ip и $mask, по разделителю '/'
    	$ipAsLongInt = ip2long($ip); // Преобразуем ip адрес в десятичное число
    	$ipAsBinary = decbin($ipAsLongInt); // Преобразуем число в бинарное число
    	$ipAsBinaryWithCorrectLength = str_pad($ipAsBinary, 32, 0, STR_PAD_LEFT); // дополняем слева нулями до длинны 32 символа
    	$outputLine = substr($ipAsBinaryWithCorrectLength, 0, $mask); // Копируем из строки только первые $mask символов
    	$outputArr[] = $outputLine;
    }
    
    $outputRaw = join(PHP_EOL, $outputArr); // Соединяем все строки из массива символом перевода строки
    file_put_contents('output', $outputRaw); // Записываем данные в выходной файл


    И ответ: да, этот код делает то, что надо
    Ответ написан
  • Как вывести заголовок и текст?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Как уже ответили выше, надо воспользоваться циклом. Хотелось бы добавить пару рекомендаций:
    1) Не стоит использовать ф-ции семейства mysql_, они устарели. Вместо них надо использовать mysqli_ или PDO
    2) Не стоит смешивать модель данных и работу с базой данных, получится много дублирования кода, т.е. лучше твой класс разделить на два, что-то вроде:

    class Sql {
    
    	private $connectionData = [];
    
    	public function __construct(array $connectionData) {
    		$this->$connectionData = $connectionData;
    	}
    	
    	public function connect(){
    		$ret = false;
    		$dbLink = mysql_connect(
    			$this->connectionData['host'], 
    			$this->connectionData['username'], 
    			$this->connectionData['password']
    		);
    		if (mysql_select_db($this->connectionData['dbname'])) {
    			$ret = $dbLink;
    		}
    		return $ret;
    	}
    	
    	public function get_results($sql) {
    		$ret = false;
    		$results = mysql_query($sql);
    		if (mysql_num_rows($results)) {
    			$ret = [];
    			while ($row = mysql_fetch_assoc($results)) {
    				$ret[] = $row;
    			}
    		}
    		return $ret;
    	}	
    }
    
    class ArticlesModel {
    	private $dbLink = null;
    	
    	public function __construct($dbLink) {
    		$this->dbLink = $dbLink;
    	}
    	
    	public function getAll(){
    		return $this->dbLink->get_results('SELECT * FROM `articles`');
    	}
    }
    
    $connectionData = [
    	'host' => 'localhost',
    	'username' => 'mysql',
    	'pass' => 'mysql',
    	'dbname' => 'mysite',
    ];
    
    $dbLink = (new Sql($connectionData))->connect();
    if (!$dbLink) trigger_error("Can't connect to DB", E_USER_ERROR);
    
    $articlesModel = new ArticlesModel($dbLink);
    if (!$articlesModel) trigger_error("Can't create articles model", E_USER_ERROR);
    
    if ($articles = $articlesModel->getAll()) {
    	foreach ($articles as $article) {
    		echo '<h2>'.$article['title'].'</h2>';
    		echo '<p> '.$article['text'].'</p>';
    		echo '<hr />';
    	}
    }


    Разумеется это не идеальный, простой пример разделения логики, чтобы тебе было понятно как это работает
    Ответ написан
  • Как решить проблему с устаревшими функциями session_is_registered, session_unregister?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    В гугле по запросу "session_is_registered php 5.4"
    function fix_session_register(){
         function session_register(){
             $args = func_get_args();
             foreach ($args as $key){
                $_SESSION[$key]=$GLOBALS[$key];
            }
        }
     
        function session_is_registered($key){
             return isset($_SESSION[$key]); 
        }
     
        function session_unregister($key){
            unset($_SESSION[$key]);
        }
    }
     
    if (!function_exists('session_register')) fix_session_register();
    Ответ написан
  • Как парсить теги?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Надо смотреть на нагрузку и скорость работы остального, если все остальное очень быстро, тогда можно словарь использовать. В противном случае можно и базу подергать, если с настройками базы все ок, то она и так закеширует частые запросы. Если это уник значения и будет уникальный индекс, то выборка не составит труда, если вдруг будет много-много данных, то можно создать memory table и дергать оттуда, ну или использовать любой дополнительный кеширующий механизм... В любом случае, я думаю что скорость обработки тегов как и сам парсинг не будет горлышком бутылки.. Основной тормоз будет на загрузке страниц.
    Ответ написан
  • Как увеличить время загрузки страницы?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) увеличить время выполнения скрипта (в настройках веб-сервера, погуглить можно например так "время выполнения php скрипта nginx/apache"). Не очень хороший способ.

    2) страница должна загружаться, потом с помощью ajax устанавливаются флаги "запуск/остановка". Скрипт на сервере запускается кроном каждую минуту и проверяет флаги, если стоит запуск и с скрипт еще не работает, то он запускается. Дальше запущенный на сервере скрипт пишет свой статус, который открытая страница читает и выводит на твою страницу. Флаги и статус, можно хранить в файлах или бд

    3) похож на 2, только для соединения используется не ajax а websockets, при этом после запуска скрипта он может напрямую моментально отдавать ответ на страницу
    Ответ написан