Ответы пользователя по тегу PHP
  • Как написать форму для добавления пункта меню на страницу, на php?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Не самая простая задача для новичка, давай разберем по порядку что тебе надо сделать.
    1) тебе надо как-то хранить список категорий и их ссылок
    2) тебе надо получить структуру меню в переменную
    3) тебе надо построить само меню

    Я исхожу из того, что хранить информацию о меню ты будешь в базе.

    Пусть в базе будет две таблицы:
    menu_category
    ~~~~~~~
    id
    name
    order
    
    menu_items
    ~~~~~~~~~~~
    id
    menu_category_id
    name
    url
    order

    дальше, ты примерно вот таким запросом получаешь все пункты меню
    SELECT 
    	`c`.`id` as `id`,
    	`c`.`name` as `name`,
    	`i`.`id` as `item_id`,
    	`i`.`name` as `item_name`,	
    	`i`.`url` as `item_url`
    FROM `menu_category` as `c` 
    LEFT JOIN `menu_items` as `i` ON `i`.`menu_category_id`=`c`.`id` 
    ORDER BY `c`.`order`, `i`.`order`

    теперь группируем результаты по id категории тем самым получая удобную структуру для формирования меню
    $menu = [];
    foreach ($results as $res) {
    	$menu[$res['id']]['name'] = $res['name'];
    	$menu[$res['id']]['items'][] = [
    		'name' => $res['item_name'],
    		'url' => $res['item_url'],
    	]
    }

    в результате имеем массив с такой структурой:
    [1]=>[
    	'name' => 'Категория 1',
    	'items' => [
    		['name'=>'Ссылка 11', 'url'=>'http://site11.ru'],
    		['name'=>'Ссылка 12', 'url'=>'http://site12.ru'],	
    	]
    ],
    [2]=>[
    	'name' => 'Категория 2',
    	'items' => [
    		['name'=>'Ссылка 21', 'url'=>'http://site21.ru'],
    		['name'=>'Ссылка 22', 'url'=>'http://site22.ru'],	
    	]
    ],

    теперь осталось все это вывести, используем такой код
    echo '<ul>';
    foreach($menu as $catId=>$cat) {
    	echo '<li>'.$cat['name'];
    	if (isset($cat['items'])) {
    		echo '<ul>';
    		foreach($cat['items'] as $item) {
    			echo '<li><a href="'.$item['url'].'">'.$item['name'].'</a></li>';
    		}
    		echo '</ul>';
    	}
    	echo '</li>';
    }
    echo '</ul>';


    вот и всё, осталось написать формы для добавления данных в соответствующие таблицы бд
    Ответ написан
    7 комментариев
  • Как правильно настроить форму отправки на e-mail?

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

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    $start = new DateTime('01.08.2014');
    $end = new DateTime('30.08.2015 23:59');
    $interval = new DateInterval('P1D');
    $dateRange = new DatePeriod($start, $interval, $end);
    
    $weekNumber = 1;
    $weeks = array();
    foreach ($dateRange as $date) {
    	$weeks[$weekNumber][] = $date->format('Y-m-d');
    	if ($date->format('w') == 0) {
    		$weekNumber++;
    	}
    }
    
    echo '<pre>';
    print_r($weeks);
    echo '</pre>';
    Ответ написан
    Комментировать
  • Как с помощью SWITCH выбрать ФУНКЦИЮ?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    $func = 'trim';
    if (function_exists($func)) echo call_user_func($func,' Test ');


    или твой пример

    $_POST['function'] = 'trim';
    $array = [' a', 'b '];
    $allowedFunctions = ['trim'];
    
    if (function_exists($_POST['function']) && in_array($_POST['function'], $allowedFunctions)) {
        $results = array_map($_POST['function'], $array);
        print_r($results);
    }
    Ответ написан
    Комментировать
  • Не получаеться правильно спарсить с 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. Кусок с кешированием только не забудь убрать, он нужен только на время отладки, чтобы ускорить процесс и не дергать внешний сервер.
    Ответ написан
    2 комментария
  • Нет подключения к базе данных?

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

    "SET NAME 'utf8'".DB_CHAR

    должно быть

    "SET NAMES '".DB_CHAR."'"
    Ответ написан
    1 комментарий
  • Почему не срабатывает запрос 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 );
    Ответ написан
    9 комментариев
  • Объясните 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); // Записываем данные в выходной файл


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

    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 />';
    	}
    }


    Разумеется это не идеальный, простой пример разделения логики, чтобы тебе было понятно как это работает
    Ответ написан
    6 комментариев
  • Как решить проблему с устаревшими функциями 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, при этом после запуска скрипта он может напрямую моментально отдавать ответ на страницу
    Ответ написан
    Комментировать