Ответы пользователя по тегу PHP
  • Я разучился понимать работу кода?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Самый простой способ отловить этот баг - это добавить в error_log:
    1. Длину $some_var (скорее всего, этого будет достаточно)
    2. Код каждого символа. (Здесь и раскроется парадокс). Должно быть: 109 97 103 105 99

    Гипотетический вариант решения
    $some_var = trim($some_var);
    Ответ написан
    3 комментария
  • Ответ от сервера к скрипту не отправляется, как исправить?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Не могли бы вы подсказать, что я делаю не так?

    Не так вы делаете отладку вашего скрипта. Если бы вы делали так, как надо, то быстро бы нашли ошибку.

    Научитесь отлаживать свои программы, иначе вы не имеете права называться программистом. А когда столкнетесь с реальным парадоксом, то сведите его к 2-3 строчкам кода, который любой желающий сможет легко воспроизвести у себя, - и можно будет задать вопрос на Тостере.

    Кроме того, вы не так даже задали этот вопрос. Потому что не описали результат. Ведь слова "не работает" или "не отправляется" ни о чем не говорят человеку, который готов вам ответить. Текст ошибки где?? Вам нужно хотя бы немножко думать о тех, кому вы пишете, ставить себя на их место. А на текущий вопрос даже начать отвечать не получится, а про ответ-решение вообще молчу.
    Ответ написан
    Комментировать
  • Почему не читается Json файл?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    $stage = $info[0]->{'stage'};
    Ответ написан
    Комментировать
  • Через что может идти подмена символов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Ну, много причин. Так и не скажешь сразу.
    Это может быть даже вирус.
    Недавно как раз была статья в тему.
    Ответ написан
    Комментировать
  • Редактирование JSON файла с помощью форм на странице, как можно это сделать?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Это задание. Поэтому нужно вложиться деньгами или временем, а просто так в одном абзаце получить ответ не получится. В лучше случае вас можно отправить учиться или гуглить, но так вы начнёте тратить своё время как раз.
    Ответ написан
    Комментировать
  • Могут ли пользователи загрузить вирус на сайте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В общем случае нет. Ведь конфиг не сохраняется на сервере. А если сохраняется, то без права запуска. Хотя в теории вирус можно загрузить и без конструктора, но это другая история.

    Предотвращение атак - это обширная тема. И конструктор здесь самый незначительный фактор из всех, которые придётся учитывать. Но вообще касаемо конструктора, если вводимые данные имеют какой-то безопасный формат, то можно проверять соответствие этому формату.

    Например, если в поле вводится число, то это можно легко проверить.

    А исключить php в текстовых полях можно поиском пары символов "<?" - и если такая подстрока встречается, то это плохой текст, и конструктор должен запрещать его.
    Ответ написан
    2 комментария
  • Как по ссылке понять, что это сайт интернет-магазин?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно по ключевым словам, признакам и т.д.

    Если по-модному, то нужно обучить нейронную сеть на распознавание магазинов.

    Понятное дело, что в пару строчек кода не получится. И готовое решение вряд ли кто-то предложит.
    Ответ написан
  • Есть ли смысл маскировать админку под 404?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если вам важно, чтобы юзер знал, что по этому адресу что-то есть, но у него нет прав (но в теории права могут появиться), то 403 или даже что-то более вразумительное, иначе можно 404.

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

    Так что ответ - нет, не имеет смысла.
    Ответ написан
    Комментировать
  • Будет ли улучшение производительности, если выводить статьи не в php коде, а передавать их в ajax?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В общем случае без разницы для сервера. Потому что это не ахти какая нагрузка. Ведь данные и так в массиве. Разве много вычислений нужно, чтобы переставить куски массива? (Вопрос к вам, кстати, потому что алгоритм может быть и правда сложным, но вряд ли у вас такое).

    Для клиента массив однозначно не желателен. Во-первых, это дополнительная работа, когда её могло бы и не быть, т.е. страница, возможно, медленнее загрузится. Во-вторых, у клиента вообще может быть отключен JS, либо может не сработать по каким-то причинам (например, ложное срабатывание блокировщика рекламы). Поисковики тоже не обрадуются встроенному в страницу JS, хоть и скушают.

    Ну и главное, это наличие у каждой статьи своего уникального URL. Говорю на всякий случай, потому что если вы додумались до того, что смена статьи будет происходить через ajax без смены адреса, то это однозначно плохо. Скорее всего, вы это и так понимаете, поэтому ответ прежний - в общем случае практически без разницы php или ajax.

    P.S. Что реально лучше перекладывать на клиента, точнее давать в виде дополнительной фичи - так это сортировку таблиц с данными в статье. Опять-таки, таблицы должны отображаться без JS. Но при наличии JS их можно сортировать сразу плюс давать пользователю кнопки сортировки, которая будет происходить локально, без перезагрузки страницы. Это и приятно, и снимает нагрузку с сервера (по количеству соединений).
    Ответ написан
    2 комментария
  • Как защитить AJAX-запрос?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Обычно происходит так:
    1) У админа есть пароль. У пользователя, кстати, тоже должен быть.
    2) Админ вводит пароль на сайте и в замен получает токен (т.е. какой-то ключ). Получить он может его как угодно - напрямую через POST-запрос из формы, либо через ajax. Но суть такая, что в запросе пароль, а в ответе токен (ключ).
    3) Далее этот токен админ использует везде на сайте для доступа к своим админстким функциям. То есть в каждом ajax-запросе присутствует этот токен. Он становится частью сессии. Вообще в php даже есть свои сессии со своим ключом, так что их тоже можно использовать.
    4) Через какое-то время, либо после нажатия кнопки "выход", токен устаревает и больше не работает (нужно снова вводить пароль).

    Так что ответ на вопрос: нужно посылать токен в каждом ajax-запросе, это и будет защита.
    Ответ написан
    6 комментариев
  • Если уже залили шелл и хотят слить мой скрипт?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Отключить nginx, далее уже разбираться без суеты, изучать новые файлы, логи, бд и т.д.

    Вы же не хотите сказать, что php у вас может (имеет права) менять системные файлы, запускать любые процессы и т.д.?

    Хакер залил и хочет слить проект в паблик.
    Это очень странное заявление, т.к. происходит это обычно очень быстро. Пока вы думаете, что делать, проект уже будет слит. Ну, конечно, если это не мега тяжелая база через узкое соединение. Так что хакер сначала сольет проект, а потом уже будет хотеть выложить его в паблик, лениво переписываясь с вами или с кем-либо еще.

    В общем случае совет - сразу отрубить всё, что только можно, а потом думать. В идеале должен быть физический доступ, чтобы обрубить интернет. Хотя в теории зловредный скрипт может быть настолько умным, что его автономные действия будут опаснее, чем при управлении хакером удаленно, но такой скрипт сделать сложно и дорого, поэтому это редкость.
    Ответ написан
  • Почему не работает код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    "<h1><div class="film-card">"
    Кавычки внутри строки не экранированы.
    А вообще можете включить вывод ошибок и увидеть точный текст ошибки и номер строки в коде.
    Ответ написан
  • Как сделать так, чтобы число не выходило за рамки диапазона?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Просто делаешь свою функцию и применяешь её.
    Например, такую
    function check($a) {
        while ($a < 100) $a += 11;
        while ($a > 110) $a -= 11;
        return $a;
    }
    
    echo(check(105-7)); // 109

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Посчитать
    $arr = [1,2,3,4,5,5,4,1,2,1,2,5,2,2,3,2];
    $cnt = [];
    foreach ($arr as $val) { //Считаем
    	$cnt[$val] = @$cnt[$val] + 1;
    }
    print_r($cnt);
    
    $answer = 0;
    $max = 0;
    foreach ($cnt as $key=>$val) if ($val > $max) { //Ищем максимум
        $max = $val;
        $answer = $key;
    }
    print_r('Answer: '.$answer);
    Ответ написан
    5 комментариев
  • Сортировка и вывод из двух массивов - как сделать?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Просто в одном цикле проверяешь условие, что из второго массива выведена ровна треть от первого массива.

    Примерно так:
    Код
    $Item = [
    	0, //нумерация с 1
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    	[ 'name'=>'название' ],
    ];
    
    $Model = [
    	0,
    	[ 'name'=>'название элемента из второго массива' ],
    	[ 'name'=>'название элемента из второго массива' ],
    	[ 'name'=>'название элемента из второго массива' ],
    ];
    
    $key1 = 1; //для $Item
    $key2 = 1; //для $Model
    while ($key1 < count($Item) || $key2 < count($Model)) { //итерируем оба массива
    	if ($key1 < count($Item)) echo("<div class='element'>$key1 ".$Item[$key1]['name']."</div>\n");
    	if ($key1 / 3 >= $key2) { //если соотношение достигло одной трети
    		//то вывести один элемент из второго массива
    		if ($key2 < count($Model)) echo("<div class='spec'>$key2 ".$Model[$key2]['name']."</div>\n");
    		$key2++; //и посчитать его
    	}
    	$key1++;
    }
    Результат
    <div class='element'>1 название</div>
    <div class='element'>2 название</div>
    <div class='element'>3 название</div>
    <div class='spec'>1 название элемента из второго массива</div>
    <div class='element'>4 название</div>
    <div class='element'>5 название</div>
    <div class='element'>6 название</div>
    <div class='spec'>2 название элемента из второго массива</div>
    <div class='element'>7 название</div>
    <div class='element'>8 название</div>
    <div class='element'>9 название</div>
    <div class='spec'>3 название элемента из второго массива</div>
    Ответ написан
    Комментировать
  • Можно ли спарсить Json с не экранированными кавычками?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно попробовать исправить поломанный JSON.
    Примерно так, но это не покрывает 100% случаев из вашего вопроса
    <?php
    $str = '{"name": "my "name"", "value": "123456789"}';
    
    function fixJSON($str) {
        $len = strlen($str);
        $result = '';
        $space = '';
        $mode = 0;
        for($i=0;$i<$len;$i++){
            $c = $str[$i];
            switch ($mode) {
                case 0: //вне строки
                    if ($c == '"') $mode = 1;
                    $result .= $c;
                    break;
                case 1: //внутри строки
                    if ($c == '"') {
                        $mode = 3;
                        $space = $c;
                        break;
                    }
                    if ($c == '\\') $mode = 2;
                    $result .= $c;
                    break;
                case 2: //сразу после слеша (игнорим один любой символ)
                    $mode = 1;
                    $result .= $c;
                    break;
                case 3: //была кавычка внутри строки
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == ',' || $c == '}' || $c == ']' || $c == ':') {
                        //вероятно был конец строки (шанс 99%)
                        $mode = 0;
                        $result .= $space.$c;
                    } else {
                        //мы остались внутри строки на 100%. Экранируем
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--; //уходим назад, т.к. вдруг это снова кавычка
                    }
                    break;
            }
        }
        return $result;
    }
    
    echo(fixJSON($str)); //{"name": "my \"name\"", "value": "123456789"}
    ?>

    Но лучше исправить то место, которое приводит к поломке JSON, чтобы оттуда к вам сразу нормальные строки приходили, а не костыли изобретать.

    P.S.
    Более совершенный и более упоротый вариант
    <?php
    $str = '{"say": ""my name", hi", "value": "123456789"}';
    
    function fixJSON($str) {
        $len = strlen($str);
        $result = '';
        $space = '';
        $mode = 0;
        for($i=0;$i<$len;$i++){
            $c = $str[$i];
            switch ($mode) {
                case 0: //вне строки
                    if ($c == '"') $mode = 1;
                    $result .= $c;
                    break;
                case 1: //внутри строки
                    if ($c == '"') {
                        $mode = 3;
                        $space = $c;
                        break;
                    }
                    if ($c == '\\') $mode = 2;
                    $result .= $c;
                    break;
                case 2: //сразу после слеша (игнорим один любой символ)
                    $mode = 1;
                    $result .= $c;
                    break;
                case 3: //была кавычка внутри строки
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == '}' || $c == ']') {
                        //вероятно был конец строки (шанс 99%)
                        $mode = 4;
                        $space .= $c;
                    }
                    elseif ($c == ',' || $c == ':') {
                        //вероятно был конец строки (шанс 90%)
                        $mode = 5;
                        $space .= $c;
                    } else {
                        //мы остались внутри строки на 100%. Экранируем
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--; //уходим назад, т.к. вдруг это снова кавычка
                    }
                    break;
                case 4: //после спец символа
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == ',') {
                        //был конец строки с шансом 99.99%
                        $mode = 0;
                        $result .= $space.$c;
                    } else {
                        //внтури строки на 100%
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--;
                    }
                    break;
                case 5: //после запятой
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif (preg_match('/[0-9"-]+/', $c)) {
                        //был конец строки с шансом 99.9%
                        $mode = 0;
                        $result .= $space;
                        $i--;
                    } else {
                        //внтури строки на 100%
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--;
                    }
                    break;
            }
        }
        if ($mode>2) $result .= $space;
        return $result;
    }
    
    echo(fixJSON($str)); //{"say": "\"my name\", hi", "value": "123456789"}
    ?>
    Но всегда можно в строку засунуть другой JSON и никакой конечный фиксер не справится с такой глубиной.
    Ответ написан
    Комментировать
  • Как сравнить только часть символов строки?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    <?php
    $re = '/\(test(.*?)\)/m';
    $str = '(testOne)';
    $str2 = "fff";
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    if (count($matches) > 0) {
        $str1 = $matches[0][1];
        echo ( $str1 == $str2 ? 'одинаковые' : 'разные' );
    }
    ?>
    Ответ написан
    Комментировать
  • Как заблокировать доступ к сайту определённому клиенту?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно. Всем без исключения пользователям не показывать контент, пока не заработает метрика. Затем можно перевести в куки, но дальше стратегия очевидна. Другой вопрос, устроит ли вас подход, когда сайт блокируется для всех, у кого не работает метрика (например, стоит блокировщик рекламы).
    Ответ написан
    9 комментариев
  • Почему при перенаправлении запросов на index.php выдается 500?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не установлен mod_rewrite
    Ответ написан
    Комментировать