Задать вопрос
Ответы пользователя по тегу PHP
  • В запросе SQL в php условия в кавычках как?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никогда не понимал любителей ломать пальцы обо все эти точечки-кавычечки-запяточечки. Это же надо так запариться, старательно после каждого слова выписывая пунктуацию. Есть же нормальные двойные кавычки.
    "mysqldump -u$user -p$password --single-transaction --force --opt --where 'ENTITY_FIELD = STATUS_ID AND ASSIGNED_BY_ID >0' $database $table > relations.sql"
    Ответ написан
  • Как перейти на другой сайт с POST запросом?

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

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

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

    Для типизации же значений служат коллекции Вот, например, недавний пост, но вообще их тыщи.
    Ответ написан
    Комментировать
  • Как сгрупировать значения multiselect инпута в подмассивы если в форме несколько multiselect инпутов с одним названием tags[]?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если в форме несколько multiselect инпутов с одним названием tags[], то, разумеется, никак.
    Чтобы при сохранении формы значения из отдельных инпутов были в подмассиве массива tags, надо добавить эти подмассивы. Л - Логика.
    tags[0][]=
    tags[1][]=
    и так далее
    Ответ написан
    9 комментариев
  • Когда стоит начинать учить фреймворки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну, по-хорошему, ещё рановато.
    Всё-таки, фреймворки служат для ускорения разработки веб-приложений, а не одностраничных черновиков.
    При чем это очень важный момент.
    Не использовав в своей работе всё, что требуется при разработке веб-приложения (в том числе безопасность, следование рекомендациям протокола НТТР, валидация данных, и примрно ещё десяток нужных вещей) - то не сможешь реально понять, как много фреймворк делает за тебя.
    Ответ написан
    Комментировать
  • Как удалять файлы с сервера по условию, что они не используются в текущий момент?

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

    Хотя конечно непонятно, как это всё поможет в ситуации, когда заходят посмотреть сразу 20 разных событий.
    Ответ написан
    1 комментарий
  • Почему не работает 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]);
    Ответ написан
  • Как понять что делает данный код php?

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

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

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

    Кстати, в этом примере просто попробуйте Content-Type: text/csv
    только вместо разделителя тогда лучше использовать точку с запятой.
    Ответ написан
    2 комментария
  • Какой лучше взять 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
    Потомок старинного рода Ипатьевых-Колотитьевых
    Решение простое: не забывать про первичный ключ в таблицах и не плодить дубли.
    Ответ написан
    Комментировать
  • Ошибка синтаксиса mysql как исправить?

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

    кодировка соединения должно выставляться не SQL запроса, с с помощью специальной функции.
    SET GLOBAL на хостинге работать не будет
    Ответ написан
  • Можно ли вывести адрес переменной в 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 комментариев
  • Элементы на php не отображаются на веб сервере в локальной сети. Как исправить?

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