• Как можно get запрос превратить в POST?

    orlov0562
    @orlov0562 Куратор тега PHP
    Идея вот такая

    1) Когда мы сабмитим форму, отправляются такие POST данные
    {"Form data":{"action":"polls","view":"process","poll_id":"2","poll_2":"8","poll_2_nonce":"f5a9743a97"}}


    2) Мы создаем вот такой файл
    tripslog.ru/poll-get.php
    <!doctype html>
    <html>
    <body>
    <form action="http://tripslog.ru/wp-admin/admin-ajax.php" method="POST" id="form">
    <?php foreach($_GET as $k=>$v):?>
        <input type="hidden" name="<?=htmlspecialchars($k)?>" value="<?=htmlspecialchars($v)?>">
    <?php endforeach?>
    </form>
    <script>
        document.getElementById('form').submit();
    </script>
    </body>
    </html>

    тут мы на основе всех GET переменных создаем поля в POST форме, а потом сразу же сабмитим ее

    Это тестовый вариант, его можно улучшить, например делая запрос через Ajax и затем средствами JS редирект куда-нибудь на другую страницу.. суть та же, конвертировать GET в POST

    3) Теперь делаем такой запрос
    http://tripslog.ru/poll-get.php?action=polls&view=process&poll_id=2&poll_2=8&poll_2_nonce=f5a9743a97


    И мы сперва перейдем на нашу страницу, а потом будет сделан POST запрос к голосовалке..

    Но, к сожалению, всего скорее это работать не будет, в текущем примере, тк в форме есть вот такая переменная "poll_2_nonce=f5a9743a97" которая генерируется при каждом отображении формы. Соответственно, в момент формирования GET запроса ты не будешь знать нужное значение. Это используют как защиту от накруток.

    Чтобы обойти это ограничение, надо писать более сложный код, с использованием Curl, который будет заходить на страницу с формой, сохранять куку сессии, вытягивать нужные "nonce" хеши для текущей сессии и затем делать POST запрос с использованием всех этих данных.

    Но, все равно проверь, мб я ошибаюсь на счет назначения этого хеша.
  • Подставить "/" после двух символов, как?

    orlov0562
    @orlov0562
    pw0ned,

    тут убирается слеш и потом добавляется по новой

    Если тебе нужно более универсальное решение, погугли по ключевику: masked input
  • Как сделать простой 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

    Подробности, по ссылке выше.