Ответы пользователя по тегу PHP
  • Как с помощью регулярного выражения удалить пробелы перед и после слешев?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    $str = '`&tpl = @FILE root / resources / mychank.tpl`';
    
    // Вариант 1 (самый банальный)
    
    $res_str = str_replace(' / ', '/', $str);
    
    print_r($res_str);
    
    // Вариант 2 (импровизация)
    
    $res_str = implode('/', array_map('trim', explode('/', $str)));
    
    print_r($res_str);
    
    // Вариант 3 ( регулярка:) )
    
    $res_str = preg_replace('#\s+/\s+#isu', '/', $str);
    
    print_r($res_str);


    UPD:
    Щас сижу читаю вот это:
    Есть строка `&tpl = @FILE root / resources / mychank.tpl` в корой нужно удалит пробелы перед и после / с учетом того, что / должы находится в внутри `` которое содержит @FILE

    К чему это условие (выделенное жирным), если изначально у тебя это и есть вся строка, исходя из:
    Есть строка `&tpl = @FILE root / resources / mychank.tpl`


    Т.е. получается эта "строка" может находится среди других данных? Или как? Ну т.е., например:
    абракадабра / сым-салабым / чудо-юдо `&tpl = @FILE root / resources / mychank.tpl` / тырым-пырым / хали-гали


    UPD2:
    <?php
    
    $str = 'абракадабра / `&tpl = @NOFILE root / resources / mychank.tpl` /сым-салабым / чудо-юдо `&tpl = @FILE root / resources / mychank.tpl` / тырым-пырым / хали-гали';
    
    function trimSlashes($str) {
        
        // Тут любой из вариантов, которые выше...в данном случае "взяли" третий, чтобы было всё на "регулярках" :)
        return preg_replace('#\s+/\s+#isu', '/', $str[0]);
    }
    
    $res_str = preg_replace_callback('#`[^`]+@FILE[^`]+`#isu', 'trimSlashes', $str);
    
    print_r($res_str);


    Результат:

    абракадабра / `&tpl = @NOFILE root / resources / mychank.tpl` /сым-салабым / чудо-юдо `&tpl = @FILE root/resources/mychank.tpl` / тырым-пырым / хали-гали

    P.S.: Правильно составленный вопрос - половина ответа...
    Ответ написан
    1 комментарий
  • SQL инъекция в UPDATE возможна ли?

    Fernus
    @Fernus
    Техник - Механик :)
    Смысл есть!

    UPD:
    Поясню...я тебе в $id передам 9999 or 1 = 1 и все записи нафиг потерпят изменения!
    Ответ написан
    2 комментария
  • Есть ли встроенные механизмы для развертывания массива?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    $samples = [
        123,
        [1, 2, 3],
        321
    ];
    
    $samples_modified = [];
    array_walk_recursive($samples, function ($item, $key) use (&$samples_modified) {
        $samples_modified[] = $item;    
    });
    
    print_r($samples_modified);


    UPD:

    Вариант с foreach:
    <?php
    
    $samples = [
        123,
        [1, 2, 3],
        321
    ];
    
    $samples_modified = [];
    
    function recursive_func($array){
        
        global $samples_modified; 
        
        if(is_array($array)){
            foreach($array as $below){
                $res = recursive_func($below); 
    
            }
        }else{
            $samples_modified[] = $array; 
        }
        return $samples_modified; 
    }
    
    recursive_func($samples);
    
    print_r($samples_modified);


    P.S.: За global помидорами не кидайте...чисто для примера...
    Ответ написан
  • Как уменьшить размер файла Imagick?

    Fernus
    @Fernus
    Техник - Механик :)
    https://www.php.net/manual/ru/imagick.setimagecomp...
    https://www.php.net/manual/ru/imagick.setcompressi...

    UPD:
    Попробуй значение в 75...сильно не должно повлиять на качество изображения...

    UPD2:
    PNG не увидел сначала...

    For a PNG image, `setImageCompressionQuality()` is not work at all, length of the generated files are totally same.

    But I found an effective way, that is use `setOption('png:compression-level', 9)`, the value range is 0-9.

    Источник
    Ответ написан
  • Как выбрать зону яндекс.карт исходя из адреса юзера?

    Fernus
    @Fernus
    Техник - Механик :)
    Когда-то решал похожее...

    У меня была такая задача:
    1. Есть точка на карте;
    2. Есть полигоны (многоугольники) на карте;
    3. Есть внутри каждого многоугольника точка на случай, если точка из п.1 не попала ни в один многоугольник, то нужно найти ближайшую точку из п.3 для точки из п.1...

    Ниже пример как проверять вхождение точки из п.1 в полигоны (многоугольники) из п.2...

    class Polygon {
        /**
         * @var array
         */
        var $polygon = [];
        /**
         * Polygon itself, with basic vector-based structure
         * Array: [ [1,1], [2,1], [3,0], [2,-1] ]
         *
         * @var $polygon array
         */
        function setPolygon($polygon) {
            if (count($polygon) < 3) {
                return false;
            }
    
            if (!isset($polygon[0]['x'])) {
                foreach ($polygon as &$point) {
                    //$point = ['x' => round($point[0] + 300, 4), 'y' => round($point[1] + 300, 4)];
                    //$point = ['x' => round($point[0], 4), 'y' => round($point[1], 4)];
    
                    if($point[0] < 0)
                        $point[0] = 90 + 90 - abs($point[0]);
                    if($point[1] < 0)
                        $point[1] = 180 + 180 - abs($point[1]);
    
                    $point = ['x' => round($point[0], 4), 'y' => round($point[1], 4)];
                }
            }
            $this->polygon = $polygon;
        }
        /**
         * Check if $polygon contains $test value
         *
         * @var $test array(x=>decimal, y=>decimal)
         */
        function calc($test) {
    
            if($test['x'] < 0)
                $test['x'] = 90 + 90 - abs($test['x']);
            if($test['y'] < 0)
                $test['y'] = 180 + 180 - abs($test['y']);
    
            $q_patt= [[0, 1], [3, 2]];
            $end = end($this->polygon);
    
            $pred_pt = end($this->polygon);
            $pred_pt['x'] -= $test['x'];
            $pred_pt['y'] -= $test['y'];
            $pred_q = $q_patt[$pred_pt['y'] < 0][$pred_pt['x'] < 0];
            $w = 0;
    
            for ($iter = reset($this->polygon); $iter !== false; $iter = next($this->polygon)) {
                $cur_pt = $iter;
                $cur_pt['x'] -= $test['x'];
                $cur_pt['y'] -= $test['y'];
                $q = $q_patt[$cur_pt['y'] < 0][$cur_pt['x'] < 0];
    
                switch ($q - $pred_q) {
                    case -3:
                        ++$w;
                        break;
                    case 3:
                        --$w;
                        break;
                    case -2:
                        if ($pred_pt['x'] * $cur_pt['y'] >= $pred_pt['y'] * $cur_pt['x']) {
                            ++$w;
                        }
                        break;
                    case 2:
                        if (!($pred_pt['x'] * $cur_pt['y'] >= $pred_pt['y'] * $cur_pt['x'])) {
                            --$w;
                        }
                        break;
                }
                $pred_pt = $cur_pt;
                $pred_q = $q;
            }
    
            return $w != 0;
        }
    
        public static function distance($lat1, $lng1, $lat2, $lng2) {
    
            $lat1=deg2rad($lat1);
            $lng1=deg2rad($lng1);
            $lat2=deg2rad($lat2);
            $lng2=deg2rad($lng2);
    
            $delta_lat=($lat2 - $lat1);
            $delta_lng=($lng2 - $lng1);
    
            return round( 6378137 * acos( cos( $lat1 ) * cos( $lat2 ) * cos( $lng1 - $lng2 ) + sin( $lat1 ) * sin( $lat2 ) ) );
        }
    
        public static function closestPoint($x, $y, $arPoints) {
    
            $RESULT = false;
    
            $x = floatval($x);
            $y = floatval($y);
    
            if(!empty($arPoints) && is_array($arPoints) && count($arPoints) > 0) {
    
                $arRes = array();
    
                foreach ($arPoints as $KEY => $VAL) {
    
                    $x2 = floatval($VAL[0]);
                    $y2 = floatval($VAL[1]);
    
                    $distance = self::distance($x, $y, $x2, $y2);
    
                    $arRes[$KEY] = $distance;
    
                }
    
                if(count($arRes) > 0) {
    
                    natsort($arRes);
                    reset($arRes);
    
                    //$RESULT[key($arRes)] = current($arRes);
    
                    $RESULT = array(
                        'ID' => key($arRes),
                        'DISTANCE' => current($arRes)
                    );
    
                }
    
            }
    
            return $RESULT;
        }
    }
    
    /* Ипользование */
    
    // Координаты точки, которую проверяем на вхождение в "полигон"
    $X = 33.45;
    $Y = 44.25;
    
    // "Полигоны"
    $arCheckPoints = [
        'КЛЮЧ_МНОГОУГОЛЬНИКА' => [22.45, 44.55, 11.22, 55.66], // Координаты вершин
        'КЛЮЧ_МНОГОУГОЛЬНИКА_2' => [33.45, 66.55, 77.22, 99.66], // Координаты вершин
        'КЛЮЧ_МНОГОУГОЛЬНИКА_3' => [12.45, 15.55, 17.22, 54.66], // Координаты вершин
    ];
    
    $arResults = [];
    
    $p = new \App\Helpers\Polygon();
    
    foreach ($arCheckPoints as $KEY_POLYGON => $arPolygon) {
    
        $p->setPolygon($arPolygon);
    
        if($p->calc(array('x' => $X, 'y' => $Y)))
            $arResults[$KEY_POLYGON] = $arPolygon;
    
    }


    Для решения п.3 используется функция distance...
    Ответ написан
    Комментировать
  • Laravel 5: как лучше выводить данные из бд?

    Fernus
    @Fernus
    Техник - Механик :)
    class Order extends Model
    {
    
        // ... Тут стандартное начало модели
        
        protected $appends = [
            'status_color'
        ];
    
        
        public function getStatusColorAttribute() {
    
            switch($this->status) {
            
                case 1:
                
                    return 'зелёный';
                
                break;
                
                
                case 2:
                
                    return 'синий';
                
                break;
                
                case 3:
                
                    return 'красный';
                
                break;
                
                default:
                
                    return 'хз';
                
                break;
            
            
            }
        }
    
    }
    Ответ написан
    3 комментария
  • Если в БД есть запись "строка" - вставить запись "строка-1", если есть "строка-1" - вставить "строка-2"?

    Fernus
    @Fernus
    Техник - Механик :)
    Я бы немного изменил структуру, добавив одно дополнительное поле и уникальный индекс на поле name...
    Короче...

    Таблица:
    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `count` int(11) NOT NULL DEFAULT 0,
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    При вставке записей использовал бы такой запрос:
    INSERT INTO `test` (`name`) VALUES ('строка') 
    ON DUPLICATE KEY 
    UPDATE `count` = `count` + 1;


    Что в итоге?

    - В итоге не будет лишних объёмов данных в БД...
    - Всего один запрос на вставку;
    - В поле count будет число - сколько раз была занесена данная строка в БД...

    UPDATE:

    Исходя из комментариев и подробностей автора дополняю ответ...

    Можно например использовать Redis (increment)...
    Где ключ будет "строка" (в данном случае kot например).
    Перед записью ныряем в Redis, подкручиваем "счётчик" и далее берем это значение и записываем в MySQL в поле slug:

    kot-ЗНАЧНИЕ_СЧЁТЧИКА

    В итоге один запрос в Redis и один INSERT в MySQL...

    Понятна мысля?)

    P.S.: Redis можно и на MySQL тож заменить...используя мой первый вариант в ответе в качестве счётчика вместо Redis'а...но тут на пару запросов больше выйдет...что и не критично в данном случае думаю...
    Ответ написан
    4 комментария
  • Почему не работает поиск по сайту phprusearch?

    Fernus
    @Fernus
    Техник - Механик :)
    <form action="phprusearch/" method="post" class="search">
    <input type="text" name="query" placeholder="Поиск..."><input type="submit" value="Найти" class="btn btn-info">
    </form>


    Вангую, что ошибка в ссылке в action в теге form...
    Добавьте слэш в начало action:
    /phprusearch/
    Ответ написан
    2 комментария
  • Сортировка идентификаторов в массиве php?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    $from_id = $items->pluck('from_id');
    $arFormIds = $from_id->toArray();
    
    $arPlus = $from_id->where($arFormIds, function ($value, $key) {
        return $value > 0;
    })->toArray();
    
    $arMinus = $from_id->where($arFormIds, function ($value, $key) {
        return $value < 0;
    })->toArray();
    
    // $arPlus - все положительные
    // $arMinus - все отрицательные
    
    ?>

    P.S.: Можно немного изящнее:

    <?php
    
    // $items - твоя коллекция...без pluck...
    
    $arPlus = $items->where('form_id', '>', 0)->toArray();
    $arMinus = $items->where('form_id', '<', 0)->toArray();
    
    // $arPlus - все положительные
    // $arMinus - все отрицательные
    
    ?>
    Ответ написан
  • Как настроить cron для запуска php скрипта?

    Fernus
    @Fernus
    Техник - Механик :)
    Используйте __DIR__ для получения текущего каталога..и относительно него подключайте скрипты при запуске из командной строки...
    Ответ написан
    Комментировать
  • Как получить позицию первого вхождения подстроки?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    public function findUrl($message) {
        $result = false;
    
        $domains = ['.com', '.ru', '.cc'];
        foreach($domains as $domain) {
            $data = strpos($message, $domain);
            if($data !== false) {
                $result = $data;
                break;
            }
        return $result;
    }
    Ответ написан
    1 комментарий
  • Как пересортировать строки в mysql таблице?

    Fernus
    @Fernus
    Техник - Механик :)
    Получили $_POST массив [12, 119, 6, 9]


    Может так попробовать?

    SELECT `id`, `value`
    FROM `table`
    ORDER BY 
        CASE `id`
            WHEN 12 then 1
            WHEN 119 then 2
            WHEN 6 then 3
            WHEN 9 then 4
            ELSE NULL
        END
    ASC


    Сформировать запрос средствами PHP сможешь же?

    P.S.: Всё что не окажется в $_POST...окажется в начале списка...но тут можно добавить и условие для выборки, например:

    SELECT `id`, `value`
    FROM `table`
    WHERE `id` IN(12,119,6,9)
    ORDER BY 
        CASE `id`
            WHEN 12 then 1
            WHEN 119 then 2
            WHEN 6 then 3
            WHEN 9 then 4
            ELSE NULL
        END
    ASC


    Делаю админку. Вывожу список значений из таблицы в порядке `id`.
    Использую jquery-UI sortable. Можно переставлять местами строки и отправить форму.

    Если это задумано для дальнейшего вывода потом "где-то" в том порядке, в котором указали...то логичнее добавить поле в таблицу, например "sort"...в него записывать порядковый номер из списка, который натусовал пользователь в админке...и далее просто ORDER BY `sort`...
    Не?
    Ответ написан
  • Проблема с MySql, кто знает?

    Fernus
    @Fernus
    Техник - Механик :)
    Есть ли ошибки синтаксические?

    1. Включи показ ошибок в PHP;
    2. Вижу в этом месте, что вместо одинарных ковычек - апосторфы...

    $select = "SELECT * FROM users WHERE email=`$email`";


    Как минимум должно быть так:
    $select = "SELECT * FROM users WHERE email = '".$email."'";
    Ответ написан
    Комментировать
  • Как узнать изменился ли файл без его открытия и закрытия?

    Fernus
    @Fernus
    Техник - Механик :)
    www.php.su/functions/?md5-file

    Как экзотический вариант...

    P.S.: В данном случае на время изменения будет не важно...только, если содержимое изменится...
    Ответ написан
    Комментировать
  • Как без цикла сделать действие после появления файла в директории?

    Fernus
    @Fernus
    Техник - Механик :)
    Всё решается "событиями"...

    1. Идём гуглим, что такое события в программировании...
    2. При каждом добавлении/удалении "генерируем" и "слушаем" эти события;
    3. Выполняем какое-то требуемое действие после этого события.
    Ответ написан
  • Как взять прямую ссылку на изображение из файла и скачать его?

    Fernus
    @Fernus
    Техник - Механик :)
    При условии, что ссылки НЕ битые...то, как минимум, вот это поправь...

    Замени это:
    foreach($base AS $row) {
      $result[] = $row;
      // var_dump($result); // Раскомментируй, чтобы понять "почему"
    }

    На это:
    foreach($base AS $row) {
      $result[] = trim($row);
      // var_dump($result); // Раскомментируй, чтобы понять "почему"
    }


    А вообще, код - шляпа... :)
    Ответ написан
  • Как конвертировать текст с исходным кодом в изображение на PHP?

    Fernus
    @Fernus
    Техник - Механик :)
    Если пройтись по готовым решениям и потратя 5 мин в гугле, то...

    1. HTML to PDF:
    https://habr.com/ru/post/190364/
    2. PDF to Image File:
    https://stackoverflow.com/questions/3833125/how-to...
    Ответ написан
  • Как отправить данные с формы на почту, если нет почты сайта???

    Fernus
    @Fernus
    Техник - Механик :)
    Ответ написан
    Комментировать
  • Шаблонизатор Blade?

    Fernus
    @Fernus
    Техник - Механик :)
    Ответ написан
    Комментировать
  • Как увеличить max_execution_time?

    Fernus
    @Fernus
    Техник - Механик :)
    Тут про очереди/евенты тебе написали уже...
    Ну а данную задачу можно разбить например на такие составляющие:

    1. "Забираем" файл;
    2. Делаем "евент", что файл принят.
    3. Если файл принят, то начинаем читать каждую строку со счётчиком по времени...например 30 сек...чтобы не упираться в ограничения...если при чтении очередной строки и обработке мы превышаем или равно 30 сек, то запоминаем то место в файле, где остановились и кидаем евент "продолжить" и отправляем в очередь...
    4. Повторяем шаг 3 пока не дойдём до конца файла...если конец достигнут, то кидаем евент "профит";
    5. Если достигнут "профит", говорим пользователю "алиЛУя!"

    Как-то так...
    Ответ написан
    1 комментарий