Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу MySQL
  • Почему очень долго выполняеться запрос к БД?

    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);
    Ответ написан
  • Как в 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);
        }
    Ответ написан
    Комментировать
  • Шардинг MySQL и поиск по шардам?

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

    И тогда тебе подскажут ответ, в порядке частоты причин, по которым задают этот вопрос:

    1. Нет, бояться миллиона записей не надо. Mysql потянет во много раз больше.
    2. Сделать репликацию мастер-слейв, с нужным количеством слейвов.
    3. Возможно, под какие-то условия подойдет и шардинг.

    Update.
    Как и ожидалось, все свелось к п.1.
    Ответ написан
    6 комментариев
  • Применим ли 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 в конструктор
    Ответ написан
    Комментировать
  • Как выбрать строки имеющие общее значение в столбце MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос какой-то путанный

    если надо действительно получить "Значение" (из примера), которое есть и у id=98 и у id=54, то так и писать

    SELECT значение FROM `table` WHERE id поста = 98 OR id поста = 54


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

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

    если надо узнать, имеют ли посты с ид 98 и 54 общее значение, то четверным.
    А аффтару надо учиться выражать свои мысли по-русски.
    Ответ написан
  • Как вставить значение в БД?

    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();

    Все ОЧЕНЬ просто.
    Ответ написан
  • Стоил ли использовать PDO для отправки запросов к БД на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сравни эти два кода и ответь себе сам:
    mysqi
    $stmt = $mysqli->prepare("SELECT id, name, price, amount FROM table WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->bind_result($id, $name, $price, $amount);
    $stmt->execute();
    $rows = array();
    while ($stmt->fetch())
        $rows[] = array(
            'id' => $id;
            'name' => $name;
            'price' => $price;
            'amount' => $amount;
        );
    }

    pdo
    $stmt = $pdo->prepare("SELECT * FROM table WHERE id = ?");
    $stmt->execute([$id]);
    $rows = $stmt->fetchAll();

    В общем, если ты мазохист, то mysqli тебе отлично подойдет.
    Ответ написан
    1 комментарий
  • Как выводить данные по году и месяцу из одной колонки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Потому что базы данных еще не освоили телепатию, и для управления нечетким поиском нужно применять специально оговоренные в документации символы-маски, заменяющие любое вхождение символов?
    Ответ написан
    Комментировать
  • Можно ли использовать rowCount() в подготовленных выражениях?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно но не нужно.
    Для запросов типа SELECT применять эту функцию нет ни малейшего смысла.

    В данном случае логичнее сделать fetch. Мы же запрашивали какие-то данные из БД? Значит их надо получить. А если мы их получили - значит данные есть, и считать их не нужно
    $check->execute(array(":domainid" => $domainid , ":vhostid" => $vhostid, ":userid" => $login));
    $mainname = $check->fetchColumn();
    if ($mainname) {}

    Если запрос подразумевает получение не одного поля, а нескольких, то вместо fetchColumn() пишем fetch()
    Если запрос подразумевает получение нескольких строк, то вместо fetch() пишем fetchAll()
    Ответ написан
  • Как правильно вывести массив из mysqli (без цикла)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Специально ля всех нубов, которые не понимают как пользоваться циклами и поэтому до ужаса их боятся
    $res=$_DB->query("select * from `table`");
    $rows = [];
    while ($row = mysqli_fetch_row($res)) $rows[] = $row;
    echo json_encode($rows);
    Ответ написан
    Комментировать
  • Почему не выполняется SQL запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    О том, почему не выполняется запрос, ты должен спрашивать не у дяди с улицы, а у своей БД. Только она это знает точно.
    Дядя с улицы может только подсказать, как правильно спросить у базы данных.
    Поэтому меняем код подключения на
    $connect = new PDO("mysql:host=127.0.0.1;dbname=***", "***", "***",[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

    И закономерно получаем ошибку
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index)

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

    И вот дальше начинаем удивляться - почему в phpmyadmin аффтар употребляет обратные апострофы, а в пхп - нет.
    Ответ написан
    1 комментарий
  • Я новичок, объясните правильно ли я использую pdo и обрабатываю ошибки?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет, здесь все неправильно.

    Если коротко, то

    1. Класс Database выкинуть на помойку.
    2. Все exit() в коде выкинуть на помойку
    3. Все try..catch туда же

    В итоге у нас останется

    class article {
        public function __construct($pdo)
            $this->pdo = $pdo;
        }
        public function get_all_db() {
            $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles`";
            return $this->pdo->query($sql)->fetchAll();
        }
        public function get_one_db($id){
            $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles` WHERE articles_id = ?";
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
    }


    Все удобно, компактно и безопасно.
    Кода получается меньше чем в mysqli и mysql вместе взятых.
    Ответ написан
  • Удаленное подключение а Mysql на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Удаленное подключение к Mysql является оправданным решением в разработке системы или же нет?

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

    Подойдет ли Mysql для загруженных систем?

    Ну если Фейсбук для тебя недостаточно нагруженная, то даже не знаю. Наверное нет.

    подкиньте литературу, у кого есть по этому направлению?

    Вынужден тебя огорчить. Литературу придется читать 5 лет, в институте, и потом еще столько же набираясь опыта.
    Но сначала надо будет закончить школу
    Ответ написан
    Комментировать
  • Pdo, подстановки в execute, возможно ли в подстановках значения на кириллице?

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