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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Любая ошибка синтаксиса, вызванная передаваемыми в запрос данными говорит о том, что запрос в принципе пишется неверно. А по-старинке, путем запихивания всех переменных прямо в строку запроса.

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

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

    $sql = "INSERT INTO t (text, author_id) VALUES(?,?)"; // заменим переменные на специальные маркеры
    $stmt = $mysqli->prepare($sql); // подготовим запрос к выполнению.
    $stmt->bind_param("ss", $text, $author); // привяжем к нему переменные
    $stmt->execute(); // и выполним его

    три простых шага, а код становится гораздо чище, безопаснее и короче.
    причем это в mysqli три, а в PDO вообще два:
    $sql = "INSERT INTO t (text, author_id) VALUES(?,?)"; // заменим переменные на специальные маркеры
    $stmt = $pdo->prepare($sql); // подготовим запрос к выполнению.
    $stmt->execute([$text, $author]); // сразу и привяжем и выполним
    Ответ написан
    1 комментарий
  • Как вставить переменные строкой в bind_param?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    массивом
    $sql->bind_param($char, ...[$adin, $dwa, $tree]);

    Хороший вопрос, который, к сожалению, редко задают
    Ответ написан
    Комментировать
  • Как открыть директорию для записи?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    плохо что сообщение об ошибке не нормальное, а кривое, но в целом проблемы с правами рещаются так:

    1. Сама папка должна быть открыта на запись для пользователя, под которым запущен РНР
    2. Все папки в пути должны быть доступны на исполнение для пользователя под которым запущен РНР. право на исполнение означает для папки возможность в эту папку перейти. и для того чтобы попась в целевую папку назначения у пользователя должна быть возможность перейти во все вышестоящие папки
    Ответ написан
    Комментировать
  • Дублирование данных при insert, где ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    про проблему тебе все уже рассказали, все изменения в БД должны быть только методом POST.

    Но поскольку вопрос изначально про класс, качестве шефской помощи перепишем его на более осмысленный, учитывая что

    - доступ к инстансу ПДО должен быть не только изнутри
    - а вот конфиг держать в переменной класса нужно как рыбке зонтик
    - кодировку при соеднинеии с базой надо задавать, чтобы потом не плодить на тостере очередной пост, "у меня в базе вопросики записались"
    - причем сразу правильную
    - самое главное - вежливо попросить РНР сообщать обо всех ошибках в запросах
    - ну и заодно установить разные удобные опции
    - пути всегда должны быть абсолютными
    - сначала надо написать универсальный метод для выполнения запросов, а потом уже использовать его во всех остальных методах
    - ненужный код не нужен

    class DatabaseMysql
    {
        public $pdo;
    
        public function __construct()
        {
            $options = [
                \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                \PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            $dbc = require(__DIR__.'/core/config/DbConfig.php');
            $this->pdo = new \PDO(
                "mysql:host={$dbc['db_host']};dbname={$dbc['db_name']};charset=utf8mb4",
                $dbc['db_user'],
                $dbc['db_pass'],
                $options,
            );
        }
        public function query(string $query, array $params = [])
        {
            $sth = $this->pdo->prepare($query);
            $sth->execute($params);
            return $sth;
        }
    
        public function insert(string $query, array $params)
        {
            $this->query($query, $params);
            return $this->pdo->lastInsertId();
        }
    }


    Хотя если честно, то я большого смысла в этом классе не вижу.
    Меня бы устроило простое расширение класса PDO типа такого
    class MyPDO extends PDO
    {
        public function run($sql, $bind = NULL)
        {
            $stmt = $this->prepare($sql);
            $stmt->execute($bind);
            return $stmt;
        }
    }

    Да, вставка будет выполняться за две строчки, а не одну,
    $pdo->insert('INSERT INTO test_table (`name`, `age`) VALUES (?,?)', ['Ivan',43]);
    $id = $pdo->lastInsertId();
    но я не уверен что стоит городить целый класс из-за одной строчки.
    Ответ написан
    1 комментарий
  • Как добавить NULL из PHP в БД MySQL?

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

    По поводу же автоматизации, варианты есть, но сдается мне что в твоем случае вот эту ливерную колбасу из name1 - name30 надо порезать на кусочки и записать по-человечески в отдельные колонки. И тогда проблем автоматизировать запросы не будет.
    Ответ написан
  • Стоит ли использовать ссылки в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не стоит.
    Вместо этого надо запомнить одно очень важное правило:

    Любую проблему следует решать только при её наличии.

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

    Если памяти скрипту хватает, то не надо вообще ничего оптимизировать.
    Если не хватает, то надо разобраться - почему, и устранить конкретную проблему.

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

    Не говоря уже о том, что ретиво бросившись решать какую-нибудь проблему, можно обнаружить, что она давно уже решена без твоей помощи. На досуге можешь почитать про copy-on-write
    Ответ написан
    Комментировать
  • VestaCP + Centos 7?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что у тебя уже в базу записаны значки вопросов вместо смайликов

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

    да и кстати, саму таблицу тоже надо настроить на поддержку utf8mb4
    проще всего будет пересоздать таблицу с новой кодировкой
    Ответ написан
  • Почему PHP не принимает символы / ' ` и смайлики в строке input и textarea для записи в БД MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы смайлы не вызывали ошибку надо выставить правильную кодировку
    чтобы никакие символы не мешали запросу, все переменные надо передавать в БД отдельно от запроса

    // правильно соединяемся
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli($host, $user, $pass, $db, $port);
    $mysqli->set_charset("utf8mb4");
    // правильно вставляем
    $sql = "INSERT INTO users (name, email, password) VALUES (?,?,?)";
    $stmt= $conn->prepare($sql);
    $stmt->bind_param("sss", $name, $email, $password);
    $stmt->execute();
    Ответ написан
    Комментировать
  • Как взять строчку из файла sql (PHP)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    открываешь в редакторе свою sql файлу
    выделяешь мышкой имя, копируешь в буфер
    переключаешься в браузер, в адресную строку вставляешь из буфера, нажимаешь ентер
    Ответ написан
  • Что означает на Linux скрипте перед командой символ $?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем я добился от автора объяснения, что ему нужно

    например при использовании значении переменной например good=bad далее выполнив команду echo $good


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

    Объяснение очень простое.
    Поскольку в баше ОЧЕНЬ нестрогий синтаксис, и любой текст воспринимается как строка без всяких кавычек, то нужен способ отличить переменную от просто строки. Если ты напишешь
    good=bad
    echo good

    то как система поймет, ЧТО ты хочешь вывести - строку good или переменную good?
    поэтому тут без вариантов - переменную надо как-то отличать от остального текста. Это и делает знак доллара

    При этом для присвоения значения переменной знак доллара не нужен, поскольку система видит по знаку =, что речь идет о присвоении (и видимо поэтому нельзя ставить проблелы вокруг знака =).
    Да, нелогично. Но не все в нашей жизни поддается логике

    5fb765391d91b496225527.jpeg
    Ответ написан
    1 комментарий
  • Laravel действительно такой медленный?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что не бывает никаких "опасных символов".
    Символ, который является "опасным" в одном контексте, в другом будет полезным.
    Если так начать удалять потенциально опасные символы, то от контента ничего не останется.

    Смешнее всего видеть такие вопросы на сайтах типа тостера. Вот клиент сам же накатал ответ в котором "опасных" символов overдофига. Во что превратится этот красивый ответ если из него повырезать все ужжжжасно опасные символы?
    Ответ написан
    4 комментария
  • Mysql - var_dump() возращает null, как исправить?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    либо такого пользователя нет, либо ошибка
    с первым сам разберешься, а для второго напиши перед коннектом срочку
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Но вообще так писать никогда не надо. если пользователь не найден то всегда будет выдавать ошибку
    Хотя бы так
    $user = $db->query("SELECT password FROM users WHERE login='Alekseyfbnd1'")->fetch_assoc();
    if ($user) {
        var_dump($user['password']);
    } else {
        echo "not found\n";
    }
    Ответ написан
    5 комментариев
  • Как удалить строки с условием в RedBean?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Про редбин не знаю ничего (кроме того что он устарел еще до того как ты в школу пошел), в код тем более не полезу, но по логике функция, которые называется trash, и должна удалять оригинал объекта из базы, а не заниматься выполнением пользовательских запросов.

    Ну и сам попробуй подумать, какое отношение "готовый ORM" имеет к выполнению запросов, не относящихся к конкретной записи
    Ответ написан
  • PHP Parse error: syntax error, unexpected ограничение в хостинге, или же всё же ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как уже сказали, дело в версии РНР.
    Плюс этот неграмотный винегрет надо выкинуть и переписать заново
    вот тебе нормальный код

    class Database
    {
        public $db;
    
        public function __construct($host, $user, $password, $database)
        {
            mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
            $this->db = new MySQLi($host, $user, $password, $database);
            $this->db->set_charset("utf8mb4");
        }
    
        public function query($query, $params = [], $types= '') {
            $types = $types ?: str_repeat("s", count($params));
            $stmt = $this->db->prepare($query);
            $stmt->bind_param($types, ...$params);
            $stmt->execute();
            return $stmt;
        }
    
        public function select($query, $params = [], $types= '') {
            if (!$params) {
                return $this->db->query($query);
            } else {
                return $this->query($query, $params)->get_result();
            }
        }
    }
    Ответ написан
    Комментировать
  • Структура сайта PHP/MySQL.Чекните детали?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ сильно зависит от текущего уровня.

    Если совсем ноль, то файл с настройками, файл с основным шаблоном сайта, и по паре файлов на каждую страницу - код и шаблон. Обращения идут к РНР файлам напрямую - index.php, blog.php, profile.php

    Дальше файл с кодом инклюдит настройки, выполняет код, задаёт имя файла своего шаблона, и инклюдит основной шаблон, а тот внутри себя инклюдит шаблон страницы.

    Когда этот этап пройден, прочитать статью "Симфони против чистого РНР"
    Ответ написан
    Комментировать
  • Как связать таблицы mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Проблема в том, что ты не "сделал" регистрацию, а тупо скопировал из видео. И теперь думаешь, что тебе на тостере напишут остальной код.

    К сожалению, тот жулик, который тебе впарил это видео, не объяснил, что во-первых, программистом нельзя стать, посмотрев один ролик на ютубе, а во-вторых, этой тухлой фасолью redbean никто кроме него не пользуется. То есть даже код тебе никто не напишет.

    Поэтому садись, бери учебники, учи PHP, MySQL, и решай свою задачу. За пару месяцев справишься.

    Начни с базы данных.
    Продумай структуру, создай таблицы, забей тестовые данные и напиши запросы.
    Ответ написан
    2 комментария