Задать вопрос
Ответы пользователя по тегу MySQL
  • Как получить данные из строки mysqli?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы получить одну строку из результата запроса, в mysqli есть функции
    • fetch_assoc(): возвращает всю строку в ассоциативный массив
    • fetch_row(): возвращает нумерованный массив (список)
    • fetch_obj(): возвращает объект класса stdClass
    • fetch_column(): возвращает значение из первой колонки запрошенной строки

    В общем случае случае осмысленный код для получения значения единственной колонки будет таким
    $sql = "SELECT link FROM tablet where id=?";
    $result = $conn->execute_query($sql, [$a]); 
    $link = $result->fetch_column();

    Но как правильно замечено в комментариях, правильнее будет рандомизировать сразу в запросе, причем все делать одним запросом, а не тремя
    function Axelmo($conn) {
        $sql2 = "SELECT link FROM tablet ORDER BY rand() LIMIT 1";
        return $conn->query($sql)->fetch_column();
    }

    Ну и чисто для иллюстрации, как сделать запрос с ограничением по id
    function Axelmo($min, $max, $conn) {
        $sql2 = "SELECT link FROM tablet where id >= ? AND id <= ? ORDER BY rand() LIMIT 1";
        return $conn->execute_query($sql, [$min, $max])->fetch_column();
    }
    Ответ написан
    1 комментарий
  • Зависит ли скорость записи в БД от количества в ней записей?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ на вопрос, который вы почему-то решили вынести в заголовок (при том что, судя по тексту вопроса, вы прекрасно знаете ответ на него) - и который имеет очень мало общего с вашей реальной проблемой - уже дал Slava Rozhnev.

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

    Вариант 1, при котором никакой код менять не надо. Отключаем эти проверки устанавливая переменную mysql innodb_flush_log_at_trx_commit=0. Для этого надо обладать правами рута.
    Вариант 2: заключить все вставки в транзакцию
    Вариант 3: добавлять все записи одним запросом. Это можно сделать либо кодом Slava Rozhnev, либо запросом LOAD DATA INFILE

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Обращений" - либо 4, либо 1, в зависимости от настроек и содержимого connectdbpdo()
    "заставлять базу что-то делать" - в любом случае один.
    Ответ написан
    Комментировать
  • Возможна ли sql инъекция?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1 комментарий
  • MySQL PDO, Почему все значения при выборке типа string?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Зачем вы задаёте не тот вопрос, с которым у вас проблема?:)

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос с подвохом.
    Я сейчас сообразил, что узбекский - это не китайский же. Либо латиница, либо кирилица.
    То есть проблема скорее всего не в кодировке.
    А, как выяснилось в комментариях - тупо в неправильном выполнении запроса, и инъекциях.
    то есть переменные надо не напрямую пихать в запрос, а через специальные маркеры, как написано здесь https://habr.com/ru/articles/662523/

    Если же говорить про кодировки, то
    у поля (или таблицы) должна стоять не "одинаковая" кодировка, а utf8mb4
    в РНР при соединении должна устанавливаться кодировка utf8mb4
    в заголовках веб-сервер должен отдавать кодировку utf-8
    если текст пишется прямо в РНР коде, то этот код тоже должен быть в кодировке utf-8
    Ответ написан
    2 комментария
  • Как реализовать поиск по нескольким полям?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если вычистить из кода неверные кавычки и бессмысленные телодвижения, и переделать на "использование стандартных подготовленных запросов" (с) @Rsa97
    $data = [
        "%{$_POST['surname']}%",
        "%{$_POST['name']}%", 
        "%{$_POST['fathername']}%",
        "%{$_POST['phone']}%",
    ];
    $query = "SELECT * FROM `people` 
              WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
    $result = $conn->execute_query($query, $data);


    Если используется устаревшая версия РНР, то либо добавить в неё execute_query руками, либо написать по-старинке,
    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssss", ...$data);
    $stmt->execute();
    $result = $stmt->get_result();


    Одно из преимуществ такого подхода в том, что мы как раз не путаемся в кавычках. Одинарные в запросе становятся не нужны
    Ответ написан
  • У меня не правильный код?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Код тут действительно неправильный, причем по очень многим параметрам. Много бессмысленных телодвижений, инъекции, плюс условие можно записать оптимальнее. Так что помимо исправления конкретной опечатки от Rsa97, надо править этот код целиком
    $sql = "SELECT * FROM blocks WHERE user_id = ?";
    // выполняем запрос без инъекций. если версия РНР не новая, надо будет дописать эту функцию самому
    $result = $conn->execute_query($sql, [$id]);
    // получаем запрошенную строку, без всяких num_rows и foreach
    $row = $result->fetch_assoc();
    // получаем $block_level, даже если в $row пусто
    $block_level = $row["type"] ?? 0;
    // match - новое выражение в РНР начиная с 8.0 версии. в сто раз аккуратнее чем забор из elseif
    $block_text_type = match ($block_level) {
        1 => "Незначительная блокировка",
        2 => "Частичная блокировка",
        3 => "Полная блокировка",
        default => "Нет блокировок",
    };
    Ответ написан
    2 комментария
  • Производительность решения SQL like vs join?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это у вас, похоже, не опции, а свойства в неограниченном количестве.
    Если бы это были опции, то можно было бы или добавить просто колонки в основную таблицу, либо сделать одну колонку с битовой маской

    А свойства хранить либо в EAV, который у вас второй вариант, либо в JSON поле.
    И искать по ним отдельным не вот этим вот, а отдельным сервисом типа Эластика.

    В любом случае, первый вариант, понятное дело, это вообще не вариант
    Ответ написан
    Комментировать
  • Как хранить записанные маршруты?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Большие объемы данных хранят точно так же, как и маленькие.
    Любые отступления от этого правила должны быть продиктованы очень серьезными причинами. поскольку никаких причин вы не привели, то и ответ будет стандартный:
    Делаете таблицу вида
    route_id, lng,lat,speed,date
    и пишете в нее свои точки, используя множественный insert
    ошибка mysql лечится увеличением max_allowed_packet
    Ответ написан
  • Не работает php код?

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

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

    Или хотя бы перенести сайт с того утюга, на котором он хостится сейчас, на нормальный сервер. Потому что 10 секунд на перебор трех сотен тысяч строк - это запредельные какие-то цифры.
    Ответ написан
    Комментировать
  • Как получить массив в массиве, в одном запросе?

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

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

    А так-то SQL сервер вряд ли поддерживает создание дампа в формате Mysql напрямую
    Ответ написан
    3 комментария
  • Как вывести число записей добавленных в БД через PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    С одной стороны мы все когда-то учились и делали глупости.
    С другой - ну очень тяжело поверить, что человек, учивший в школе математику, не в состоянии справиться с задачей "посчитать повторяющиеся события".
    Вот вы же сами говорите, что есть цикл
    Какая проблема завести переменную, и прибавлять к ней для начала хотя бы единичку внутри цикла, а потом вывести получившийся результат?
    Ответ написан
    2 комментария
  • Как осуществить поиск слов из БД со стороны пользователя?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Понимаете, ваш вопрос звучит так: "Я тут надеваю ботинки. Как осуществить завязывание шнурков?"
    Работа с БД - это 99% кода любого сайта. Тем более такие простые запросы.
    Получается, что вы в принципе не понимаете, как разрабатывать сайты, и вам надо учиться делать именно это.
    То есть, вам надо взять учебник или какое-нибудь руководство. И учиться разрабатывать сайты. А не спрашивать, "как осуществить поиск слов".

    Но чисто для примера, для всех современных версий РНР, будет работать такой код

    <?php
    $word = $_GET['word'] ?? '';
    
    if ($word) {
        require 'db.php';
        $sql = "select * from dictionary where word=?";
        $stmt = $db->prepare($sql);
        $stmt->execute([$word]);
        $row = $stmt->fetch_assoc(); //  для PDO  будет просто fetch()
        echo $row['translation'];
    }


    в db.php, соответственно, код подключения к БД. Взять можно, например, отсюда https://habr.com/ru/articles/662523/

    Чтобы в РНР появилась переменная $_GET['word'], надо сделать форму в HTML. Хотя бы про это, я надеюсь, вам не надо рассказывать?
    Ответ написан
    Комментировать
  • Файл конфига php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Очень хороший вопрос, только вы путаете файл с настройками и файл первоначальной настройки приложения.
    Вам нужны оба.
    1. файл c настройками
    Их должно быть два.
    Первый файл называется config.sample.php, он содержит только один массив, который заполняется пустыми/дефолтными значениями и может содержать не только настройки БД но и содержать другие секции:
    <?php
    return [
      'db' => [
        'hostname' => '',
        'username' => '',
        'password' => '',
        'database' => '',
      ],
    ];

    Этот файл добавляется в репозиторий.

    Второй файл называется config.php и он создается руками каждый раз при установке CMS на новом сервере. В него пишутся актуальные настройки для каждого сервера.
    Этот файл не добавляется в репозиторий (а добавляется, соответственно, в .gitignore).

    2. Файл первоначальной настройки приложения.
    В него идут команды, которые пишутся на любой странице: подключение к БД, старт сессии, всякие инклюды и прочее. Кроме того, в этом файле должен быть код
    if (!file_exists('config.php'))
     {
         $msg = 'Создайте файл config.php на основе config.sample.php и внесите в него настройки';
         throw new RuntimeException($msg);
     }


    Таким образом система будет помогать программисту, если он забыл создать config.php с актуальными для конкретного сервера настройками.

    И вот этот файл, назовем его init.php, уже и подключаем во все остальные файлы.

    Кстати, начиная с 8 версии РНР можно писать просто
    $conn = mysqli_connect(...$config['db']);
    В этом случае ключи массива $config['db'] будут использоваться в качестве имен параметров функции - очень удобно
    Ответ написан
    Комментировать
  • Как оптимизировать таблицу с JSON строкой в mysql?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сам по себе вопрос бессмысленный, поскольку вообще ничего не сказано ни о данных, ни об их структуре. Ни о проблемах, которые вызывают необходимость такой "оптимизации".
    Так что на него можно ответить только так же абстрактно.
    Превращать JSON в EAV глупо.
    Так что вопрос здесь не в том, размазывать ли JSON по строкам, а в том, нужен ли он здесь вообще.

    Если в JSON поле лежат структурированные данные, то их в обязательном порядке надо развернуть в обычную таблицу/связанные таблицы.
    Если же лежит всякий мусор навалом - то можно оставить, но при этом придется делать отдельную таблицу или куда-то ещё записывать эталонную структуру этого JSONа, чтобы не оказалось, что одно и то же значение пишется под десятью разными ключами. Но опять же, судя по постановке вопроса, скорее всего автору нужна одна нормальная таблица с нормальными столбцами.

    Кроме того, никакого "login" в качестве идентификатора быть не должно, а должен быть первичный ключ.
    Ответ написан