Задать вопрос
  • PHP - вывод картинок из папки. Как вывести только JPG?

    @lolzqq
    HTML,CSS,JS,PHP
    Функция glob вам поможет и пути получить и сразу нужные расширения отсортировать в массив https://www.php.net/manual/ru/function.glob.php
    Останется только через foreach прогнать массив, для дальнейших действий.
    Ответ написан
    Комментировать
  • Нормально ли писать лендинги без фреймворков?

    Kozack
    @Kozack
    Thinking about a11y
    Да. Поймите, что вам скорее всего оторвут руки не за то, что вы что-то не использовали, а наоборот -- использовали то, без чего можно было бы обойтись.
    Если вы не видите острой нужны в фреймворке -- не используйте
    Если вам не нужна база данных, не нужна какая-то логика на сервере -- нафиг php.
    Если у вас нет каких-то интерактивных частей в лендинге -- нафиг JS.

    Чем проще, чем легче будет проект -- тем лучше.
    Ответ написан
    Комментировать
  • Нужно ли отдельно писать сервер для взаимодействия с БД?

    Adamos
    @Adamos
    Хостинг: шаред или дешевый VPS, на котором вы разместите свою БД.
    Там же - API на чем угодно (PHP, JS, Python), с авторизацией и разрешением конфликтов (а скорее - устранением их причины).
    И все остальное, что вам нужно сделать из приложения, покроет libCurl.
    Ответ написан
    2 комментария
  • Как правильно задать условие дня недели на php?

    @alex--n
    https://www.php.net/manual/ru/datetime.format.php
    По таблице или l чтоб полное название дня было или N где 1-понедельник, 7 воскресенье
    date("N")
    Ответ написан
    2 комментария
  • Почему не выполняется условие WHERE?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Потому что

    $bd->Query("SELECT COUNT(*) FROM users_nykfageubf WHERE p = '$p' AND promo_new=1"))


    всегда возвращает true - запрос выполнен успешно, а не количество найденных строк

    Кстати два запроса следует объединить в один:
    $bd->Query("UPDATE users_nykfageubf SET balance=balance+10, promo_new = 0 WHERE p = '$p' AND promo_new=1");

    а в качестве провереи использовать более быстрый запрос:
    $stmt = $bd->Query("SELECT 1 FROM users_nykfageubf WHERE p = '$p' AND promo_new=1 LIMIT 1");
    if ($stmt->rowCount() > 0) {
        ...........
    }
    Ответ написан
    4 комментария
  • Как инкрементировать число?

    @rPman
    В терминах базы данных это называется sequence, в каких то это специальный объект с этим именем, значение которого можно запросить и получить следующее, в каких то используется стратегия autoincrement, когда это значение вычисляется автоматически при добавлении в таблицу (например primary key) в каких то, а значит следующее значение можно получить только добавив запись, ну а в совсем уж слабых, пользователи заводят специальную таблицу, где одна запись - сиквенс, значение которого можно прочитать и увеличить на нужное число простым update (и использовать блокировки).

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

    При попытке реализовать подобное на базе файлов возникнет необходимость реализовывать контроль за подобными коллизиями уже самому.
    обожаю велосипеды, не надо так делать
    Пишите в файл, добавляя символы < и > (смысл у каждого - транзакция начата и завершена соответственно), текущая позиция (размер файла) будет значением сиквенса (т.е. сначала вы определяете размер файла, и читаете его последний байт, если он < то ждете случайное время в миллисекундах и повторяете процесс, если он >, значит текущая позиция будет номером сиквенса, добавляете в файл символ <, отрабатываете генерацию формы, пишете >, это самый опасный момент, если нет сервера, смерть процесса до этого момента 'заблокирует' работу, так всегда бывает когда нет сервера, чтобы возобновить - достаточно добавить >), если нужен счетчик то считаете количество < во всем файле до текущей позиции.
    Если счетчик должен считать долго, можно в начало файла записывать определенное число (выравнивая его по фиксированному количеству символов, например sprintf('%08u',$seq);) отдельным процессом на сервере запустить периодическое усечение этого файла, процесс так же ждет момента когда последний символ будет >, переименовывает файл, считает в нем количество, и обновляет запись в первоначальном файле, создав его если он не создался и после этого удаляет предыдущий переименованный.
    В этом случае не важно, в какой последовательности будет происходить работа с файлом и сколько в него будут писать приложений, пока размер файла меньше размера сектора (4кб минимум чаще больше) то операции с ним атомарны (под вопросом сетевые FS типа nfs/samba но на них и так проблемы) а значит сам файл станет механизмом контроля и синхронизации.

    p.s. Внимательно подумайте, вам нужен счетчик или нужно уникальное значение? Можно чтобы каждое следующее значение было ровно на единицы больше? может быть оно меньше предыдущего?

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

    Самый простой алгоритм - который по правде говоря не дает гарантий, но значительно понижает вероятность коллизий - взять текущее время, в милли-/микро-/пико-секундах, при наличии кучи машин - добавить номер этой машины, можно добавить еще случайное число (чем больше его разрядность тем ниже вероятность коллизий)
    sprintf("%u",microtime(true)*1000000);
    еще есть метод uniqid, он делает примерно то же самое но возвращает hex строку.

    p.s. время на машинах должно быть синхронизировано с точным, чтобы не было такого что в какой то момент оно откатится назад на достаточное значение чтобы метод дал сбой
    Ответ написан
    5 комментариев
  • Как спроектировать фреймворк?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Фреймворк от начала и до конца (с пайплайнами, мидлварями и контейнером):
    https://youtube.com/playlist?list=PLE20id3DjfFnio1...
    Ответ написан
    5 комментариев
  • Array_chunk + последний эелемент массива дублируется в первый следующего?

    @Sasha333 Автор вопроса
    Всем большое спасибо, если кому либо необходимо решение, можно использовать любое из представленных. Немного результатов (на верность их не претендую, специальных условий никаких не делал, заливал просто на рабочий vds 1vcpu/1ram/ssd nvme):

    как шаблон

    <?php
    $start = microtime(true);
    $i = 0;
    while ($i <= 100000)
        $array[] = '127.0.0.' . $i++;
    
    //здесь предложенный код
    
    var_dump($array);
    echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';



    nokimaro

    <?php
    $start = microtime(true);
    $i = 0;
    
        while ($i <= 100000)
            $array[] = '127.0.0.' . $i++;
    
        $chunks = array_chunk($array, 4);
    
        foreach($chunks as $key => $vals)
        {
            $next_chunk_key = $key+1;
            if(isset($chunks[$next_chunk_key]))
            {
                //добавляем в начало след. чанка последний элемент текущего чанка
                array_unshift($chunks[$next_chunk_key], end($vals));
            }
        }
    
    var_dump($array);
    echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

    601d56f5bad50807779239.png


    Compolomus

    <?php
    $start = microtime(true);
    $i = 0;
    
        while ($i <= 100000)
            $array[] = '127.0.0.' . $i++;
    
        $result = []; // результат
        $len = 4; // длинна первого массива (менять для экспериментов)
        $c = ceil(count($array) / $len) - 1; // количество итераций
        $result[] = array_slice($array, 0, $len); // первый срез
        $offset = $len - 1; // смещение для первой итерации
        for (++$len, $j = 0, $i = 0; $i < $c; $i++, $offset += $len - 1, $j += $len) {
            $result[] = array_slice($array, $offset, $len);
        }
    
    var_dump($array);
    echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

    601d56fd2642d887983801.png


    GogElf

    <?php
    $start = microtime(true);
    $i = 0;
    
        while ($i <= 100000)
            $array[] = '127.0.0.' . $i++;
    
        $chunks = [];
        while($array){
          $current = array_splice($array, 0, 4);
          if(isset($old))
            array_unshift($current, $old);
          $old = end($current);
          $chunks[] = $current;
        };
    
    var_dump($array);
    echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

    601d5703ee8ab972315607.png


    мой вариант

    <?php
    $start = microtime(true);
    $i = 0;
    
        while ($i <= 100000)
            $array[] = '127.0.0.' . $i++;
    
        $array = array_chunk($array, 3);
        $count = count($array);
        for ($i = 0; $i < $count; $i++) {
            $lastip = end($array[$i]);
            if ($i < $count - 1)
                array_unshift($array[$i + 1], $lastip);
        }
    
    
    var_dump($array);
    echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';

    601d570d5ddb1159595831.png
    Ответ написан
    2 комментария
  • Низкоуровневое форматирование диска в Linux?

    Jump
    @Jump Куратор тега Твердотельные накопители
    Системный администратор со стажем.
    Низкоуровневое форматирование диска в Linux?
    Его делают исключительно на заводе, в домашних условиях его сделать невозможно без покупки специализированного оборудования.
    Низкоуровневое форматирование это запись сервометок на пластине.
    Высокоуровневое или обычное это просто создание операционной системы, т.е запись нескольких файлов.

    Я прочитал в интернете что на Linux для низкоуровневого форматирования можно использовать команду dd if=/dev/zero of=/dev/sdX.
    А я прочитал на заборе слово из трех букв.
    Команда DD это команда копирования данных, к форматированию вообще никаким боком отношения не имеет.

    Дело в том что я хочу подготовить диск к продаже + на нём имеются программные бэд блоки.
    Программные бэд блоки это блоки помеченные операционной системой.
    Если удалите ОС - удалятся и пометки.

    Я не понял, какая разница между zero и null?
    Zero это ноль, null это ничего.
    Ответ написан
    1 комментарий
  • В чём смысл ContainerExceptionInterface в PSR-11?

    @sidni
    Php Developer
    что бы правильно обрабатывать ошибки.
    очень часто нужно писать различное поведение (обработку) для различных видов ошибок, есть ошибки системные, есть ошибки на уровне фреймеврка, библиотек, и Вашего приложения, иногда надо поставить try...catch и игнорировать исключение (просто залогировав), иногда на основе этого исключения нужно отобразить пользователю читаемое сообщение, иногда откатить транзакцию, или авайрийно завершить работу.
    И чем больше разнообразие исключений тем больше возможностей правильно его обработать.
    Ответ написан
    2 комментария
  • В чём смысл ContainerExceptionInterface в PSR-11?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    В том, чтобы фреймворки и библиотеки эти интерфейсы реализовывали в виде своих исключений, но при этом не нужно было на эта конкретные реализации завязываться. Словом, смысл такой же, как и у любого другого интерфейса.
    Ответ написан
    6 комментариев
  • Какой из этих трех SSD взять?

    @antonwx
    Ssd этого ценового сегмента все плюс минус одинаковые, поэтому берите просто то, что больше нравится/имеет большую гарантию/дешевле стоит
    Ответ написан
    Комментировать
  • Чем заменить ReadBeanPHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо понимать что полноценной замены не существует.
    Данная программа - это два тупые молодца, одинаковые с лица, из мультика про Вовку в тридевятом царстве.
    Которые честно пытаются делать то что хозяин им велит, но в силу врожденного слабоумия всё делают не так.
    А всё от того что она хочет быть нянькой для программиста.
    Но если программисту нужна нянька, то такого "специалиста" надо гнать из профессии поганой метлой.
    А если хочет остаться - то да, надо учиться что-то делать самому. руками.
    ЗАРАНЕЕ продумывать и создавать схему БД. И менять только в случае осознанной необходимости, а не потому что вдруг передал в БД не тот параметр, который хотел.
    ЗАРАНЕЕ продумывать и писать SQL запросы. А не ждать что все их за тебя напишет тупая нянька.
    Понимать то как работает пхп с базой данных.

    Поэтому в качестве прививки от говнокода я порекомендую сначала
    - учить устройство БД. Создавать все свои схемы руками
    - учить SQL. Писать все свои запросы руками
    - освоить работу с БД из РНР на базовом уровне, через нативный ПДО.

    После того как это все будет от зубов отскакивать, и после пары выполненных проектов будет очевидно видна некоторая избыточность и повторяемость кода - ничинать писать свой первый Table Gateway. Ну, или если совсем нипалусяися - то осваивать что-нибудь хайповое, но хотя бы не такое маргинальное, например Елоквент.
    Ответ написан
  • Как быстро получить запись массива?

    @rPman
    var_export

    осторожно с циклическими ссылками

    p.s. на практике для сериализации данных используют serialize/unserialize (свой текстовый формат представления для php) и популярный кроссплатформенный json_encode/json_decode - осторожно, все это текстовые форматы

    настоятельно рекомендую использовать google protobuf, для которого есть реализация для php, удобно быстро эффективно, кросплатформенно и бинарный формат
    Ответ написан
    3 комментария
  • Как получить данные из скрипта, который расположен на другом сервере?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    В первом
    <?php
    $result = file_get_contents("http://test.com/script.php?c=100");
    var_dump($result);


    во втором
    <?php
    $c = $_REQUEST['c']; //Сюда нужно передать данные из первого файла
    $a = 5;
    $b = 3;
    $d = $a + $b + $c;
    
    echo $d;
    Ответ написан
    Комментировать
  • Почему виснет домен в chrome и как от этого избавиться при выполнении php скрипта?

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

    Возможные решения:
    1. session_write_close();
    2. не использовать сессии где они не нужны
    3. использовать драйвер сессий без блокировки
    Ответ написан
    Комментировать
  • Б/у MacBook или новый Asus?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Асус или подержанный леново 470 490 495
    Ответ написан
    2 комментария
  • Не могу удалить phpmyadmin?

    @antonwx
    Разве phpmyadmin - это не просто php скрипт? Просто снести его и всё.
    Ответ написан
    1 комментарий
  • Зачем в вакансии PHP разработчика знание 1C?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Многостаночник эникей. Думайте сами
    Ответ написан
    2 комментария
  • Зачем в вакансии PHP разработчика знание 1C?

    @aleks-th
    Как зачем.
    Чтоб бухгалтеру было кого грузить своими проблемами ;)
    Ответ написан
    Комментировать