Ответы пользователя по тегу PHP
  • Как не плодить процессы php демона?

    @MadridianFox
    Web-программист, многостаночник
    При запуске демона создавать файл, и смотреть создан ли он уже. Если создан - значит демон уже работает. Если нет - можно запускать.
    Ответ написан
  • Как сделать кнопку доступной админу?

    @MadridianFox
    Web-программист, многостаночник
    Вам нужно для каждого пользователя хранить его роль. В простейшем случае вы можете хранить нолик или единичку - нолик это простой пользователь, единичка - админ.
    Дальше, когда вы рендерите страницу, вы вывод кнопки обрамляете в условие - если у пользователя роль единичка, то показываем, иначе нет. Вот так:
    <?if($user["admin"] == 1):?>
        <button>Delete record</button>
    <?endif?>


    Хотя единичка это самый тривиальный случай и чаще требуется создавать полноценную систему авторизации. Например концепция авторизации RBAC - работает с ролями и разрешениями. Есть список разрешений, например:

    - создавать запись
    - редактировать запись свою
    - удалять запись свою
    - редактировать любую запись
    - удалять любую запись
    - назначать пользователя модератором
    - снимать с пользователя роль модератора

    И есть набор ролей

    - пользователь
    - модератор
    - админ

    вполне очевидно, какая роль какими правами должна обладать. Но есть одна оссобенность, роли могут наследоваться. Т.е. модератор является так же и пользователем. А админ является модератором. Это логично. Поэтому вводится иерархия ролей.

    Все эти данные о ролях мы конечно-же храним в БД. Итого имеем 3 таблицы:

    - таблица прав
    - таблица ролей
    - таблица связи ролей и прав

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

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

    В конце концов, мы должны прикрепить роль к пользователю. Мы можем разрешать пользователю иметь одну роль, или сразу несколько. И тут мы либо пишем id роли прямо в таблицу пользователя, либо делаем таблицу связи пользователей с ролями.

    После этого пишем код, который будет отвечать на вопрос - имеет ли этот пользователь указанное право?
    Этот код смотрит на его роль/роли, ищет в них такое право, если в них нет - то ищет в родительских ролях поднимаясь всё выше и выше по дереву ролей. Если дошёл до конца и права нет - сорян, тебе сюда нельзя.
    <?if(hasPermission($user, "delete_any_record") or hasPermission($user, "delete_own_record")):?>
        <button>Delete record</button>
    <?endif?>
    Ответ написан
    Комментировать
  • Как проверить отправленные значения формы, с использованием ООП?

    @MadridianFox
    Web-программист, многостаночник
    public function checkValue($arr) {
          if(!empty($_POST[$arr['name']])) {
            $this->value = $_POST[$arr['name']];
          }
          
           parent::checkValue($arr);
        }
    Ответ написан
    3 комментария
  • Как писать собственные функцит на PHP?

    @MadridianFox
    Web-программист, многостаночник
    она будет правильной?

    Пишешь, если работает - правильная, не работает - не правильная.
    Для начала этого достаточно.
    Как понять какие функции,параметры использовать

    Надо знать стандартную библиотеку и то api которое предоставляет тебе та CMS под которую ты пишешь. Этому очень легко научиться. Берёшь - и пишешь код. Когда сталкиваешься с чем-то чего не знаешь - гуглишь. Например - как отсортировать массив? Гугл знает. Раз загуглишь, два загуглишь, на третий раз вспомнишь, на четвёртый - начнёшь примерять те или иные функции ещё на этапе придумывания идеи. На это уходят месяцы и годы, но никто не говорил что научиться программировать легко.
    Придумай себе идею. Надо хотеть сделать что-то, а не просто хотеть написать код.
    Ответ написан
    Комментировать
  • Как в insert картинку добавить?

    @MadridianFox
    Web-программист, многостаночник
    Дело в том, что картинка это файл. Обычно файлы в бд не хранят. Вместо этого картинку куда-нибудь сохраняют как файл, а в бд записывают путь на этот файл.
    Ответ написан
  • Как проверить существование класса?

    @MadridianFox
    Web-программист, многостаночник
    1) это где такие лабораторные дают, что необходимо фреймворк написать?))
    2) а вы уверены, что вам нужна рефлексия и динамика вообще? Почему вы считаете, что использование неймспейсов это проблема?

    По PSR-4 неймспейсы как раз используются для автозагрузки классов, потому что неймспейс по сути должен повторять путь до класса. У вас какой-то не универсальный автолоад, как же файлы в других папках? Как вы будете подгружать классы из папок внутри папки controllers?
    Правильный подход - получать полное имя класса (с неймспейсом) и при автолоаде просто заменять слэши на прямые, чтобы получить путь до файла.

    Свой автолоад это обязательное условие? можно просто воспользоваться композером. Обязательно автолоад делать через устаревший __autoload(), а не через общепринятый spl_autoload_register()?

    Создать объект класса используя его название в строке можно просто используя переменную:
    $classname = "app\\controllers\\MainController";
    $methodname = "actionIndex";
    $controller = new $classname(); // тут сработает автолоад
    
    $controller->{$methodname}();


    При этом вы можете (и должны) обеспечить безопасность, так чтобы никто не мог передать через GET и имя класса и имя метода, и вызвать любой метод. Делается это очень легко.
    Во-первых путь из GET к нам приходит имя класса без неймспейса, ну логично. Неймспейс мы потом прицепим к нему. Так никто не сможет случайно создать объект любого класса, а только объект класса из папки с контроллером. Это не возбраняется.
    Во-вторых, если кто-то передал абра-кадабру, то надо не падать с ошибкой Class not found, логично. Для этого, перед созданием класса просто смотрим на то какие файлы есть в папке с контроллерами. Если там нет файла с тами же именем что и класс - то показываем 404.

    Потом, перед тем как вызвать метод, проверяем что он существует функцией method_exists($obj, $method_name), опять же - метода нет -- идите-ка вы на 404.

    И это нормально, что рефлексия и проверка существования класса требуют полное имя класса. Это ваш подход неверный - с самого начала вы должны прицепить к имени класса неймспейсом и работать только с полным именем.
    Ответ написан
    Комментировать
  • Как правильно использовать цикл?

    @MadridianFox
    Web-программист, многостаночник
    Вы не должны сразу писать энное количество элементов, а потом в них рассовывать результат. Нет.
    Вы должны в цикле выводить сразу разметку, в которую вставляете данные. Сколько итераций сделает цикл - ровно столько тэгов будет выедено.
    Пример ниже ужасен, но он показывает суть)
    $result = mysql_query("SELECT * FROM `catalog` WHERE `type`='$_GET[type]' ORDER BY `id` DESC");
    while($row = mysql_fetch_assoc($result)){
        echo "<div class=\"item active\">".$row["name"]."</div>";
    }
    Ответ написан
    4 комментария
  • Как сделать парсер?

    @MadridianFox
    Web-программист, многостаночник
    Универсальный - никак. Вы, конечно, можете попытаться положиться на тэги nav и main, но никто не гарантирует, что они используются, никто не гарантирует что в них то что вам надо.
    Ответ написан
    Комментировать
  • Как вывести данные из БД в таблицу php и изменить их?

    @MadridianFox
    Web-программист, многостаночник
    Всё просто:
    1) делаете запрос select nazv, dat, [sum] from my_table where ...
    2) в php проходитесь в цикле по полученным строкам, записываете отдельные значения в массивы и переменные
    3) выводите данные из массивов и переменных на страницу
    Ответ написан
    Комментировать
  • Static use methods?

    @MadridianFox
    Web-программист, многостаночник
    Нет. И не понимаю вашего желания. Статический метод отличается от простой функции тем, что при вызове метода видно какому классу он принадлежит. Это хорошо, т.к. у вас несколько классов могут иметь статические методы с одинаковыми названиями, например BlogPostAR::find() и CommentAR::find().

    То же касается и хелперов. Несколько библиотек могут предоставлять свои хелперы для похожих задач.
    А если вам лень набирать имя класса - ок, используёте as:
    use yii\helpers\ArrayHelper as ah;
    ah::toArray($obj);

    но и этого я вам не советую. Через месяц вы забудете что значит ah и придётся отвлекаться на поиск соответствующего use. Или ещё хуже - ваш код будет поддерживать другой человек.
    Гораздо понятнее, когда в коде написано ArrayHelper::toArray(), потому что все кто работает с yii к этому привыкли.
    Ответ написан
    4 комментария
  • Как сделать авто запись в базу?

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

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

    Если расчёт не сложный, результат нужен нечасто, то можно считать его на лету. Главное выделить алгоритм, который зависит от начальных данных и прошедшего времени. Ну например - пусть скидка растёт на 1 процент каждый месяц. Тогда алгоритм будет такой: берём дату регистрации, берём текущую, считаем количество прошедших месяцев, проверяем чтобы оно не выходило за какой-то предел (не может же быть скидка больше 100%, да и 100% тоже, этот предел устанавливается бизнесом), ну и добавляем это число к начальной скидке.
    Это то что вам надо.
    Ответ написан
    Комментировать
  • Как выполнить обычный http с помощью php?

    @MadridianFox
    Web-программист, многостаночник
    curl
    Ответ написан
    Комментировать
  • Не получается с кодом php для бота Telegram?

    @MadridianFox
    Web-программист, многостаночник
    Если вы хотите сделать по настоящему разговаривающего бота, то простым кодированием условий тут не обойтись. Необходимо использовать методы машинного обучения, которые в большинстве своём подразумевают преобразование текста в более машинно-понятный язык, например, N-граммы или тот же soundex..

    Если же это обычный бот - то почему бы не делать как все - команды на латинице со слешем в начале.

    По поводу тех проблем с которыми вы столкнулись: с кирилицей надо работать используя mb_*** функции (можно, конечно, mb_func_overload включить и не париться, но лучше явно использовать мультибайтовые функции).
    Выбор случайного элемента из массива - ну блин, есть функция array_rand(), но и без неё можно было догадаться взять случайное число от нуля и до размера массива и использовать в качестве ключа.
    Ответ написан
    Комментировать
  • Корректно ли реализована DI?

    @MadridianFox
    Web-программист, многостаночник
    В вашем коде нет DI.
    Задача DI - избавиться от жёсткой связи между классами. Т.е. если вы заходите вместо класса DB в классе NeedDB использовать другой класс (ну там тесты гонять или задача такая), то вам придётся редактировать код класса NeedDB. DI - это техника, когда вы "снаружи" определяете какой класс будет использоваться.
    Обычно для этого выделяется какой-нибудь ServiceLocator - объект у которого можно попросить объект нужного класса, и он отдаст его. Более радикальный способ - всегда передавать зависимости через конструктор. Этот способ идеологически более чистый, но и более навязчивый, т.к. вам надо всегда протаскивать зависимости через конструктор.
    Ответ написан
  • Как обратиться к единственному элементу массива не зная его ключа?

    @MadridianFox
    Web-программист, многостаночник
    current($arr) или end($arr)
    Ответ написан
    Комментировать
  • PHP: Почемгу round некорректно округляет до двух знаков?

    @MadridianFox
    Web-программист, многостаночник
    Округляет он правильно. Числа хранит "неправильно". Это связано с тем, как float хранится в памяти. Во многих языках программирования есть такая проблема, что якобы ровное число, будучи float становится больше или меньше целого на один бит.
    Как этого избежать не знаю. Когда сам с этим столкнулся, сделал костыль в виде конвертирования числа в строку, почему-то некоторые строковые функции умеют обходить эту проблему.
    Ответ написан
    Комментировать
  • Почему после нажатие на кнопку license возвращается в форму email и не выводит email?

    @MadridianFox
    Web-программист, многостаночник
    Очевидно - отправляя license форму вы методом post отправляете поля license и licensebutton. Вы не отправляете email.
    При этом как-то меняете вывод только если передано поле loginbutton.
    Не передано loginbutton - вывод не меняется. По умолчанию у вас показывается email-форма.

    Кстати вы не показали как вы работаете с объектами классов Email и LicenseKey. Совершенно непонятно зачем вы делаете это классами, зачем вы в этих классах код пишете в устаревших конструкторах, зачекм вы наследуете классы друг от друга.
    Ответ написан
    Комментировать
  • Как можно после нажатие на кнопку поевилась другой дизайн, примрр как у gmail, сначала нада подтвердить емейл а потоп появляетца пароль?

    @MadridianFox
    Web-программист, многостаночник
    А зачем вам $count, если вы можете решать что показывать сразу глядя на $_POST["email"].
    Т.е.
    if(isset($_POST["email"])){
       //....
    }else{
      //...
    }

    А вопрос требует уточнения. Многошаговую форму можно делать по-разному. Гугл так вообще может делать всё на JS и AJAX.
    Ну а концептуально, если хотите на перезагрузке страниц делать - да, либо форма каждый раз отправляется на текущую страницу и каждый раз добавляются новые данные, либо у вас есть несколько страниц, на каждой форма и они последовательно друг на друга отправляются. Данные между формами либо через скрытые поля передаются, либо собираются в сессию.
    Ответ написан
    Комментировать
  • Как передать данные с PHP сервера устройствам?

    @MadridianFox
    Web-программист, многостаночник
    Очень сильно зависит от того что вы хотите передать. На php можно сделать сервер, куда все три телефона шлют Http запрос, и один из них делает запрос, который кладёт в БД какие-то данные, а другие два - читают.
    Если вы хотите, чтобы сервер инициировал передачу данных другим телефонам, то нужно socket соединение. На php это, конечно, сделать можно, но преимуществ у php относительно других языков в этой области нет. Есть даже стереотип, что соккеты на php хуже чем на других языках.
    В любом случае, сначала надо определить какие данные вы хотите передавать и как концептуально эта передача будет осуществляться.
    Ответ написан