Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Где можно найти примеры тестовых заданий по php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На будущее - php.feedme.ru :)
    Ответ написан
    Комментировать
  • Создание отдельной таблицы для каждого пользователя. Правильно ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Практика - критерий истины.

    Сделай такую таблицу, а потом попробуй вывести все комментарии под статьей или ленту последних постов на сайте.
    Ответ написан
    Комментировать
  • RedBeanPHP или PDO для манипуляций с базой данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Изучать - сначала PDO, потом RedBean
    Использовать - сразу RedBean
    Ответ написан
    Комментировать
  • Каков принцип работы apache?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как всегда, милилон ответов, все не в кассу.

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

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link->begin_transaction();
    $stmt = $link->prepare("UPDATE `price` SET `price`=? WHERE `name`=?");
    $stmt->bind_param("ss", $price, $name);
    foreach ($jsondate as $k => $value) {
        foreach ($value as $bo) {
            $name = $bo['name'];
            $price = $bo['price'];
            $stmt->execute();
        }
    }
    $link->commit();
    Ответ написан
  • Где взять легковесный Query Builder?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    https://github.com/auraphp/Aura.SqlQuery
    www.notorm.com
    тысячи их

    Для mysqli порекомендую свою SafeMysql
    Если запрос не надо собирать динамически, то код получается куда проще , читабельнее и гибче, чем с любым билдером. Попробуйте к примеру выполнить через fluenpdo запрос insert ignore или on duplicate
    Ответ написан
    3 комментария
  • Правильное написание sql запроса?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Мда, тостер уже не торт.
    Сначала хотел пожурить автора вопроса, но потом увидел, ответы на его предыдущий вопрос...
    Он ведь спрашивал, как защищаться от инъекций. Но в ответ получил только глубокомысленные рассуждения о том, что SQL инъекция без XSS невозможна(!!!).

    В общем используй prepared statements и будет тебе счастье.
    Ответ написан
    2 комментария
  • Почему очень долго выполняеться запрос к БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    > Если этот же запрос сделать в phpmyadmin:

    phpmyadmin - убогая погремушка для ламеров. измерять по нему скорость выполнения запроса - это все равно что смотреть время на стоящих часах. Два раза в сутки покажет правильно...

    Во-первых, phpmyadmin подставляет limit для твоего запроса, и запрашивает всего 20 строк из твоих 100 тысяч. Попробуй запросить все, и посмотри, сколько времени будет выполняться. Если вообще выполнится.
    Во-вторых, даже для запроса с лимитом, 0.0002 -это мало. Результат явно идет из квери кеша. Один раз выполнил, дальше запрос закэшировался, и радостро выдает тупо результат.
    В-третьих, как тут уже все сказхали, делать таблицу на сто тыщ строк - это совсем за пределами осмысленности. Кто будет это читать? Даже если делаешь XLS.

    В общем, сначала изменить, сколкьо времени выполняется запрос ЦЕЛИКОМ, а потом сократить количество запрашиваемых строк до разумных значений.
    Ответ написан
  • Как переменной присвоить столбец?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Такой ерундой никто не занимается.

    Во-первых, $zapros в запросе - это готовая инъекция.
    Во-вторых, распихивать результат по отдельным массивам, это какой-то детский сад. В этом нет ни малейшего смысла, поскольку к любой колонке можно обратиться из единого массива
    foreach ($all as $row) echo $row['Type'];
    foreach ($all as $row) echo $row['Field'];

    В-третьих, если надо получить только один столбец, то тут mysqli как всегда проигрывает PDO:
    $stolbets = $pdo->($query)->fetchAll(PDO::FETCH_COLUMN);
    Ответ написан
  • Оцените класс для работы с БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В двух словах - бессмысленный и небезопасный.

    Класс не использует главные преимущества PDO - подготовленные выражения и возможность возвращать результат в десятках различных форматов. В итоге мы имеем SQL инъекцию в каждом запросе, а результат всегда возвращается только в виде списка.

    При этом написана куча функций, чтобы сэкономить себе два слова при написании SQL запроса, ценой создания нечитаемой абракадабры.
    Попробуй написать пример использования функции select() для запроса "SELECT access FROM user WHERE id=1" , а потом посмотри на него и честно скажи - можно ли без документации понять, что и откуда эта функция должна выбрать и с какими условиями.

    Про бессмысленные телодвижения в select() я уж и не говорю.
    То, что запрос зачем-то выполняется по два раза, а после этого идет странное условие с одинаковым кодом в каждой ветке - это уже мелочи.
    Ответ написан
    Комментировать
  • Как в PHP 7 лучше всего получать данные из MYSQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Прямо из запроса получить данные сразу с группировкой можно только в ПДО.
    $data = $db->query('SELECT u.name, e.email FROM users u, email e WHERE u.id = e.user_id')
               ->feachAll(PDO::FETCH_GROUP);

    А как выводить - это уже дело вкуса. Например
    foreach($data as $name => $user) {
        echo "$name\n";
        foreach($user as $i => $email) {
            echo "\t$i. $email\n";
        }
    }
    Ответ написан
  • Как реализовать массив подстановок для запроса в MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Внимание, а теперь правильный ответ
    public function query($sql, $params = NULL){
            $sth = $this->dbh->prepare($sql);
            $sth->execute($params); // <----
            return $sth;
        }

    Это базовая функция, которая должна использоваться при выполнении ВСЕХ запросов.
    В том числе запросов на вставку, обновление и удаление, а также запросов, которые при всем желании не могут вернуть объект. Например
    $db->query("DELETE FROM t WHERE id=?", [$id]);
    $count = $db->query("SELECT count(*) FROM t")->fetchColumn();

    В принципе, этого уже достаточно, поскольку для получения списка объектов можно написать
    $list = $db->query("SELECT count(*) FROM t")->fetchAll(\PDO::FETCH_CLASS, "class");

    Но если прям так очень хочется, то можно засунуть этот код в хелпер-функцию
    public function listObjects($sql, $class, $params){
            return $this->query($sql, $params)->fetchAll(\PDO::FETCH_CLASS, $class);
        }
    Ответ написан
    Комментировать
  • Как лучше выводить строки с несколькими переменными?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Читабельность понятие субъективное.
    Лично мне проще всего читать когда в глазах не рябит от всяких бессмысленных причиндалов типа скобочек, процентиков, кавычечек и прочих знаков препинания.
    echo "Format: $format. Config: $config->path. System (OS): $os.\n\n";

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Могу ответить за PDO.

    1. PDO не имеет никакого отношения к запросам. ПДО не пишет за тебя SQL и не делает его безопасным. Можешь называть колонки как угодно, ПДО это до лампочки.
    2. Чтобы обезопасить данные, надо использовать **подготовленные выражения.**
    Ответ написан
    Комментировать
  • Можно ли получить количество строк в MySQL по заданному условию, без данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $stmt = $pdo->prepare("SELECT COUNT(*) FROM table WHERE field = ?");
    $stmt->execute([$uslovie]);
    $count=$stmt->fetchColumn();
    Ответ написан
    Комментировать
  • Существует ли удобный способ добавления записи (insert) в php mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Safemysql реализует данный функционал:
    $db->query('insert into `messages` set ?u', $values);

    причем делает это безопасно

    при этом safemysql можно использовать параллельно с существующим кодом, просто передавая существующее подключение к mysqli в конструктор
    Ответ написан
    Комментировать
  • Как получить OUTPUT параметры в php при выполнении хранимых процедур MS SQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Есть мнение, что аутпут параметры не поддерживаются, stackoverflow.com/questions/33617760/php-pdo-mssql...
    Ответ написан
    Комментировать
  • Как вставить значение в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никогда не мог понять, почему пользователи пхп так стремятся раздувать код на пустом месте и писать одно и тоже по 5-6 раз.

    $sql = 'INSERT INTO employees (first_name, second_name, middle_name, id_position) VALUES (?, ?, ?, ?)';
    $pdo->prepare($sql)->execute([$_POST['f_name'], $_POST['s_name'], $_POST['m_name'], $_POST['list-position']]);
    Ответ написан
    Комментировать
  • Pdo->query() дважды выполняет запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Убедись, что файл выполняется только 1 раз.
    Чаще всего двойные запросы - это результат кривого фронт контроллера который запускается на любой запрос к сайту.
    Сделай поле типа варчар и пиши в него $_SERVER['REQUEST_URI'] и увидишь
    Ответ написан
    4 комментария
  • Как грамотно составить функции запросов mysqli?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос содержит взаимоисключающие параграфы.
    Если задача наговнокодить абы как, лишь бы работало - то зачем спрашивать, как правильно?

    Если же задача действительно научиться писать правильно, то надо учить ПДО, просто потому что правильная работа с БД в mysqli ГОРАЗДО сложнее, чем в ПДО.

    Для примитивного примера в вопросе действительно разницы никакой. Но как только речь зайдет о добавлении переменных в запрос, то сразу встанет проблема использования подготовленных выражений. Это и само по чебе для новичков сложно, а уж с mysqli их освоить и вовсе задача нереальная. С ПДО гораздо легче. Чтобы начать польззоваться ,надо знать всего три вещи:

    1. Все переменные заменяются в запросе на знаки вопроса. после этого делаем запросу prepare
    2. Сами переменные запихиваем по порядку в execute
    3. После этого запрашиваем у ПДО результат запроса сразу в том виде, в котором они нам нужны

    И все. Пример:
    $stmt = $pdo->prepare("SELECT id, name, price, amount FROM table WHERE id = ?");
    $stmt->execute([$id]);
    $row = $stmt->fetch();

    Все ОЧЕНЬ просто.
    Ответ написан