Ответы пользователя по тегу PHP
  • Хостинг + php captcha не отображается. Что делать?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Нажми на картинке правой кнопкой и открой в новом окне.
    Дальше, либо можешь нажать "Сохранить как" и открыть файл в блокноте, либо в скрипте временно закомментировать:
    ...
    header ("Content-type: image/gif"); //выводим готовую картинку
    imagegif($src);

    и обновить страницу

    Так ты увидишь сообщение об ошибке и сможешь разобраться в чем причина.
    Ответ написан
    3 комментария
  • Как защитить денежный баланс на сайте от накрутки?

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

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    <?php
        $in = [[1,2], [3,4]];
        $out = [];
        array_walk_recursive($in, function($in) use (&$out) { $out[] = $in; });
        print_r($out);
    Ответ написан
    1 комментарий
  • Симлинк на под папку?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Проверь FollowSymLinks в случае apache-а
    Создай жесткую ссылку на папку
    Ответ написан
  • Как сделать пагинацию в 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...
    Ответ написан
    1 комментарий
  • 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);
    Ответ написан
    5 комментариев
  • Как составить регулярное выражение на 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 и проверить по частям.
    Ответ написан
    1 комментарий
  • Как реализовывается паттерн 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 комментарий
  • Как настроить сортировку типа 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);
    Ответ написан
    1 комментарий
  • Зачем по стилю кодирования (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
    Ответ написан
    1 комментарий
  • Нужна помощь в 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);
    Ответ написан