• Добрый день. Вопрос по 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 комментарий
  • Можно ли вывести адрес переменной в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Нет, стандартными средствами нельзя.
    2. У таких вопросов (типа "как мне японской скороваркой почистить выхлопную трубу") всегда должен быть контекст. Чтобы люди хотя бы примерно понимали, что у вас в голове и что вам на самом деле нужно.
    Ответ написан
  • Как создать маску для нескольких частей названия файла?

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


    Давайте по шагам, как детстве с мамой
    1. Что выводит echo "../local/$id.*.$login_*";? Соответствует ли вывод ожиданиям? Если нет - то в чем различия? Что должно вывести и что вывелось?
    2. Если ответ на первый вопрос положительный, то что выводит var_dump(glob("../local/$id.*.$login_*")); Соответствует ли вывод ожиданиям? Если нет - то в чем различия? Что должно вывести и что вывелось?
    3. Если ответ на второй вопрос положительный, то каков результат работы кода? Соответствует ли он ожиданиям? Если нет - то в чем различия? Что должно было удалиться, и что удалилось?
    4. Включен ли вывод ошибок? Если нет - то надо включить. Если включен и выводятся - то какие?
    Ответ написан
    5 комментариев
  • Ошибка sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. Как исправить?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну хотя бы немного думать своей головой надо, а не просто копировать какие-то строчечки из интернета.
    Метод fetchall() возвращает данные какого типа?
    а в execute() надо передавать данные какого типа?

    Вот реально - неделю назад вы писали код, который был мало того что почти рабочим - он был осмысленным.
    Я понимаю, если бы вы не умели работать с базой данных. Но у вас уже был рабочий код!
    А здесь опять какие-то самолеты из соломы. Попытка получить скалярную переменную с числом из запроса, который возвращает ВСЕ колонки ВСЕХ строк таблицы.

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Наверное, надо проверять элемент исходного списка, является ли он списком, и только тогда распаковывать?
    Если уровень вложенности у нас один, то так и написать
    chained = []
    for item in posl:
        if isinstance(item, list):
            for subitem in item:
                chained.append(subitem)
        else:
            chained.append(item)

    Это будет самый кондовый алгоритм. Задачу можно реализовать и короче, и оптимальнее. Но при изучении программирования надо сначала научиться составлять самому простейшие алгоритмы и их реализовывать, а не просто пытаться использовать по очереди какие-то магические заклинания - авось какое-то сработает. А если не сработает - то идти на Хабр, чтобы тебе его написали.
    Любой красивый код следует применять только тогда, когда ты понимаешь, как он работает, что делает внутри. А если не понимаешь, то лучше сначала разобраться, реализовать тот же алгоритм руками. Иначе ты будешь не программист, а обезьяна с гранатой.

    Если вложенность неограниченная, то придется познакомиться с таким понятием, как рекурсия.
    Ответ написан
    Комментировать
  • Какую книгу прочитать про SQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    https://svyatoslav.biz/relational_databases_book/

    Про хинты надо знать только одно - если они нужны, значит есть проблемы в архитектуре.
    Ответ написан
    1 комментарий
  • Элементы на php не отображаются на веб сервере в локальной сети. Как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вообще непонятно, о чем речь, но скорее всего к "элементам" ведут неверные пути.
    URL всех локальных ресурсов должен состоять из абсолютного пути к нему
    то есть
    /img/logo.jpg
    /pages/about.php
    и так далее
    Ответ написан
    Комментировать
  • Почему возникает TypeError: must be str, not int?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В качестве аргумента count() ожидает строку, а не число
    Ответ написан
    Комментировать
  • Как правильно написать regex?

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

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не очень понятно, что надо автору, но в общем случае это делается без проблем
    $commands = ['hi' => 'hi', 'hello' => 'hello', 'etc' => 'etc'];
    $commands['hi']();

    Другое дело что изначальная задача сильно пованивает говнокодом
    Особенно учитывая тот факт, что автор, похоже, не догадался, что у него функции вызываются не "при обращение к ключу hi", а ещё при создании массива
    Ответ написан
    Комментировать
  • С чего начать изучение python, веб-сайты, приложения,читы или что-то другое?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вот для меня это тоже проблема - не знаю, что ответить, когда задают этот вопрос.
    Пока остановился на ботах. Рекомендую делать бота для телеги. По крайней мере, это очень популярное направление, ну и можно что-то интересное замутить. Бот для изучения английского, например.
    spoiler
    Судя по вопросам здесь, питон+телеграм - это новый пхп+веб. Абсолютное дежавю: точно так же, как 10 лет назад, просто пудовищное количество людей, которые абсолютно не понимают, что они делают, но им всё надо прямо щас.


    Джангу не рекомендую, это ступенькой выше. Это и так-то боль, а если не знать Питона, то совсем будет плохо. Джангу лучше учить после пхп. Потому что на пыхе можно сделать веб-сайт так же просто, как на Питоне - калькулятор. И уже потом, примерно поняв, что к чему, можно садиться за джангу, чтобы имея общее представление об SQL, HTTP, устройстве веб-сайта -уже переходить на ORM, роутинг, MVC.
    Ответ написан
  • Выучил синтаксис языка. как использовать его на практике?

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

    MVC надо прочувствовать. Надо поставить себя в ситуацию, когда станет понятно - "Вот я дебил, зачем же я SQL вперемешку с HTML писал! Теперь придется выковыривать. Но уж дальше у меня логика и вывод будут разделены!".
    А потом - "Вот я дебил, зачем же я прямо в контроллере всю логику шарабашил! Теперь в консольной команде то ли код дублировать, то ли опять логику из НТТР интерфейса выковыривать".
    И потом - "Вот я дебил, всё сам на коленке писал, когда в фреймворке всё уже готовое!"
    И так много-много итераций.

    И это я не перечисляю совсем уж детсадовские инсайты, типа "вот я дебил, оказывается если SQL запросы не защищать, то и авторизацию по сути писать бесполезно - все равно кто хочешь зайдет" и "Ой, оказывается кроме меня на сайте ещё другие пользователи есть! И им ошибки показывать не надо!"

    В общем, надо сделать простое приложение, по возможности положить его онлайн, и заниматься его развитием.
    Ответ написан
    2 комментария