Ответы пользователя по тегу MySQL
  • Сколько обращений к базе данных происходит в данном коде?

    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" в качестве идентификатора быть не должно, а должен быть первичный ключ.
    Ответ написан
  • Как сохранить старое значение для input type file?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никак.

    Причем в данном конкретном случае это еще и бессмысленно.
    Админу не нужна картинка, чтобы отредактировать пост. Она уже загружена, и заново ее загружать просто не имеет смысла.
    Ответ написан
    6 комментариев
  • Ошибка 500 php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если это локальный сервер то добавить строчку
    php_ini("display_errors", "on");
    Если боевой, то смотреть ошибку в логах
    Ответ написан
    Комментировать
  • Занесение данных из формы в базу данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо выкинуть на помойку учебник, из которого взят этот код, пройти по ссылке, и написать нормальный на основе информации оттуда

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = new mysqli("зачем", "вам", "это", "знать?");
    
    $name = $_POST["name"];
    $login = $_POST["login"];
    $pass = $_POST["password"];
    
    $sql = "INSERT INTO admins (login, pass, name) VALUES (?,?,?)";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("sss", $login, $pass, $name);
    $stmt->execute();
    
    $id = $conn->insert_id;
    header("Location: profile.php?id=$id");


    Пара замечаний
    • отдельная таблица админов обычно не делается, достаточно общей таблицы пользователей
    • id вставлять не надо, его должна генерировать БД
    • после успешной обработки прямого POST запроса обязательно должен быть редирект. Обычно это либо созданная учетка, или страница входа или список пользователей или что-то ещё
    • при обработке прямого запроса никаких echo в коде быть не должно
    Ответ написан