Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу MySQL
  • Как в 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
    Чебуратор тега РНР
    Нет, конечно, невозможно.
    Вы первый, кому пришло в голову писать имя параметра кириллицей.
    Ответ написан
    Комментировать
  • Как перевести запросы mysqli в PDO?

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

    Но тут важно понимать, для чего ты это делаешь.
    Если просто "шоб було" - продолжай использовать mysqli.
    Если хочешь сократить размер кода в 3-10 раз - тогда имеет смысл. Но тогда надо сначала разобраться с тем, что такое PDO и какие преимущества оно дает программисту.

    Например, вместо такого кода
    $name = $mysqli->real_escape_sring($_GET['name']);
    $price = $mysqli->real_escape_sring($_GET['price']);
    $color = $mysqli->real_escape_sring($_GET['color']);
    
    $sql = "SELECT * FROM goods WHERE name = '$name' and color = '$color' and price > '$price'";
    $res = $mysqli->query($sql);
    $result = [];
    while ($row = mysqli_fetch_assoc($res)) {
        $result[] = $row;
    }
    echo json_encode($result);

    В ПДО можно написать
    $stmt = $pdo->prepare("SELECT * FROM goods WHERE name = ? and color = ? and price > ?");
    $stmt->execute([$_GET['name'],$_GET['price'],$_GET['color']]);
    echo json_encode($stmt->fetchAll());

    Что гораздо удобнее.

    Учитывая, что ПДО умеет возвращать данные в десятках различных форматов, вариантов сокращения кодов может быть такое же количество
    Ответ написан
    Комментировать
  • Как подсчитать количество заказов?

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

    Как это должно выглядеть на самом деле:

    public function countOrders($user_id)
    {
          $stmt = $this->pdo->prepare("SELECT count(1) FROM orders WHERE user_id =?");
          $stmt->execute([$user_id]);
          return $stmt->fetchColumn(); 
    }
    // и использование
    echo $obj->countOrders($_SESSION['user_session']);

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