Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Почему не работает регистрация?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Скажи, а кто писал эти комментарии? Кто этот гений, который советует ставить символы "в начале строки или в середине"?
    Я думаю, это без шуток, самый важный вопрос, без ответа на который твою проблему не решить
    Ответ написан
    2 комментария
  • Зачем создавать переменные для подключения к БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Отдельно писать в том же самом файле смысла немного.
    А вот если написать переменные в отдельном файле, то при заливке на сервер, где у тебя будут другие параметры доступа к базе данных, очень удобно будет держать два разных файла на сервере и на локальном компе. Так ты сможешь на сервере обновлять код и не перезатирать настройки

    про собаку уже написали, но тут еще много косяков.
    Вот нормальный код для соединения через mysqli
    Ответ написан
    Комментировать
  • Как разбить массив на части PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    в цикле
    все операции над массивами производятся в цикле
    для перебора массивов в РНР используется оператор foreach
    Ответ написан
    Комментировать
  • Как узнать с какой страницы (php-файла) данные html-формы попали в $_REQUEST?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если "не изменяя", то будет ненадёжно.
    Так что если надо всегда знать с какой страницы, то лучше эту информацию передавать в форме.
    Ответ написан
    3 комментария
  • Как подключится к базе данных, через PDO или mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    PDO примерно в 10 раз удобнее, чем mysqli, поэтому по возможности лучше выбирать его.
    Тем более что у пдо только объектный стиль, и нет проблемы выбора стиля.

    Чисто ради буквального ответа на вопрос
    Как подключиться к Mysql через PDO
    Как подключиться к Mysql через mysqli
    Ответ написан
    Комментировать
  • Почему переменная в функции NULL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Про null уже объяснили, а я напишу про другую глупость.
    из DB_query надо убрать try catch со всеми причиндалами.

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

    Поэтому метод должен выглядеть так
    function DB_query($DB_query, $params = null) { 
            $query = $this->pdo->prepare($DB_query);
            $query->execute($params);
            return $query;
        }

    больше ничего не нужно
    Ответ написан
    2 комментария
  • Где тут ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    То есть ты пишешь класс еггог, но при этом не умеешь включать элементарное отображение ошибок в РНР?

    Забудь про классы на годик или два, сотри этот класс и учи основы. Это не наезд - я серьёзно.
    Всё, что новички так старательно выписывают в своем коде, на самом деле уже есть РНР. Ничего от себя писать не надо. Особенно класс еггог.

    Всегда пиши в начале своего кода две строчки
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

    на боевом сервере меняй 1 на 0.
    Это ВСЁ что нужно для обработки ошибок
    Ответ написан
    3 комментария
  • Почему Service Locator это зло и что использовать вместо?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все эти страшные слова - они на самом деле всегда про одно и то же - про связность. Когда ты хардкодишь внутри класса вызов какого-то конкретного сервиса - ты намертво к нему привязываешься. И чтобы поменять сервис на другой, ты будешь вынужден поменять код класса. Окей, поменял. И тут же в другом месте, где этот же класс использовался, что-то сломалось! И что теперь? Делать два класса, которые различаются одной строчкой? Нет конечно. А как тогда использовать один и тот же класс для обработки разных входящих данных (или одних и тех же данных, но разными способами)? Сделать его поведение изменяемым. То есть сделать изменяемыми те инструменты, которыми он пользуется - т.е. его зависимости.

    Поэтому все зависимости обычно передаются через конструктор (и поэтому и называются инъекция зависимостей.)

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

    Но тут надо понимать, что всё это работает только при правильном применении ООП. А точнее просто при применении ООП. Потому что 98% "ООП" кода, который пишется на РНР - это голимая процедурщина, даже если она обёрнута в классы и методы. Если у тебя метод класса представляет из себя стену кода, которую ты тупо перенёс из файла, инклюдившегося в любимое похапешное спагетти - то это не ООП. Это та же процедурщина, вид сбоку. И смысл использования dependency injection ты с ним не почуствуешь. Будешь конечно применять, но в качестве карго культа - потому что тебе это на тостере написали.
    А вот когда твой код начнет становиться действительно объектным - тогда стразу станет понятнее.


    Похожим на сервис локатор является сервис- или DI-контейнер. Используемый вручную, он является тем же самым сервис локатором. Поэтому вручную его никогда не надо вызывать - что и запрещается в симфоневских конроллерах - а только для автоматического создания классов. В МВЦ у тебя ведь очень многие объекты создаются автоматом - сущности, контроллеры. И вот для того, чтобы при автоматическом создании экземпляра класса у тебя были на руках все требуемые сервисы - и нужен контейнер.

    Соотвтственно, ответ на вопрос "что использовать?" очень простой:
    - при ручном создании экземпляра объекта, все зависимости передавать в него через конструктор, а не получать "из воздуха" в коде.
    - при автоматическом создании экземпляра объекта, использовать dependency injection container

    В этим смысле очень полезно освоить Симфони - строгий фрейворк, в котором нет сервис локатора и в котором запрещено пользоваться контейнером напрямую.
    Ответ написан
    4 комментария
  • Не работает база данных в class'ах (выдает ошибку при выводе массива) PHP, что не так?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    подход в принципе ничего, но реализация - тихий ужас.
    вот так будет хотя бы немного похоже на "класс" плюс исправление очевидных ошибок и бессмысленностей.
    <?php
    class DataBase
    {
        const DB_HOST = 'localhost';
        const DB_USER = 'root';
        const DB_PASS = 'root';
        const DB_NAME = 'example_class_db';
        const DB_CHARSET = 'utf8mb4';
        public $mysqli;
    
        public function __construct()
        {
            try
            {
                mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
                $this->mysqli = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME);
                $this->set_charset(self::DB_CHARSET);
            }
            catch(mysqli_sql_exception $e)
            {
                throw new Exception($e->getMessage());
            }
    
        }
        public function preparedQuery($query)
        {
            $stmt = $this->mysqli->prepare($query);
            $stmt->bind_param(str_repeat("s", count($params)) , ...$params);
            $stmt->execute();
            return $stmt;
        }
        public function getResult($query, $params = [])
        {
            if (!$params)
            {
                return $this->mysqli->query($query);
            }
            return $this->preparedQuery($query, $params)->get_result();
        }
    
        public function getRow($query, $params = [])
        {
            return $this->getResult($query, $params)->fetch_assoc();
        }
    }
    Ответ написан
    Комментировать
  • С чего начать джуну в бэкэнде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хочешь стать программистом - учи сначала языки (PHP, SQL, плюс хотя бы базово JS, HTML), потом фреймворк
    Хочешь стать ремесленником, типа сапожника 100 лет назад - учи цмс.
    Ответ написан
    5 комментариев
  • Как лучше проверять приходящие данные PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это все полная бессмыслица.
    "типо от атак" никакие "проверки" вообще не нужны
    функция testInput - это вообще какаой-то ужас, который кочует из отного видео в другое

    Надо понимать две вещи

    1. "от атак" ничего никогда не проверяют. Нормально написанному коду никакие атаки не страшны. Поэтому надо просто писать нормальный код.
    2. проверять данные в принципе можно. Но не "от атак", а просто для удобства. Нормальное рест апи всегда скажет клиенту, если у него данные не в том формате. Только в случае, если проверка не прошла, надо не молча корёжить данные, а вежливо ответить что они не подходят. А сейчас у тебя код только тупо портит входящие данные.
    Ответ написан
    4 комментария
  • Почему PDO возвращает булеву(false)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    function getData(string $what, int $id, int $owner) {
          $query = $qpdo->prepare("SELECT * FROM `table` WHERE `id` = :id AND `owner` = :owner");
          $query->execute(array(, ':id' => $id, ':owner' => $owner));
          return $query->fetch()[$what] ?? null;
    }


    И всегда включать режим выброса исключений в пдо. чтобы потом не стоять в непонятках, "ой мне false возвратило"
    Ответ написан
  • Безопасно ли делать запрос к БД через ajax?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Через ajax невозможно сделать запрос к БД. Поэтому вполне безопасно.

    А что касается запросов к БД из РНР файла,
    как избежать этого?

    не писать в своем php скрипте код, который будет возвращать пароль при запросе емейла.
    плюс погуглить три слова php sql injection
    Ответ написан
    9 комментариев
  • Как лучше осуществлять хранение даты последней активности пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На наш взгляд, оптимальнее всего не забивать себе голову детскими фантазиями и высосанными из пальца проблемами.
    У тебя нет сайта, нет пользователей, нет одновременной активности, нет проблем с производительностью.
    Но зато уже есть ПРОБЛЕМА. Которую надо срочно решать.

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

    Не говоря уже о том что в реальности у тебя на сайте будет полтора инвалида, и единственной проблемой будет куда бы спихнуть это никому не нужное творение.
    Ответ написан
    3 комментария
  • В чем ошибка (T_DOUBLE_ARROW)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Найди в интернете любой пример того чтобее нужно, и скопипасть без ошибок
    Ответ написан
    Комментировать
  • Попинайте. Работодатель сказал, что у меня код PHP устаревший. В чем именно проблемы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем да, на первый взгляд этот код производит ужасное впечатление
    Тут даже не 2010-е, тут скорее 1990-е

    По пунктам
    - конструктор, совпадающий с именем класса, уже отсутствует в языке
    - в конструктор передается бессмысленная переменная дб, которая нигде не используется
    - функции вида formField() - это явно какой-то адок и инъекции
    - про mysql_query уже сказали
    - про собаку уже сказали. причём она здесь не нужна, mysql_query практически не выдаёт ошибок
    - die ( mysql_error () ); - это вообще зашквар. Я кстати однажды наблюдал результат похожего кода на тостере много лет назад, хе-хе. На боевом сайте системные сообщения об ошибках никогда не должны выводиться в браузер. Вообще, это родовая ошибка похапешников, сохранившаяся до наших дней - у них все ошибки в обязательном порядке обрабатываются здесь и сейчас. В то время как код приложения должен только выбросить ошибку, а обрабатываться все ошибки должны централизованно, в другом месте.

    Однако есть и хорошее.
    Сам по себе класс неплохой, и довольно грамотный ООП в целом.
    пожалуй, надо только подправить синтаксис, и задействовать какой-нибудь осмысленный объект $db, чтобы запрос выполнялся как-то так

    function addPlace($place) {
        $query = "INSERT INTO place
            (name,english, countryID, globalRatingID, typeID, worldPartID, datecreated,
            datelastmodified,datepublished,permissionLevel,tansliterated)
            VALUES (
            (:name,:english, :countryID, :globalRatingID, :typeID, :worldPartID, now(),now(),
            now(),:permissionLevel,:tansliterated)";
        $this->db->query($query, [
            'name' => $place->getName(),
            'english' =>$place->getEnglish(),
            // и так далее, всё массивом
        ]);
        return true;
    }
    Ответ написан
    2 комментария
  • На сколько важно указывать категорию товара в ЧПУ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    3. Никогда не делать урлов вида site.ru[/catalog/sport/dlya-doma]/gantelya, а всегда только только site.ru[/catalog/sport/dlya-doma]/223322-gantelya, чтобы страница всегда однозначно адресовалась через неотчуждаемый уникальный идентификатор.

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

    Контроллер при обработке страницы ориентируется на айди, и сравнивает текущий урл с каноническим. и если не совпадает - то редирект.
    Ответ написан
    Комментировать
  • Как исправить ошибку SQLSTATE[22007]?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У тебя в $event_id колбаса
    Ответ написан