Задать вопрос
  • Что делать при ошибке в MySQL: "Указан слишком длинный ключ. Максимальная длина ключа составляет 1000 байт"?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    Все дело в том что utf8mb4_unicode_ci использует 4 байта для кодирования одного символа, плюс 1 байт хранит длину строки. Соответственно (255+1)*4 = 1024.
    Уменьшит размер данных можно, и даже нужно, с учетом что текущие данные не будут повреждены. Проверить максимальную длину строки:
    SELECT MAX(fieldname) FROM table;

    Выбор размера данных зависит от их возможных значений. Например если поле может быть только "да", "нет" , "иногда" то достаточно varchar(6)

    Кроме того если строковое поле имеет ограниченный набор значений имеет смысл использовать enum или отдельную таблицу со словарем
    Ответ написан
    Комментировать
  • Какая есть простая программа для представления БД в визуальном виде - чтобы таблички с полями и отношения между ними?

    DevMan
    @DevMan
    navicat, dbforge, mysql workbench и ещё 100500 других.
    проще самому поискать и перебрать - хотелки и вкусы у всех разные.
    или хотя бы обозначить интересующие субд.
    Ответ написан
    Комментировать
  • Как уменьшить нагрузку кода?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    либо nested sets структура(проще всего) либо триггер срабатывающий на изменение кол-ва рефералов и вызывающий обновление у записей-родителей
    Ответ написан
    Комментировать
  • Проблемы в начале пути изучения языка программирования?

    Awilum
    @Awilum
    Частный разработчик, ментор и преподаватель курсов
    Если вы уже знаете основы PHP, HTML, CSS, то рекомендую вам далее уже на практике оттачивать свои навыки, знания и решать реальные задачи. Например я в свое время начинал с реальных работающих проектов, различных движков сайтов и форумов, фреймворков, разбирался в том как они работают, делал модификации, плагины, снипеты, темы и тд.
    Ответ написан
    1 комментарий
  • Проблемы в начале пути изучения языка программирования?

    Sanes
    @Sanes
    Академические задачи пусть решают на Олимпиаде. Начните делать что-то практическое.
    Ответ написан
    1 комментарий
  • Как установить phpmyadmin на удаленный сервер?

    sashkets
    @sashkets
    Прекратил отвечать после 24.02.2022
    скачать с оффсайта на сервак
    распаковать
    законфигурить config.inc.php
    и выложить через веб-сервер
    прикрыть от любопытных глаз
    Ответ написан
    Комментировать
  • Wordspress и написание кода вручную, в чем разница?

    @AstraVlad
    Финансист, консультант, программист-любитель
    Потому что любой конструктор ограничен тем набором блоков, которые он предоставляет. Грубо говоря, невозможно собрать из Лего штопор даже если блоки будут стальными: форма не позволит. Так что как только вам нужно сделать что-то не укладывающееся в стандарт конструктора, тут же приходится что-то учить.
    Ответ написан
    4 комментария
  • Как спосить так чтобы нормально ответили?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Ну я обычно троллю просто потому что родился троллем :D Когда ты серый, длинноухий и волосатый - как-то трудно себя вести по-другому :D

    Спокойно, это был оффтопик.

    Я могу сказать, каких критериев придерживаюсь я, чтобы дать на вопрос нормальный ответ.

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

    А могу сказать, на какие вопросы я точно начну троллить.

    Когда:
    - вижу вопрос с тегом KALI и текстом "памагите, ни работаит ничегго!"
    - вместо вопроса автор пытается всучить задание, лабу, контрольную, тест - школота такая школота, она никак не поймет, что можно сдать конкретную лабу - но нельзя будет "сдать" работу, на которую потом устроишься
    - вижу что автор вопроса делает что-то явно противозаконное, типа очередного рассыльщика спама
    - автор вопроса в ответ на комментарии начинает буреть, говорить что он тут самый умный и шли бы мы со своим мнением, он тут пришел технический вопрос задать (и никак не поймет, что не существует технических вопросов в отрыве от жизненной ситуации)

    Как правило, каков вопрос - таков и ответ. Если в ответ начинают троллить - значит Вы задали с точки зрения троллящего глупый и неуместный вопрос, типа "Поставил KALI, она мне все снесла, ничего не работает, памагите!"
    Ответ написан
    Комментировать
  • Как вывести из таблицы данные из MySql по критериям через PHP?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    mysqli_fetch_assoc в цикл завернуть. В инете полно примеров как разбирать ответ от mysql через while.
    Ответ написан
    1 комментарий
  • 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
    Фреймворк от начала и до конца (с пайплайнами, мидлварями и контейнером):
    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 комментария