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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Добавлю ответ на вопрос, заданный в заголовке.
    Потому что как всегда, в заголовке одно, а в тексте вопроса совсем другое. Вообще не про mysql, а про личные проблемы автора.

    Чтобы хранить эмодзи в mysql, надо использовать charset=utf8mb4
    Ответ написан
    Комментировать
  • Как сделать конструктор статей для блога?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    может ли человек в таком случае написать внутри статьи <?php ?> и выполнять серверный код,

    Если написанный тобой серверный код не исполняет текст статьи как серверный код, то безопасно.
    Ответ написан
    Комментировать
  • Почему не срабатывает TRUE в SQL запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Отвечу на вопрос "почему".
    Потому что приведение типов.
    Строка "FALSE" - это не булево значение FALSE, а строка, 5 букв. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "FALSE" получается 0. И поэтому сравнение "работает". Но разумеется так сравнивать нельзя.

    Строка "TRUE" - это, как уже должно быть понятно, не булево значение TRUE, а строка, 4 буквы. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "TRUE" получается 0. И поэтому сравнение "не работает". Если передать не строку а булево значение TRUE, то сработает.

    Поскольку в mysql нет типа поля boolean, лучше всего не выпендриваться с TRUE и FALSE, а просто передавать 0 и 1.
    Ответ написан
    Комментировать
  • Возможна ли вставка через PDO ассоциативного массива в БД MySql?

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

    $sql = 'INSERT INTO '. $table. '(`';
    $sql .= implode("`, `", array_keys($newData[0])).'`)';
    $sql .= ' VALUES (:';
    $sql .= implode(", :", array_keys($newData[0])).')';
    foreach ($newData as $row)
        $this->pdo->execute($sql, $row);
    }

    Другое дело что в этом коде инъекция на инъекции и инъекцией погоняет.
    Ответ написан
  • Как поменять значение в mysql через какое-то время?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак не делать.

    База данных - это не твой дневник, в котором ты привык двойку на тройку исправлять ластиком.
    В БД ничего через месяц подправлять не надо.
    Надо просто сделать колонку, в которой стоит дата смены статуса.

    И в запросе на получение статуса просто учитывать дату. Если проверен и прошло меньше месяца - то проверен.
    Иначе - не проверен.
    Ответ написан
    2 комментария
  • Как в большой базе можно получить такую статистику?

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

    Если запрос одноразовый, то просто запросить нужные данные.
    select SUBSTRING_INDEX(username, ' ' , 1), count(1) from table group by SUBSTRING_INDEX(username, ' ' , 1)
    Индекс на поле будет очень полезен

    Если надо выполнять регулярно, то поменять структуру таблицы, вынеся имя в отдельное поле.
    Ответ написан
    1 комментарий
  • Как использовать PDO::ATTR_EMULATE_PREPARES для автобинда параметров?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Можно.
    Косяк только один, но тебе вряд ли встретится, так что можно считать что нету.
    Если еще недельку поищешь на просторах интернета, то найдешь - какой именно.
    Ответ написан
  • Как найти источник медленных запросы MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Непонятно, зачем тебе источник.

    Запрос у тебя есть - его и надо оптимизировать.
    Ответ написан
    Комментировать
  • Запрос PHP+Mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если делать по-человечески
    $stmt->$mysql->prepare("UPDATE applications SET closed=1, close_user=? WHERE id = ?");
    $stmt->bind_param("ss",$close_user,$id);
    $stmt->execute();
    Ответ написан
    Комментировать
  • MySQL уникальные значения по одному полю, как?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну если по простому, то
    select * from images where position in (select min(position) from tests group by product_id);
    select * from images where position not in (select min(position) from tests group by product_id);
    Ответ написан
    6 комментариев
  • Как правильно хранить в Базе данных Разные названия одного фильма, тип фильма?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Речь идет только о переводах? Если да, то таблица с 4 полями: иза фильма, ид языка, название, флаг оригинальности.

    Статус я бы хранил в отдельной таблице. енум хорош для случаев когда заранее точно известен набор вариантов. Здесь наверняка значения будут добавляться и лучше делать это через обновление данных, а не структуры
    Ответ написан
  • Warning ошибка в запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед $db = new mysqli($localhost, $user, $passwd, $database); дописать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    после этого база сама скажет в чем проблема
    Ответ написан
    Комментировать
  • Как исправить ошибку: Too many connections в MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чаще всего причиной является либо говнокод, либо пконнект.

    При переходе с mysql api на mysqli многие не учитывают, что каждое новое обращение к mysqli connect, в отличие от mysql connect, создает новое подключение. И таким обраом из одного и того же скрипта создается множество подключений.

    Ну и обязательный карго культ - как только похапист узнает про pconnect, он тут же тащит его к себе в норку, и огребает те самые too many connections.

    И это при том, что при 150 одновременных коннектах можно держать 50000 онлайн пользователей спокойно. Всего-то надо выкинуть пконнект, создавать соединение строго 1 раз и оптимизировать запросы.
    Ответ написан
  • Как правильно переписать функции php 5 на php 7?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Менять тут надо не тоьлко код, но и подход.
    потому что большая часть старого кода - это бессмысленные телодвижения, которые не приводят ни к какому результату.
    Повторить тоже самое в пхп7 не удастся.

    вместо функции connect надо написать вот такой код
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8mb4';
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try {
        $mysqli = mysqli_connect($host, $user, $pass, $db);
        mysqli_set_charset($mysqli, $charset);
    } catch (\mysqli_sql_exception $e) {
         throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
    }
    unset($host, $db, $user, $pass, $charset);

    везде где раньше вызывалась эта функция, ее надо будет убрать
    вместо функции close() не нужно ничего, просто убрать все вызовы из кода.

    Вместо последнего блока кода
    $result = mysqli_query($mysqli, "SELECT * FROM admin WHERE uid='1'");
    $row = mysqli_fetch_assoc($result);
    $guid_agent = $row_admin['guid_agent'];
    $agent = $row_admin['agent'];

    Но самое главное - это код, где используются переменные в запросах.
    Их переписать так
    $sql = "SELECT * FROM users WHERE id=?"; // знак вопроса вместо переменной
    $stmt = $conn->query($sql); 
    $stmt->bind_param("s", $id); // переменная идет сюда
    $Stmt->execute();
    $result = $stmt->get_result(); // получаем result
    $user = $result->fetch_assoc(); // получаем массив
    Ответ написан
    5 комментариев
  • Как подключится к БД?

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

    Но раз уж спрошено, то правильно подключаться вот так:
    $host = 'booktst.beget.tech';
    $db   = '';
    $user = '';
    $pass = '';
    $charset = 'utf8mb4';
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    try {
        $mysqli = mysqli_connect($host, $user, $pass, $db);
        mysqli_set_charset($mysqli, $charset);
    } catch (\mysqli_sql_exception $e) {
         throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
    }
    unset($host, $db, $user, $pass, $charset); // we don't need them anymore


    Такой вариант подключения снимет сразу целую кучу проблем:
    • пропадут все проблемы связанные с кодировками (сохранятся вопросы вместо русских букв, не работает json_encode()...)
    • пропадут бесполезные сообщения об ошибках как mysqli_fetch_assoc() expects parameter..., место них будет выдаваться нормальное объяснение прочему запрос упал
    • сайт не будет позориться светя ошибками на весь интернет если упала база данных
    Ответ написан
  • Почему mysql возвращает пустую строку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что нет такой функции
    Ответ написан
  • Как с помощью bash можно копировать содержимое таблицы базы данных MySQL между двумя серверами?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В общем случае -
    mysqldump -р host -u user -ppassword --add-drop-table db_name table_name | mysql -h host1 -u user1 -ppass1


    Если прямого доступа дб на втором хосте нет, то тут могут быть варианты.
    Ответ написан
    Комментировать
  • Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, bool given in?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Подскажите, пожалуйста, в чём проблема?

    В ДНК. Шутка.

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

    Сначала делаем отдельный файл mysqli.php и пишем в него код соединения. И это не одна строчка.
    Код берем отсюда, подставляем свои значения.

    if (isset($_POST['search'])) {
        require 'mysqli.php';
        $stmt= $mysqli->prepare("SELECT * FROM `persons` WHERE firstname=?");
        $stmt->bind_param("s", $_POST['fname']);
        $stmt->execute();
        $result = $stmt->get_result();
        while($r = mysqli_fetch_assoc($result)){ ?>
                        <tr>
                              <td><?= $r['id']; ?></td>
                              <td><?= $r['firstname']; ?></td>
                              <td><?= $r['lastname']; ?></td>
                              <td><?= $r['age']; ?></td>
                              <td><?= $r['gender']; ?></td>
                              <td><?= $r['city']; ?></td>
                          </tr>
                	<?php
       		}
           	} ?>
    Ответ написан
    Комментировать
  • Создание динамической страницы как это вообще?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Подход-то у тебя правильный, а вот код неверный.
    Все верно, ид страницы передается через гет. То есть сначала ты выводишь все записи ссылками.
    А потом на странице проекта пишешь почти такой же код, только правильно
    Зaпомни, переменную никоrда нельзя подставлять в запрос напрямую. Ошибок и проблем не оберешься. Поэтому надо так
    $stmt=$address_mysqli->prepare("SELECT `headline` FROM `projects` WHERE `project_id=?");
    $stmt->bind_param("s", $_GET['project_id']);   
    $stmt->execute();
    $result=$stmt->ge_result()->fetch_assoc();
    echo $result['headline'];

    И твой заголовок отлично выводится

    В зависимости от $_GET['project_id'] будут выводиться разные заголовки
    Ответ написан
    1 комментарий