• Как сделать простой php-роутер?

    orlov0562
    @orlov0562 Куратор тега PHP
    Jumast, если я правильно понял, то ты хочешь чтобы index.php с логикой роута лежал тут
    www/web/index.php
    а страницы были тут
    www/pages/index.php
    www/pages/user/index.php

    тогда просто в index.php добавь еще один dirname
    $filePath = dirname(dirname(__FILE__)).'/pages/'.$route.'.php';

    полный путь подключения, в этой переменной - $filePath , ты ее можешь вывести на экран, типа того
    $filePath = dirname(dirname(__FILE__)).'/pages/'.$route.'.php';
    die($filepath);

    чтобы понять какой именно путь оно в итоге попытается загрузить, ну и вот по этому пути должен быть файл
    Написано
  • Почему не работает оператор If?

    orlov0562
    @orlov0562 Куратор тега PHP
    SUS_ITS_LOVE, попробуй вот так и напиши нам результат
    ...
    $type = $_POST['type'] ?? '';
    switch(trim($type)) {
        default: // если тип не опознан сгенерировать ошибку
            throw new Exception('Undefined type: '.$type);
        break;
        case 'surname': 
            $question = $_POST['surname_3'] ?? '-empty-';
        break;
        case 'id_publick': 
            $question = $_POST['id_3'] ?? '-empty-';
        break;
        case 'phone_num': 
            $question = $_POST['phone_num_3'] ?? '-empty-';
        break;
    }
    
    var_dump([$type, $question]);
    ..
    Написано
  • Почему не работает оператор If?

    orlov0562
    @orlov0562 Куратор тега PHP
    Konata Izumi, хехе, двойка тебе по матчасти, сам сходи и почитай доку

    Регистрозависимые
    - переменные
    - константы
    - ключи массивов
    - свойства классов
    - константы в классах

    РегистроНЕзависимые
    - функции
    - конструкторы
    - имена методов
    - ключевые слова и конструкции (if, else, null, foreach, echo etc.)

    это все будет работать одинаково, ошибок не будет
    <?php
    
    IF (2==2) echo 123;
    iF (2==2) Echo 123;
    If (2==2) eCHo 123;
    Написано
  • Ошибка в Laravel ( Whoops, looks like something went wrong.), как ее исправить?

    orlov0562
    @orlov0562
    annonimus, там всего скорее компиляция происходит, поэтому могут быть смещения.

    1) Попробуй поискать где этот файл, что-то типа:
    /home/admin/web/site.com/public_html/storage/framework/views/2c05e1cb686ec3fadc7085b804e2e46b где 2c05e1cb686ec3fadc7085b804e2e46b - это хеш из ошибки, и в этом файлике посмотри указанную строку

    2) Попробуй оставить файл темплейта пустым типа того:
    @extends("app")
    @section('head_title', $userinfo->username.' | '. getenvcong('sitename'))
    @section('modedefault', 'mode-add')
    @section("content")
    
    @endsection

    и посмотреть поменяется ли или исчезнет ошибка

    если исчезнет, то далее методом исключения блоков ищи место где она валится
    Написано
  • Как проверить повторы в бд и не вносить запись при их нахождении?

    orlov0562
    @orlov0562 Куратор тега PHP
    Максим, да, это работает так
    -------------
    id - primary
    a1 = unique
    a2 = unique
    a3
    -------------
    При INSERT IGNORE mysql проверит есть ли уже в полях a1 или a2 значение такое же как в запросе. Если есть, данные не будет добавлены.

    Так же может быть составной индекс
    -------------
    id - primary
    a1 unique (a1,a2)
    a2 unique (a1,a2)
    a3
    -------------
    В таком случае будет проверка есть ли уже значение a1+a2, если есть, то данные не будут добавлены

    А вот если тебе надо убедиться что a3 будет уникальным, тогда надо делать сперва SELECT а затем INSERT
    Написано
  • Как проверить повторы в бд и не вносить запись при их нахождении?

    orlov0562
    @orlov0562 Куратор тега PHP
    Максим, если по другим полям есть уникальный индекс в БД, то эта конструкция сработает и для них. Если уникального индекса нет, то только так, как ты делал: в начале делаешь запрос с проверкой есть ли уже такие данные в базе по нужным условиям, далее если есть пропускаешь, если нет добавляешь.
    Написано
  • Почему не подключается БД к сайту laravel в docker?

    orlov0562
    @orlov0562
    Chernichko, попробуй вместо 127.0.0.1 написать 72-mysql и порт 3306

    суть в том, что твои контейнеры находятся внутри одной сети, поэтому должны использовать внутренние адреса для коммуникации. те которые 8082 и тд, это порты твоей тачки, обращаясь на которые ты попадаешь на порты контейнеров со своей машины. А контейнеры между собой должны использовать внутренние. При этом 127.0.0.1 внутри контейнера указывает на этот самый контейнер (т.е. в ларавеле, всего скорее это будет 72-php-fpm-my , а не mysql).

    Представляй себе это как виртуальные машины
    [
        [webserver] сетевое имя 72-webserver, внешний порт 80
        [php-fpm]   сетевое имя 72-php-fpm-my, внешний порт 9000?
        [mysql]     сетевое имя 72-mysql, внешний порт 3306
        [phpmyadmin]
    ] <- это docker-compose "контейнер", у которого общая сеть для контейнеров внутри
    
    [Chernichko] <- это твоя тачка
    - 80 прокинут на [webserver]:80
    - 8082 прокинут на [mysql]:3306
    - 8183 прокинут на [phpmyadmin]:80


    Еще чтобы удостовериться, что прописано верное название хоста mysql, можно зайти в терминал webserver-а, набрав в консоли твоей тачки
    docker exec -ti 72-webserver /bin/bash
    и там выполнить пинг mysql хоста
    ping 72-mysql
    должны идти пинги
    Написано
  • Как сделать так, чтобы сайт работал дальше при закрытии?

    orlov0562
    @orlov0562
    pakhrudin,
    Допустим это занимает 30сек. Пользователь не дождавшись завершения, закрывает страницу.

    Это как раз решается вот так:
    <?php
    ignore_user_abort(true);
    set_time_limit(60); // при условии что макс время выполнения 30
    // тут долгое выполнение

    второй вариант, можно использовать, чтобы не заставлять пользователя ждать, т.е. генерируешь ему страницу или ответ, затем в коде у тебя fastcgi_finish_request, затем ниже выполняешь запись в базу. В итоге пользователь получает ответ, а ты продолжаешь свои темные дела. Только, это зависит от настроек веб-сервера, поэтому советую сразу тестить будет работать у хостера или нет, если у тебя нет возможности самому конфигурировать сервер.
    Написано
  • Как лучше организовать БД для плейлистов с музыкой?

    orlov0562
    @orlov0562
    z0ng, если я правильно понял уточнение, то формат такой
    hidden_playlist
    - song_id
    - date

    user_playlist_1
    - song_id -> hidden_playlist.song_id

    тогда, я бы копировал hidden_playlist.date в user_playlist_1 в момент добавления песни, т.е. вот так бы сделал

    user_playlist_1
    - song_id -> hidden_playlist.song_id
    - date -> hidden_playlist.date

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

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

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

    orlov0562
    @orlov0562 Куратор тега PHP
    Twitt,
    Еще вариант, если в базу прямо вообще не хочется, это хранить key-value массив в json/yaml файле. Но, если база уже есть, то я бы выбрал именно ее. Удачи! :)
    Написано
  • Как откючить автоматическу конвертацию \n в \r\n в textarea?

    orlov0562
    @orlov0562 Автор вопроса
    Дмитрий,
    Что вы можете с этим сделать? Наверное ничего.

    Пока что, я полагаю, что могу перехватить вставку из буфера обмена и заменять символы перевода строки/каретки хотя бы на визуальные аналоги используя contenteditable режим, параллельно имея не модифицированную копию, которая и будет слаться на бэкэнд, например в base64. Но, это те еще костыли, думал есть попроще варианты.. Но, тут еще очень большой вопрос, кто это делает ОС или браузер, если ОС, например по Ctrl+C, то там уже без вариантов..
    Написано
  • Как откючить автоматическу конвертацию \n в \r\n в textarea?

    orlov0562
    @orlov0562 Автор вопроса
    dollar, ты заголовок и описание вообще читал?
    Написано
  • Как откючить автоматическу конвертацию \n в \r\n в textarea?

    orlov0562
    @orlov0562 Автор вопроса
    Дмитрий, я ничего не запрещаю, мне надо чтобы работало два варианта:
    1) пользователь делает Ctrl+V текста "a\nb" и отправляет на сервер
    2) пользователь делает Ctrl+V текста "a\n\rb" и отправляет на сервер

    Мне надо чтобы на сервере, я получил
    1) "a\nb"
    2) "a\n\rb"

    Сейчас в обоих случаях
    1) "a\n\rb"
    2) "a\n\rb"

    И эту конвертацию делает то ли браузер (тестил в FF и Chrome), то ли вообще ОС. Пока не знаю зачем.
    Написано
  • Как в linux автоматизировать копирование файлов с переименованием?

    orlov0562
    @orlov0562
    Сергей Быданов,

    все что после -exec будет выполнена как одна команда, вот так формат понятнее будет

    -exec <command> <command-param-1> <command-param-2> ;/


    ;/ = это синтаксис find и означает конец объявления команды передаваемой в -exec

    т.е. в нашем случае получается команда

    sh -c '....' sh {}

    {} = маска, которая будет заменена на путь, это делает сам find

    т.е. у нас итоговая команда получится такой

    sh -c '....' sh ./20190318.xls

    вот другой пример

    find . -type f -exec echo foo-{}-bar \;

    выведет

    foo-./123/20190318.xls-bar
    foo-./20190318.xls-bar


    теперь, разберем синтаксис

    sh -c '....' sh ./20190318.xls

    это уже относится к команде sh -c, у которой формат

    sh <command> <param0> <param1> ..

    Все значения в param0, param1 и т,д., будут установлены в переменные окружения $0, $1 и т.д

    Вот понятный пример, так выведется foo:

    sh -c 'echo $0' foo bar

    а вот так bar

    sh -c 'echo $1' foo bar

    соответственно в нашем случае

    sh -c '....' sh ./20190318.xls

    означает запустить команду и установить
    $0 = sh
    $1 = ./20190318.xls
    Написано
  • Как в linux автоматизировать копирование файлов с переименованием?

    orlov0562
    @orlov0562
    Сергей Быданов, всего скорее так, потому что я тестировал на файле расположенном в том же каталоге, где и выполнялся скрипт (т.е. без подпапок).

    Я думаю, ты уже разобрался, но напишу чуть подробнее, для тех кто придет сюда позже:
    find -name "*.xls" -exec sh -c 'mv "$1" `echo $1 | grep -o -E "[0-9]+"`.xls' sh {} \;


    вот эта часть ищет файлы с расширением xls и выполняет для каждого найденого резульатата дальнейшую команду
    find -name "*.xls" -exec sh -c
    т.е. если понадобиться усложнить маску поиска файлов, то править надо именно тут, например выбрать файлы только с вхождением "за 2018"..

    Далее команда которая будет применена к каждому найденому файлу
    mv "$1" `echo $1 | grep -o -E "[0-9]+"`.xls

    mv = стандартная команда перемещения файла, формат mv <откуда> <куда>
    откуда: $1 = путь найденный командой find (т.е. полное имя файла "Статистика за 20190318.xls")
    куда: выражение echo $1 | grep -o -E "[0-9]+"`.xls

    echo $1 | grep -o -E "[0-9]+"`.xls

    echo $1 = вывести имя файла ("./Статистика за 20190318.xls"), которое через pipeline передается в следующую команду
    grep -o -E "[0-9]+" = оставляет только цифры из строки ("./Статистика за 20190318.xls" => "20190318")
    .xls = вконце добавляется .xls, т.к. оно будет потерто grep-ом

    Именно в этом месте, из "Статистика за 20190318.xls" удаляется все кроме цифр и приклеивается .xls, в итоге имеем "20190318.xls"

    Чтобы поменять логику, например имя файла будет "Статистика за 2019-03-18.xls" и на выходе надо "2019-03-18.xls", надо менять обработку именно тут. Обработать можно множеством способов, погуглить можно так "Обработка строк в bash"

    Все это выражение заключено в кавычки, те что на букве Ё. Я их называю "обратные кавычки", но правильно грависы или backticks. Такая конструкция выполняет то, что указано внутри и возвращает результат. Тоже самое можно сделать, используя конструкцию $(...). Т.е. просто берем $1 (полное имя файла), обрабатываем его и возвращаем новое.

    Теперь, вся магия раскрыта и можно составить пару выражений, для тестирования

    Поиск файлов и просмотр что передается в $1
    find -name "*.xls" -exec sh -c 'echo $1' sh {} \;

    Результат (один в один файловая структура)
    ./123/20190318.xls
    ./20190318.xls


    Тестирование обработки (того, что получится в итоге)

    find -name "*.xls" -exec sh -c 'echo `echo $1 | grep -o -E "[0-9]+"`.xls' sh {} \;


    Результат
    123 20190318.xls
    20190318.xls


    Обратите внимание, что произошло с путем имеющим вложенный файл - исчезли точки и слеши, чтобы исправить можно поменять регулярку, чтобы она оставляла слеши и точки

    find -name "*.xls" -exec sh -c 'echo `echo $1 | grep -o -E "[0-9./]+"`xls' sh {} \;


    Результат:
    ./123/20190318.xls
    ./20190318.xls


    В общем, в зависимости от задачи (есть те или иные символы в именах), надо менять регулярку или весь процесс обработки имени файла.
    Написано
  • Есть ли способ объявить переменную при использовании UPDATE и ORDER BY?

    orlov0562
    @orlov0562 Автор вопроса
    Пробовал так, но не работает.

    Результат
    id	number
    1	1
    2	1
    3	1

    а должен быть
    id	number
    1	3
    2	2
    3	1
    Написано
  • Как массово обновить строки, не вызывая 200 тыщ запросов?

    orlov0562
    @orlov0562
    Нашли решение, для тех кто придет из поиска: запрос будет вот такой
    UPDATE projects SET rank=(@cnt:=@cnt+1) WHERE !@cnt:=0 ORDER BY lift_at

    Подробности, по ссылке выше.
    Написано
  • Есть ли способ объявить переменную при использовании UPDATE и ORDER BY?

    orlov0562
    @orlov0562 Автор вопроса
    Класс, то что надо!

    запись ужасная

    Зато решает описанную проблему! Понятно, что описанная задача, зачастую не возникнет или будет решаться по другому. Но, для образовательных целей отличный пример. Во всяком случае, я не знал о такой возможности.
    Написано
  • Есть ли способ объявить переменную при использовании UPDATE и ORDER BY?

    orlov0562
    @orlov0562 Автор вопроса
    Лентюй, речь не про то, как решить задачу, а про то есть ли способ использовать переменную в случае UPDATE ORDER BY, без предварительной установки через SET
    Написано