Ответы пользователя по тегу PHP
  • Как добавить проверку кода 404 при скачивании файла через php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    При выполнении file_get_contents() заполняется специальная переменная $http_response_header – это массив, заполненный строками заголовков ответа сервера. Самая первая – что-то типа "HTTP/1.1 200 OK" в случае найденного файла или "HTTP/1.1 404 Not Found"

    Вытащить оттуда код статуса можно регулярным выражением:
    if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$http_response_header[0], $matches ) )
      $reponse_code = intval($matches[1]);
    else $response_code = 0; // не получилось узнать код ответа че-т


    А вообще для веб-запросов удобнее пользоваться cURL
    примерно так
    function getAndSaveFile($url, $path, $fileName = false) {
        // открываем содержимое файла
        $file = @file_get_contents($url);
        // если не удалось получить файл вернем false
        if(!$file) return false;
    
        // получаем имя файла, если не задано, то берем из урла
        if(!$fileName) $fileName = basename($url);
        
        // файл для записи результата
        $fp = fopen($fileName, 'w');
    
        // подготавливаем cURL
        $ch = curl_init();
        curl_setopt_array($ch, array(
    	    CURLOPT_URL => $url,
    	    CURLOPT_FILE => $fp,
    	    CURLOPT_FOLLOWLOCATION => true,
    	    CURLOPT_TIMEOUT => 100,
        ));
    
    	// выполняем запрос
    	curl_exec($ch);
    	
    	// проверяем статус
    	if (curl_errno($ch)) { // какая-то ошибка, таймаут?
    		// закрываем cURL и файл
    		curl_close($ch);
    		fclose($fp);
    		return false;
    	} else {
    		$status_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    		if( $status_code !== "200") {
    			// закрываем cURL и файл
    			curl_close($ch);
    			fclose($fp);
    			unlink($fileName);
    			return false;
    		}
    		
    		return true;
    	}
    }
    Ответ написан
  • Фреймворк, макро-Фреймворк для разработки портала?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Не надо писать самому «авторизацию и прочие вещи». Для этого и есть фреймворки и модули.

    Порекомендую Laravel. Он не сложный и очень продуманный, «правильный».
    Ответ написан
    Комментировать
  • Можно ли занести несколько значений в переменную в данном php-скрипте?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    wall.post() публикует единственную запись.

    Для промышленных масштабов спама ускорения есть вариант с методом execute(), в который можно обернуть до 25 вызовов АПИ ВКонтакте.

    Т.е. вы на сервере собираете в строку некий код, похожий на JavaScript, что-то типа:
    var params = {
      "message": "Текст поста",
      "from_group": 0,
    };
    var out = { "result": [] };
    
    params.owner_id = 10101; // первая группа
    params.guid = 'abrakadabra';
    out.result.push( API.wall.post(data));
    
    params.owner_id = 20202; // вторая группа
    params.guid = 'drugayaabrakadabra';
    out.result.push( API.wall.post(data));
    // ...
    params.owner_id = 2500025; // 25-я группа
    params.guid = 'uniqueabrakadabra';
    out.result.push( API.wall.post(data));
    
    return out;


    И этот код как текст отправляете параметром code в методе execute()
    Ответ написан
    2 комментария
  • Нужно ли как-то обрабатывать данные из GET запросов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо ли что-то делать с входными данными зависит от того, что с ними дальше делаете.

    Вставляете прямо в сборку строки SQL-запроса? (НЕ надо так делать!)
    Показываете пользователю в теле страницы? (Надо фильтровать)

    Есть готовые функции для валидации и фильтрации входных данных:

    filter_input()

    Например:
    $query = filter_input(
      INPUT_GET,
      'q',
      FILTER_SANITIZE_STRING,
      FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK
    );


    См. подробнее Очищающие фильтры.
    Ответ написан
    Комментировать
  • Как правильно посчитать количество одинаковых значений в массиве сохранить их число, и удалить их?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Я бы сделал с промежуточным массивом, где ключи – встреченные значения user:
    function mergeCount($arr) {
    
    	$keys = [];
    	foreach($arr as $item) {
    		$id = $item['id'];
    		$user = $item['user'];
    
    		if( isset( $keys[ $user])) {
    			$keys[ $user]['count']++;
    		} else {
    			$keys[$user] = [
    				'id' => $id,
    				'count' => 1
    			];
    		}
    	}
    	
    	$result = [];
    	foreach($keys as $user=>$item) {
    		$result[] = [
    			'id' => $item['count'] > 1 ? $item['count'] : $item['id'],
    			'user' => $user
    		];
    	}
    	
    	return $result;
    }

    Тест
    $data = [
    	['id'=>367, 'user'=>'text'],
    	['id'=>370, 'user'=>'text'],
    	['id'=>432, 'user'=>'text1'],
    	['id'=>234, 'user'=>'text33'],
    	['id'=>264, 'user'=>'text33'],
    ];	
    $a = mergeCount($data);
    print_r($a);
    Результат теста
    Array
    (
        [0] => Array
            (
                [id] => 2
                [user] => text
            )
    
        [1] => Array
            (
                [id] => 432
                [user] => text1
            )
    
        [2] => Array
            (
                [id] => 2
                [user] => text33
            )
    )
    Ответ написан
    1 комментарий
  • Как обрезать число до первой цифры после запятой больше 0?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. Рассматривать число как строку.
    2. Найти позицию первого не-ноля после десятичной точки.
    3. Взять строку до неё, включительно.
    p.s. решать вступительные / с собеседования / конкурсные задачи самостоятельно.

    Upd. Если точно на вход будут только числа (0..1), можно так:
    substr($n,0,3 + ceil(-log10(abs($n))) - abs(floor($n)) - 1)
    Ответ написан
    1 комментарий
  • VK API: php-скрипт возвращает ошибку. В чем проблема?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    "message" надо с маленькой буквы.

    У вас сейчас "Message" => $text,
    Ответ написан
    Комментировать
  • Что не так с php-скриптом для VK API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Разбирайте ответ от ВК, вполне возможно, что там содержится описание ошибки.

    Вместо
    printf('Success');
    exit;


    надо что-то типа
    $decoded = json_decode($query);
    if(!$decoded) {
      printf("ВК вернул невообразимую фигню: %s", $query);
    }
    else if( $decoded->error) {
      printf("Ошибка %d: %s\n", $decoded->error->error_code, $decoded->error->error_msg);
    } else if( $decoded->response) {
      printf("Пост опубликован с id %s\n", $decoded->response);
    }
    exit();


    Upd. возможно, дело в размещаемом сообщении и сurl. Попробуйте вместо CURLOPT_POSTFIELDS => array( ...
    сделать так:
    CURLOPT_POSTFIELDS     =>  http_build_query( array( ... ))
    Ответ написан
    Комментировать
  • Что лучше использовать для авторизации пользователей cookie или сессии?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сессии чаще всего держатся на cookie: с каждым запросом браузер передает куку с идентификатором сессии, и php вытаскивает из своего хранилища – файлов, Redis, базы данных, как настроете – сессионные данные для этого id.

    Т.е. различие в том, где хранить сами данные сессии: на сервере или на клиенте.

    Всё, что приходит с клиента можно подделать. Поэтому лучше использовать сессии.
    Ответ написан
    3 комментария
  • Как в результат массива foreach добавить число?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Из исходного массива взять только значения ключей, добавить туда $Element, после этого отсортировать и вывести:
    <?php
    $Element = 400;
    $keys = array_keys(
      $arResult['DISPLAY_PROPERTIES']['OTHER_COLORS']['LINK_ELEMENT_VALUE']
    );
    
    array_push($keys, $Element);
    
    sort($keys, SORT_NUMERIC);
    
    foreach($keys AS $intCurColorKey) {
    	echo( $intCurColorKey);
    }
    Ответ написан
    Комментировать
  • Как добавить часть одной страницы PHP в другую?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Изолируйте получение таблицы в отдельный файл / класс / функцию.

    Например:
    Пусть будет функция, на выходе которой html готовой таблицы. Файл getDataFromAPI.php содержит одноименную функцию getDataFromAPI().

    И в index.php и в new.php включайте этот файл:
    require_once('getDataFromAPI.php');
    Получайте html таблицы и вставляйте в нужном месте документа:
    <?php
    $table_html = getDataFromAPI();
    echo $table_html;
    ?>


    Ещё б кэшировать, наверное, хорошо.
    Ответ написан
    Комментировать
  • Как генерировать 5 случайных паролей на php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Ещё одна функция пусть принимает параметром требуемое число паролей и дёргает вашу исходную функцию столько раз:
    function generate_n_passwords($n) {
    	$result = array();
    	while($n--) {
    		array_push( $result, generate_password());
    	}
    	return $result;
    }
    
    $myFivePasswords = generate_n_passwords(5);
    Ответ написан
    Комментировать
  • Где достать либу для склонения слов и приведение их к числу?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если вам просто нужно правильно склонять слова, в зависимости от числа, то это всего несколько строк (на разных ЯП). На PHP:
    /**
     * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
     * param  $number Integer Число на основе которого нужно сформировать окончание
     * param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
     *         например array('яблоко', 'яблока', 'яблок')
     * return String
     */
    function getNumEnding($number, $endingArray)
    {
        $number = $number % 100;
        if ($number>=11 && $number<=19) {
            $ending=$endingArray[2];
        }
        else {
            $i = $number % 10;
            switch ($i)
            {
                case (1): $ending = $endingArray[0]; break;
                case (2):
                case (3):
                case (4): $ending = $endingArray[1]; break;
                default: $ending=$endingArray[2];
            }
        }
        return $ending;
    }
    Ответ написан
    1 комментарий
  • Offline версия веб-сайта?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Может, задача про service worker?

    На Хабре: Web-приложения в режиме offline. ServiceWorker и C...
    Ответ написан
    Комментировать
  • Не корректно работает код, поможете?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Для фильтрации ввода хорошо использовать функцию filter_input().
    Для работы с БД использовать PDO.

    $param = filter_input(INPUT_GET, 'filter', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
    $filters = explode('-', $param);
    
    $banner = $country = NULL;
    $tags = [];
    
    if( count($filters)) {
    	foreach($filters AS $filter) {
    		if( preg_match('/^[0-9\.]+$/', $filter)) { // 1.5.9
    			$banner = $filter;
    		} elseif( preg_match('/^(RU|EN)$/', $filter) { //  RU
    			$country = $filter;
    		} else { // tag
    			array_push($tags, $filter);
    		}
    	}
    }
    
    $conditions = [];
    $params = [];
    if($banner) {
    	array_push($conditions, "`banner` = ?");
    	array_push($params, $banner);
    }
    
    if($country) {
    	array_push($conditions, "`country` = ?");
    	array_push($params, $country);
    }
    
    if(count($tags)) {
    	foreach($tags AS $tag) array_push($params, $tag);
    	
    	array_push($conditions, sprintf(
    		"`category_id` IN (SELECT `category_id` FROM `categories` WHERE `name` IN (%s)",
    		implode(',', str_split( str_repeat('?', count($tags))))
    	));
    }
    
    $query = 'SELECT * FROM sometable';
    if( count($conditions)) $query = $query . ' WHERE ' . implode(' AND ', $conditions);
    
    $stmt = $dbh->prepare($query);
    if( $stmt->execute($params)) {
    	while ($row = $stmt->fetch()) {
    		print_r($row);
    	}
    }
    Ответ написан
    Комментировать
  • Как посредством API ВКонтакте получить больше 5000 друзей методом friends.get()?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сделайте в цикле. С каждым разом увеличивайте offset на 5000 пока он не окажется больше возвращённого в поле count полного числа друзей. Не забывайте про лимит в 3 запроса в секунду.

    Можно ещё заморочиться и запихать весь код в execute(), тогда из PHP последует единственный запрос, а цикл прокрутится на сторон ВК.
    Ответ написан
    3 комментария
  • Какова веростность коллизии в рандомной строке?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно лучше будет не случайную строку генерить, а последовательные id записей однозначно мапить (см. биекция, bijection) в пространство вашего алфавита. Так 100% не будет коллизий.

    Чтобы коды последовательных id не выглядели последовательно, можно, например, реверсировать порядок бит в числе перед записью его новым алфавитом. Это сохранит однозначность отображения.

    2 млн. записей укладываются в 20 бит (0 .. 2097151). Алфавит из англ. букв в двух регистрах и цифр состоит из 26+26+10 = 62 символов. Может, ещё пару символов добавить, будет ровно 64 (6 бит). Итого для одного id понадобится всего 4 символа вашего алфавита, и это с избытком: вместо 20 бит, целых 24 будете записывать.
    Ответ написан
    Комментировать
  • Добавить одинарные кавычки в начало и конец текста?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $text = "Это мой текст. Да, вот такой.";
    $text_v_kavychkah = "'" . $text . "'"; // точка означает склеивание строк
    // или
    $text_v_kavychkah = '\'' . $text . '\''; // только одинарные кавычки
    // или
    $text_v_kavychkah = "'$text'"; // в двойных кавычках подставится значение переменной
    // или
    $text_v_kavychkah = sprintf("'%s'", $text); // текстовое значение подставится вместо %s
    Ответ написан
    Комментировать
  • Зачем делают вот такую конструкцию?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Очень-крутые сайтоделы внизу своей чисто-HTML страницы добавляют «копирайт (с) Вася Пупкин 2000 год» – иначе они не круты.

    Потом приходится менять год на следующий. И на следующий. Становится лень, и тут они открывают чудный мир PHP и копируют откуда-то код, автоматически подставляющий текущий год в страницу!

    &copy; Вася Пупкин <?php echo date('Y'); ?>

    Вот отсюда всё и начинается..
    Ответ написан
    Комментировать
  • Почему не проходит проверка vk api php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Проверить токен можно просто методом users.get() без параметров – при валидном токене он вернёт инфу про юзера, чей токен.
    Ответ написан
    Комментировать