Задать вопрос
  • Почему не работает php внутри html?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Причин может быть примерно миллион.
    Например, сервер смотрит на файлик .htaccess и в упор его не видит
    Для начала надо уточнить, что все это крутится под веб-сервером Апач и что в нем включена директива AllowOverride
    Ответ написан
  • Почему функция sort не сортирует, а выдает bool?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Наверное потому что она так устроена? И это поведение описано в документации?
    Ответ написан
    3 комментария
  • Как выполнить вызов метода в другом методе?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    call_user_func нинужна
    class A
    {
        function execute($function, $params = []) {
            return $function(...$params);
        }
        function payload($param) {
            return $param * $param;
        }
    }
    $a = new A;
    echo $a->execute([$a, 'payload'], [5]);


    а можно ещё так, если объект тот же самый

    class A
    {
        function execute($function, $params) {
            return [$this,$function](...$params);
        }
        function payload($param) {
            return $param * $param;
        }
    }
    $a = new A;
    echo $a->execute('payload', [5]);
    Ответ написан
  • Как можно охлаждать помещение?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Решение очевидное. Поскольку из этого всего толком шумит только нас, то поменять этот металлолом на SSD
    Ответ написан
  • Как понять что делает данный код php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Гадость.
    Тут даже смотреть не надо чтобы понять, что код делает гадость

    код ниже после __halt_compiler(); никак не интерпретируется языком PHP, что явно следует из названия этой функции.
    Ответ написан
    1 комментарий
  • Насчет экспорта таблицы MySQL в Excel средствами PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну например можно генерить html

    Кстати, в этом примере просто попробуйте Content-Type: text/csv
    только вместо разделителя тогда лучше использовать точку с запятой.
    Ответ написан
    2 комментария
  • Как в mysql.connector отключить добавление одинарных кавычек?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никак.
    Собирать запрос через f-word и выполнять без параметров.
    Ответ написан
    Комментировать
  • Как создать архитектуру БД для заказов продуктов и услуг в приложений?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас какой-то странный магазин был изначально.
    Обычно делается две таблицы, orders и order_details, во вторую пишется состав заказа, в котором фиксируется цена, скидка и все такое прочее.
    Доставка - это не дополнительная услуга, а отдельная сущность, привязанная к заказу, со своими заморочками.
    Остальные доп. услуги - это обычные товары, которые кладутся в корзину.
    Вип статус - плюшка пользователя, а не покупки. При оформлении заказа она просто учитывается при подсчете стоимости.
    Ответ написан
  • Как вставить данные в две таблицы сразу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Вставить в первую
    2. Вставить во вторую.

    При возникновении ошибок - прочитать и исправить.
    Ответ написан
    5 комментариев
  • Как объединить поиск по тегам и названию поста в MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В запросе ничего сложного, всё так, как вы и описали
    Только, разумеется, в одном запросе.

    Для этого пора бы уже освоить джойны. Нормализацию БД вы освоили - это прекрасно.
    Джойны - тоже не бином ньютона, это основа SQL. Второй запрос не нужен, всё делается в одном
    Сначала выбираем фильмы по тегам
    select f.* from sakila.category c
    join sakila.film_category fc on fc.category_id = c.category_id
    join sakila.film f on f.film_id = fc.film_id
    where c.name in ('Action', 'Drama') 
    group by f.film_id;

    Если хотим добавить поиск по заголовку, то просто добавляем к этому же запросу еще условие во WHERE, and description like '%Drama%'
    https://sqlize.online/sql/mysql57/8d7c91ad5f6cf415...

    Правда на таких объемах LIKE делать не рекомендуется. Но если сейчас работает по всей базе, то по десятой части и подавно будет. Но в целом надо уже прикручивать внешний поисковый движок, ElasticSearch. Ну или хотя бы добавить полнотекстовый индекс по названию (и тексту тогда уж заодно) и искать в них через match...against
    Ответ написан
    2 комментария
  • Как оптимизировать базу данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы оптимизировать сайт по скорости загрузки, надо не читать разный мусор в интернете, а сначала разобраться, в каком именно месте тормозит.
    Потом с этим местом приходить на Хабр

    Бессмысленность хаотичных телодвижений на основании информации из интернета показывает уникальный индекс на id, который здесь нужен как корове седло.
    И полный АДЪ в виде ключа normal.
    Ответ написан
    2 комментария
  • Добрый день. Вопрос по Python связанный с вводом данных. Вводить число надо так чтобы программа принимала числа со знаками после запятой?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Давайте посмотрим на код вашей программы.
    a, b, c, d = map(int, input().split())

    Как вы думаете, что делает функция, выделенная жирным шрифтом?
    Ответ написан
    Комментировать
  • Какой лучше взять ORM?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это хороший вопрос, но ответ на него зависит от вашего уровня. Очень сильно зависит.
    Специалисты вам наверняка посоветуют Doctrine или Cycle. Но вы их явно не потянете.
    Для знакомства с ORM я бы порекомендовал Eloquent, при всех минусах этого выбора.

    Но если честно, то учитывая, что вы ищете замену RB, я бы порекомендовал начать с самого простого.
    spoiler
    Написать ORM руками. Причем даже не классический, поддерживающий связи и квери билдер, а совсем простой Table Gateway, типа такого:
    abstract class BasicTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(\PDO $db)
        {
            $this->db = $db;
        }
        public function read($id): ?array
        {
            $stmt =$this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
        public function insert($data): int
        {
            $this->validate($data);
    
            $fields = '`'.implode("`,`", array_keys($data)).'`';
            $placeholders = str_repeat('?,', count($data) - 1) . '?';
            $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
            $this->db->prepare($sql)->execute(array_values($data));
            return $this->db->lastInsertId();
        }
        protected function validate($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
            }
        }
    }

    И дальше применять его примерно так
    class UserGateway extends BasicTableGateway {
        protected $table = 'gw_users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
    }
    $userGateway = new UserGateway($pdo);
    $data = [
        'email' => 'foo@bar.com',
        'password' => 123,
        'name' => 'Fooster',
    ];
    $id = $userGateway->insert($data);
    $user = $userGateway->read($id);
    echo json_encode($user),PHP_EOL;

    И никаких тебе "бинов" - обычный ПДО, обычные массивы, все просто и наглядно.


    Хотя пожалуй Dr. Bacon прав, вам и это будет сложновато. Возьмите лучше просто функцию:
    function pdo($pdo, $sql, $args = NULL)
    {
        if (!$args)
        {
             return $pdo->query($sql);
        }
        $stmt = $pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }

    и дальше просто запросами

    // Create
    pdo($pdo, "INSERT INTO users VALUES (null, ?,?,?)", [$name, $email, $password]);
    // Read
    $user = pdo($pdo, "SELECT * FROM users WHERE email=?", [$email])->fetch();
    // Update
    pdo($pdo, "UPDATE users SET name=:name WHERE id=:id", ['id'=>$id, 'name'=>$name]);
    // Delete
    $deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();


    После того, как SQL будет отскакивать от зубов - можно будет посмотреть в сторону какого-нибудь ORM
    Ответ написан
    1 комментарий
  • Как реализовать хэширование пароля при регистрации?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Соглашусь с предыдущим комментатором, код ужасный. Но главная проблема здесь не в коде, а в голове.
    Все программирование построено на такой штуке, как логика. И если не умеешь мыслить логически - причем на самом элементарном, бытовом уровне - то в программировании точно делать нечего.

    Зачем спрашивать, как хэшировать пароль, если у вас в коде это хэширование уже есть? Вот же оно -
    $password = password_hash($password, PASSWORD_DEFAULT);
    Где логика?
    Зачем сравнивать хэши паролей, если вы хотите сравнить сами введенные пароли? Где логика? Хэши никогда не совпадут.
    Зачем писать, что пароль "Заносится в базу данных без хэширования", если при текущем коде ничего никуда вообще не заносится, потому что не проходит сравнение хэшей. Где логика?
    А если эту дурацкую проверку убрать, или поменять на сравнение самих паролей, то занесется именно хэш, можно убедиться

    Но главная тут проблема - это конечно SQL инъекция.
    Какой вообще смысл делать регистрацию, авторизацию - если кто угодно сможет зайти вообще без пароля под кем угодно? Где логика?
    Надо обязательно научиться выполнять все запросы с переменными только через подготовленные выражения. А потом уже браться за регистрацию, пагинацию, и что угодно. Сначала учимся класть кирпичи, а потом только строим дом. А не наоброт.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никак.
    Если наблюдается невероятное поведение, то надо искать вероятное объяснение. простое. Не на тот сервер зашел, и пр.
    Ответ написан
  • Ошибка "Unexpected update count received …" при удалении строки в таблице БД в PhpStorm. Как решить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Решение простое: не забывать про первичный ключ в таблицах и не плодить дубли.
    Ответ написан
    Комментировать
  • Как перекачать данные с мастер сервера на слейв?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Уже отвечал сегодня - Percona XtraBackup
    Ответ написан
    Комментировать
  • Реализация автоматического обновления БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Делать Percona XtraBackup по крону на бою, и потом накатывать его на тест.
    Остальное - от лукавого. "Через консоль" будет блокировать таблицы, что такое "через экспорт-импорт" непонятно что значит, а ивенты тут вообще не при делах.
    Ответ написан
  • Ошибка синтаксиса mysql как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    mysqli_query() выполняет только один запрос.
    если надо выполнить два, то надо вызвать эту функцию два раза

    кодировка соединения должно выставляться не SQL запроса, с с помощью специальной функции.
    SET GLOBAL на хостинге работать не будет
    Ответ написан
  • Объясните/заккоментируйте как работает эта програмка?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    такую программу можно написать в 5 раз короче
    и именно такое решение от вас и ожидается - примитивное, показывающее что вы понимаете самые базовые элементы языка - циклы, работу с переменными, строками.
    Никакие списки тут не нужны.
    От вас требуется продумать в голове алогоритм, и потом реализовать его на Питоне.

    Главное здесь - алгоритм
    Попробуйте для начала изложить его просто словами.
    Ответ написан
    21 комментарий