• Не работает php на reg.ru, как исправить?

    vabka
    @vabka
    Токсичный шарпист
    Кавычку забыл
    Ответ написан
    Комментировать
  • Функция php setcookie то работает, что нет?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Варианта 2: Пробел/перенос строки после ?>, или файл записанный с BOM. Первое лечится удалением лишних символов, второе через редактор кода - файл-кодировка-утф без бом.
    Ответ написан
    Комментировать
  • Почему не могу подключить php к базе данных MySQL?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Посмотрите внимательно - у вас даже здесь подсветка кода ломается из-за синтаксической ошибки.
    - echo "id: " . $row["nickname"]. " - Name: " . $row["result"]. " . "<br>";
    + echo "id: " . $row["nickname"] . " - Name: " . $row["result"] . "<br>";
    Ответ написан
    Комментировать
  • Как ссылке задать метод post?

    Ankhena
    @Ankhena Куратор тега HTML
    Нежно люблю верстку
    Имеет смысл поступить так:

    Заменить ссылку на кнопку buttonи связать её с формой с помощью атрибута form.
    Форму из этой кнопко-ссылки удалить.
    Останется просто <button form="id-вашей-формы">Log out</button>
    Ответ написан
    Комментировать
  • Как запретить запуск скрипта по крону больше 1 раза?

    @Barmunk
    /usr/bin/flock -w 600 /var/tmp/myscript.lock /root/myscript.sh


    Эта комманда запустит /root/myscript.sh и создаст lock-файл для данного процесса. Пока он активен, новый вызов данного скрипта не произойдет.
    После завершения программы, блокировка файла снимается и процесс может быть снова запущен.
    Параметр -w 600 определяет время ожидания комманды flock на освобождение lock-файла.
    Для моментальной отмены выполнения процесса используйте параметр -w 0, для ожидания же бесконечно долгого времени параметр нужно опустить.


    https://pingtool.org/ru/using-flock-to-ensure-only...
    Ответ написан
    Комментировать
  • Как передавать POST запросы при нажатии на элементы на странице?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Если стандартными средствами html, без javascript, то можно примерно так:
    <form id="myform" method="post" action="form.php"></form>
    
    <table>
      <tr>
        <td><button class="transparent-button" type="submit" form="myform" name="filter" value="filter 1">filter 1</button></td>
        <td><button class="transparent-button" type="submit" form="myform" name="filter" value="filter 2">filter 2</button></td>
        <td><button class="transparent-button" type="submit" form="myform" name="filter" value="filter 3">filter 3</button></td>
      </tr>
    </table>
    Ответ написан
    2 комментария
  • Насколько безопасна реализация запоминания пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Требуемый параметр называется "криптографической стойкостью".
    Большая часть самопальных решений "из букв и цифр" такой стойкостью не обладает.
    Как не обладает ей и uuid v4.

    На данный момент рекомендуемым решением является использование функции random_bytes()
    $token = bin2hex(random_bytes(24));
    Далее токен пишется в БД и в куки пользователю.
    Ответ написан
    Комментировать
  • В чем ошибка моего кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое время познакомиться с темной стороной программирования.
    Начинающие вайтишники искренне думают, что программист - это типа такой художник. Берет мольберт, поллитру, кисти и начинает ВАЯТЬ. Потом отходит на шаг, любуется делом рук своих, и снова. Ваять. А потом сразу заказчику, за большие деньги.

    Так вот, в реальности это всё не так.
    Большую часть времени программист не пишет код.
    А пытается разобраться, почему он не работает.

    Так что мы будем сейчас учиться это делать.
    Тем более, что это в принципе несложно.
    Главное не думать, что чем-то поможет сидеть и тупить в свой кодик. И приглашать других людей потупить в него тоже бессмысленно. Потому что причина может быть совсем не в нем. но даже если проблема и в коде, то искать её всё равно надо по-другому.
    В код не надо тупить. Его надо ЗАПУСКАТЬ.
    И выводить промежуточные результаты. Проверять его работу.
    Заранее выяснить, какие должны быть значения у переменных, и проверять их на каждом этапе.
    Где не совпадут - там и проблема.
    В идеале IDE сама покажет содержание всех переменных при трассировке, но если пишешь код в блокнотике, то даже тупо писать var_dump($bar1,$var2,$var3...); и смотреть что там лежит.
    Условия проверять еще проще, тупо echo 'зашли в условие if (!empty($user))';
    И если лежит не то, или эхо не выводится - вот тогда уже смотреть в код и думать, почему так получилось.

    В частности, при авторизации надо проверить две вещи:
    1. Находится ли юзер по логину
    2. если находится, то проверить корректность хэша. Для этого при регистрации надо вывести полученный через password_hash пароль и записать на бумажке
    потом запросить сохраненный из БД и сравнить

    Кроме того
    Разумеется, отладка невозможна без сообщений об ошибках.
    В половине случаев РНР человеческим голосом сообщает в чем проблема.
    Поэтому всегда, в любом окружении должно стоять error_reporting(E_ALL);
    плюс на домашнем компике полезно прописать ini_set('display_errors', 1); чтобы сразу видеть ошибки на экране.
    На боевом сервере разумеется поставить 0 вместо 1, и добавить ini_set('log_errors', 1);

    У меня только один вопрос.
    Какой смысл вообще делать парольную защиту, если любой придурок сможет спокойно авторизоваться через SQL инъекцию?
    Ответ написан
    9 комментариев
  • Как переписать подключение к базе данных, по принципам ООП?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    Это не стёб и не троллинг. Это единственный возможный ответ на этот хороший, в сущности, вопрос.

    ООП - это не картина, которую купил и на стенку повесил, для красоты.
    Это инструмент для решения какой-либо задачи.
    Если задачи нет, то и ООП применять не следует.

    в данном случае перед ООП надо выучить куда более базовые вещи.
    Например научиться применять готовые классы, такие как mysqli
    узнать почему за использование @ программистам в аду льют кипяток на самые нежные части тела
    выучить что exit('Ошибка подключения'); - это говнокод
    ну и открыть для себя разделение логики работы с данными и логики отображения. То есть сначала получить все данные, а потом только выводить.

    Эту страницу можно переписать в соответствии с принципами аккуратного кода

    Сначала сделать файл config.php.
    Этот файл можно будет исключить из системы контроля версий и таким образом иметь на каждом сервере свой

    <?php
    return [
        'db' => [
            'host' => '127.0.0.1',
            'port' => 3306,
            'db'   => 'pizza',
            'user' => 'root',
            'pass' => '',
            'charset' => 'utf8mb4',
        ]
    ];

    потом сделать файл mysqli.php
    Этот файл можно будет включать во все скрипты, которым нужно соединение с БД
    <?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $db = new mysqli(
        $config['db']['host'], 
        $config['db']['user'], 
        $config['db']['pass'], 
        $config['db']['db'], 
        $config['db']['port']
    );
    $db->set_charset($config['db']['charset']);
    $db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);


    Потом сделать страницу pizza.tpl.php в которую поместить весь HTML
    .
                <select id="single" class="form-control" name = '1234' >
                    <option value="" disabled selected style='display:none;'>выберите тип</option>
                    <?php foreach($types as $object): ?>
                        <option value ="<?=$object['id']?>"><?=$object['name']?></option>
                     <?php endforeach ?>
                </select>


    И потом сделать страницу pizza.php на которой собрать это всё вместе
    <?php
    $config = require 'config.php';
    require 'mysqli.php';
    
    $sql="SELECT * FROM pizza";
    $types=$db->query($sql)->fetch_all(MYSQLI_ASSOC);
    
    include 'pizza.tpl.php';


    После этого можно будет потихоньку приглядываться к ООП.
    Например сделать класс pizzaModel
    Но делать его будет иметь смысл только тогда, когда мы будем знать, какие еще действия с пиццей будет производить этот код
    Ответ написан
    5 комментариев
  • Как оптимизировать одновременную подгрузку 2000 картинок низкого качества?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Однозначно спрайты.
    Во первых - поэксперементировать с форматом, если лого у вас в основном малоцветные - больше подойдет пнг, нежели вебп или жпег. Фотошоп позволяет достаточно эффективно оптимизировать картинку.
    Во вторых - сумма байт от всех картинок скорее всего будет в разы больше одной большой, в силу алгоритмов сжатия, так как они работают эффективнее на большой картинке.
    В третьих - "резать" на фронте ничего не надо, просто вставляете бэкграундом со смещением.
    Как вариант для избегания пустых мест в этом блоке - скрыть его до загрузки спрайта. По загрузке сделать видимым.
    Ответ написан
    Комментировать
  • Как сделать IN если возможные значения записаны строкой?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В ужасе выкинуть таблицу, в которой поле может иметь вид 1,2,3,5,15 и потом еще полчаса тошнить в унитаз от омерзения.
    Купить букварь по базам данных
    Прочитать в нем такое слово как "реляционная база данных"
    Сделать нормальную таблицу, в которой 1,2,3,5,15 будет не в одной строке, а в ПЯТИ
    Дальше всё как и было
    Ответ написан
    6 комментариев
  • Почему не может работать класс и методами??

    @Dark_Dante
    Потому что у тебя в объявлении конструктора ___ - три подчеркивания, а должно быть два, __construct а не ___construct
    Ответ написан
    Комментировать
  • Не отправляется MYSQL ЗАПРОС?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    https://qna.habr.com/q/918033#answer_1847841
    И в целом рекомендую прочитать ответы на этой странице, поскольку со всеми проблемами придется столнуться
    Ответ написан
    Комментировать
  • Как отфильтровать массив?

    MvcBox
    @MvcBox
    Software Developer [C/C++/JS(for Node.js)/etc]
    const result = arr.filter(item => item.genre_ids.includes(28));
    Ответ написан
    Комментировать
  • Почему я не могу поместить json в php массив?

    по хорошему использовать stream_context_create, если через file_get_contents.

    а так можно еще раз завернуть в
    $array_id = json_decode(json_decode($json, true), true);
    Ответ написан
    Комментировать
  • Как формируется get параметр у сайта?

    PavelK
    @PavelK
    Здравствуйте.

    Для кодировки/сжатия используется lz-string: https://github.com/pieroxy/lz-string

    На JS выглядит как-то так:
    let jstr = JSON.stringify({
    	pagination: {
               p: 33, //-- Page number
               pp: 25 //-- Per page
           }
    });
    
    let s = LZString.compressToEncodedURIComponent(jstr);
    
    console.log(s);
    Ответ написан
    2 комментария
  • Необходимо брать данные почты с input, и отправлять на эту почту сообщения. Как можно сделать?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Проще всего взять phpMailer
    https://github.com/PHPMailer/PHPMailer
    Ответ написан
    Комментировать
  • Как организовать удаленную работу программистов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Организация работы
    software engineer
    Мессенджер, разработчики должны знать общее время друг друга, должно хотя бы несколько часов совпадать.
    Ответ написан
    Комментировать
  • Как можно сократить говно-код?

    @rPman
    Кучи if ($request->input("type") заменяй на switch case, тем более далее по тексту у тебя оно используется, пиши код хотя бы в одном стиле.

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

    Про права доступа, у тебя точно 2 состояния - public и authorized? может у тебя еще есть какой-нибудь superuser? или еще есть права на основе данных (например если статус операции 'такой то' то действие запрещено)... хотя метод по любому должен быть ->allowed() который собирает данные по текущему пользователю, состоянию, данным и т.п. хотя лучше разделять права доступа по роли и по состоянию, пусть будет пара методов.

    Вот такие строчки "required|numeric|min:1|max:10000" - bad practics, магические константы, что значит 10к, 15, 3, 24, 5000... везде разные, что почему зачем, уже через пол года ты не вспомнишь а уж другой программист и подавно не поймет. Оформляй в виде функции-генератора или даже класса, документируй все значения, даже если это значения от балды, когда ты их выдумывал какой то смысл ты в это вкладывал - опиши это в коментариях в этой функции или классе, не обязательно все выносить в конфиг файл, сам отдельно лежащий файл с таким классом уже этот конфиг. Мало того, почему сериализация массива такая странная, на рынке существует уже безоговорочный стандарт json, и machine и human readable, накладные расходы минимальны (можно заставить паковать nginx, по трафику будет не на много больше чем умно оформленный protobuf), тем более у тебя там ошибки уже в json выдаются.
    Ответ написан
    2 комментария