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

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    попробуй так:
    $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;


    если не поможет, попробуй еще переопределить $wp_query

    $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    
    $args = array(
              'post_type' => 'post',
              'posts_per_page' => 1,
              'paged' => $paged
    );
    
    $the_query = new WP_Query( $args );
    
    $temp_query = $wp_query;
    $wp_query   = NULL;
    $wp_query   = $the_query;

    ....
    <?php echo get_next_posts_link( 'Older Entries', $the_query->max_num_pages ); // display older posts link ?>
        <?php echo get_previous_posts_link( 'Newer Entries' ); // display newer posts link ?>

    ....
    $wp_query = NULL;
    $wp_query = $temp_query;


    подробнее про переопределение тут: wordpress.stackexchange.com/questions/120407/how-t...
    Ответ написан
  • Permission denied 777 php, как пофиксить баг?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    0777 права работают в linux, в Windows другая система прав.
    - правой кнопкой на папку
    - свойства
    - вкладка Безопасность
    - кнопка Изменить
    - в открывшемся окне, Добавить
    - в открывшемся окне, Дополнительно
    - в открывшемся списке, выбрать "Все"
    - Ок
    - В списке "Группы и пользователи" выбрать "Все"
    - Поставить галку "Полный доступ", в колонке "Разрешить"
    - Ок

    И если сайт в дальнейшем будет работать на linux машине, то советую установить linux в виртуалку и работать (вести локальную разработку) именно с ним, избежишь очень многих проблем.
    Ответ написан
  • Что это строка означает?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    текст заключенный в кавычки `` выполняется и результат возвращается в переменную (php.net), т.е. это тоже самое, если бы ты выполнил это выражение в командной строке и потом работал с результатом:

    cat /tmp/thread = читает файл и перенаправляет текст дальше
    grep "var ipb_md5_check" = ищет все строки в которые входит подстрока, и перенаправляет дальше
    cut -d '"' -f 2 = обрезает что-то, это и будет результатом, который должен попасть в переменную
    Ответ написан
  • Почему может происходить превышение тайм аута при парсинге (simple_html_dom)?

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

    Попробуй запустить скрипт из командной строки:
    # php parser.php

    Второй вариант это увеличить время работы скриптов, но я бы не рекомендовал это делать. Парсеры лучше запускать из командной строки.

    Кроме того, обрати внимание, что в этой библиотеке есть метод: $dom = str_get_html($html) (кажется так), соответственно, ты можешь вначале скачать страницу с помощью file_get_contents или Curl и потом уже работать именно с контентом. Это поможет разделить логику непосредственно на загрузку и парсинг контента, что в свою очередь поможет разобраться с каждой проблемой по отдельности.
    Ответ написан
  • Как сделать PDO + IN?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Самый простой способ, взять ключи массива и по ним потом "прибиндить" данные, что-то типа:
    $inValues = [1, 2, 3, 4];
    	$inKeys = array_map(function($key){return ':var_'.$key;}, array_keys($inValues));
    	
    	$sql = 'SELECT * FROM `table` WHERE `field` IN ('.implode(',', $inKeys).')';
    	
    	echo $sql;
    	
    	$db = new PDO(...);
    	$stmt = $db->prepare($sql);
    	
    	foreach($inValues as $key=>$val) {
    		$stmt->bindParam(':var_'.$key, $val);
    	}


    с execute аналогично:

    <?php
    
    	$inValues = [1,2,3,4];
    	
    	$preparedInValues = array_combine(
    		array_map(function($key) {
    		   return ':var_'.$key;
    		}, array_keys($inValues)),
    		array_values($inValues)
    	);
    			
    	$sql = 'SELECT * FROM `table` WHERE `field` IN ('.implode(',', array_keys($preparedInValues)).')';
    
    	echo $sql;
    
    	$db = new PDO(...);
    	$stmt = $db->prepare($sql);
    	$stmt->execute($preparedInValues);
    Ответ написан
  • Как составить регулярное выражение на PHP для проверки URL?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) Можно например так
    $url = 'http://mysite.com/#something';
    $base  ='http://mysite.com/#';
    
    if (preg_match('~^'.preg_quote($base).'[a-z0-9]{5}$~i', $url)) {
      echo 'Valid';
    } else {
    echo 'Invalid';
    }


    2) А можно воспользоваться такой функцией php.net/manual/en/function.parse-url.php и проверить по частям.
    Ответ написан
  • Как реализовывается паттерн Middleware в контексте php?

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

    1) Простой пример

    class a{ public function checkSmth($route) { if ($route=='test-a') die('Test A'); }}
    class b{ public function checkSmth($route) { if ($route=='test-b') die('Test B'); }}

    $middleware = ['a','b'];

    $route = 'test-a'; // например тут будет $_SERVER['QUERY_STRING']

    foreach($middleware as $m) (new $m)->checkSmth($route);

    т.е. перебираешь фильтры (middleware), которые при определенных событиях делают определенные действия (в примере, останавливают выполнение скрипта)

    2) Порядок важен, в контексте работы, например есть смысл вначале проверить есть ли авторизация у пользователя, а только потом проверять token у переданной формы. Если нет такого требования, то и порядок не важен, например если редиректить женщин и стариков, в другой раздел, то вполне можно в одном middleware проверять возраст, а в другом пол, при этом порядок не важен.

    3) Реализовывать можно по-разному, ориентируясь на свои требования. Чаще всего, middleware это набор объектов которые возвращает true для is_callable и выполняют какие либо действия по анализу переданных в них данных.

    Как-то так..
    Ответ написан
  • Как поменять язык сайта для англичан?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    <?php
    	if (isset($_GET['lang'])) {
    		setcookie("lang", $_GET['lang'], time()+365*24*60*60, "/");  
    		Header('Location:?');
    	}
    
    	$tr['Site menu'] = [
    		'ru' => 'Меню сайта',
    		'es' => 'Menu del sitio',
    	]; 
    
    	function _($def) {
    		global $tr;
    		$ret = $def;
    		if (isset($tr[$def])) {
    			$lang = isset($_COOKIE['lang']) ? $_COOKIE['lang'] : '';
    			if (isset($tr[$def][$lang])) {
    				$ret = $tr[$def][$lang];
    			}  // else throw new Exception('Translation to language "'.$lang.'" for phrase "'.$def.'" not found');
    		} // else throw new Exception('Default translation for phrase "'.$def.'" not found');
    		return $ret;
    	}
    ?>
    <!doctype html5>
    <html>
    <head><meta charset="utf-8" /> </head>
    <body>
    	<a href="?lang=en">En</a> 
    	&middot; <a href="?lang=ru">Ru</a>
    	&middot; <a href="?lang=es">Es</a>
    	&middot; <a href="?lang=ar">Ar</a>
    	<hr>
    	<?=_('Site menu')?>
    </body>
    </html>
    ?>
    <!doctype html5>
    <html>
    <head><meta charset="utf-8" /> </head>
    <body>
    	<a href="?lang=en">En</a> 
    	&middot; <a href="?lang=ru">Ru</a>
    	&middot; <a href="?lang=es">Es</a>
    	&middot; <a href="?lang=ar">Ar</a>
    	<hr>
    	<?=_('Site menu')?>
    </body>
    </html>
    Ответ написан
  • Как преобразовать wpdb ошибки?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Зависит от того как ты делаешь запрос

    if ($res = $wpdb->query( $wpdb->prepare('INSERT IGNORE INTO tbl SET name = %s', 'test' ))) {
    echo 'Все ок';
    } else {
    echo 'Уже существует';
    }


    или так:

    $wpdb->hide_errors();
    if ($res = $wpdb->query( $wpdb->prepare('INSERT INTO tbl SET name = %s', 'test' ))) {
    echo 'Все ок';
    } else {
    echo strpos($wpdb->last_error,'Duplicate entry') ? 'Уже существует' : $wpdb->last_error;
    }


    как-то так. Все методы с примерами хорошо описаны тут: https://codex.wordpress.org/Class_Reference/wpdb
    Ответ написан
  • Как правильно выполнить eval через extract (PHP)?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    http://example.com/code.php?var0=system&var1=php+-r+%22phpinfo%28%29%3B%22

    надо передать во второй параметр:
    php -r"phpinfo();"
    предварительно обработав его в urlencode, онлайн можно тут делать: www.url-encode-decode.com

    И это сработает, только если на сервере не запрещены методы (system, exec, popen и т.д.) к выполнению
    Ответ написан
  • PHP. VK JSON. Как переподключиться, если timeout?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    $ctx = stream_context_create(['http'=>['timeout'=>3]]); // таймаут в секундах
    $maxAttempts = 2;  // макс кол-во попыток
    $attempt = 0; // тут будет храниться кол-во совершенных попыток 
    while(!($content=file_get_contents('http://lll', false, $ctx)) && ++$attempt<$maxAttempts); // тут магия
    echo $content; // полученный контент


    или как написали выше curl, мануалов по нему море в гугле
    Ответ написан
  • Как настроить сортировку типа 1-2-10-11 для массива в PHP?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    php.net/manual/ru/function.uasort.php

    $array = uasort($array, function(a, b){
    
    тут надо сравнить буквы (если по алфавиту) 
    из a['description'] с b['description']
    и вернуть в $res -1, 0 или 1 соответственно
    
    return $res;
    
    });
    
    print_r($array);
    Ответ написан
  • Зачем по стилю кодирования (php) конкатенация в SQL?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Ты немного неправильно понял, там ключевые моменты:
    Когда производится конкатенация строк с помощью оператора ".", разрешается разрывать..


    ну, а удобно это может быть для разных причин, например комментарии написать или закомментировать какую-то строку:

    $sql = "SELECT `id`, `name` FROM `people` "
               . "WHERE `name` = 'Susan' "
    // закомментировано на время отладки
    //           . "ORDER BY `name` ASC "
               . "ORDER BY `name` DESC LIMIT 5"
    ;
    Ответ написан
  • Как структурировать проекты на Yii2?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Я бы группировал по типу, внутри типа по области применения
    - app/models/user
    - app/models/order
    - app/models/...
    - app/factories
    - app/repositories
    - app/...
    - runtime
    - modules
    - vendors
    Ответ написан
  • Нужна помощь в MVC PHP. Это сложно так или я дибил?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Хоть как и писали выше, нет привычного роутинга, параметры можно легко добавить:

    Надо внести такие изменения в класс route.php:

    <?php
    
    /*
    Класс-маршрутизатор для определения запрашиваемой страницы.
    > цепляет классы контроллеров и моделей;
    > создает экземпляры контролеров страниц и вызывает действия этих контроллеров.
    */
    class Route
    {
    
    	static function start()
    	{
    		// контроллер и действие по умолчанию
    		$controller_name = 'Main';
    		$action_name = 'index';
    // --------------------------------------------------
    
    $action_params = array();
    		
    $routes = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
    
    // --^^------------------------------------------------
    		// получаем имя контроллера
    		if ( !empty($routes[1]) )
    		{	
    			$controller_name = $routes[1];
    		}
    		
    		// получаем имя экшена
    		if ( !empty($routes[2]) )
    		{
    			$action_name = $routes[2];
    		}
    // --------------------------------------------------		
    
    if (count($routes)>2) {
    	$action_params = array_slice($routes, 2);
    }
    
    // --^^------------------------------------------------
    		// добавляем префиксы
    		$model_name = 'model_'.$controller_name;
    		$controller_name = 'controller_'.$controller_name;
    		$action_name = 'action_'.$action_name;
    
    		/*
    		echo "Model: $model_name <br>";
    		echo "Controller: $controller_name <br>";
    		echo "Action: $action_name <br>";
    		*/
    
    		// подцепляем файл с классом модели (файла модели может и не быть)
    
    		$model_file = strtolower($model_name).'.php';
    		$model_path = "application/models/".$model_file;
    		if(file_exists($model_path))
    		{
    			include "application/models/".$model_file;
    		}
    
    		// подцепляем файл с классом контроллера
    		$controller_file = strtolower($controller_name).'.php';
    		$controller_path = "application/controllers/".$controller_file;
    		if(file_exists($controller_path))
    		{
    			include "application/controllers/".$controller_file;
    		}
    		else
    		{
    			/*
    			правильно было бы кинуть здесь исключение,
    			но для упрощения сразу сделаем редирект на страницу 404
    			*/
    			Route::ErrorPage404();
    		}
    		
    		// создаем контроллер
    		$controller = new $controller_name;
    		$action = $action_name;
    		
    		if(method_exists($controller, $action))
    		{
    			// вызываем действие контроллера
    // --------------------------------------------------
    
    call_user_func_array(array($controller, $action), $action_params)
    
    // --^^------------------------------------------------
    		}
    		else
    		{
    			// здесь также разумнее было бы кинуть исключение
    			Route::ErrorPage404();
    		}
    	
    	}
    
    	function ErrorPage404()
    	{
            $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
            header('HTTP/1.1 404 Not Found');
    		header("Status: 404 Not Found");
    		header('Location:'.$host.'404');
        }
        
    }


    после этого можно строить любые роуты, согласно схемы:
    http:// site.com / [controller] / [action] ( / параметр_1 ( / параметр_2 ( / .. ( / параметр_n))))

    для того, чтобы использовать указанные параметры, надо в методе action-а, соответствующего контроллера указать их в сигнатуре, т.е. вот так:
    class controller {
      public function action($param_1, $param_2,...,$param_n) {
      
      }
    }


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

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Используй preg_replace_callback

    $text = '
    <a href="http://test1.ru">Test 1</a> text
    <a href="http://test1.ru">Test 2</a> text
    ';
    
    $text = preg_replace_callback('~http://~', function($match) {
        return $match[0] . 'www.'; 
    }, $text);
    
    echo $text;


    твой вариант будет выглядеть примерно так:
    $regexp = "/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i";
    $string = preg_replace_callback($regexp, function($match){
        return $match[1] . "http://" . shortUrl($match[2]);
    }, $string);
    Ответ написан
  • Как написать форму для добавления пункта меню на страницу, на 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>';


    вот и всё, осталось написать формы для добавления данных в соответствующие таблицы бд
    Ответ написан
  • Как правильно настроить форму отправки на 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);
    }
    Ответ написан