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

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    operation_type это тип операции. Списание или же начисление. От этого на фронте будет вырисовываться определённый текст. PLUS - начисление, SUB, списание, но как я уже и сказал это у меня вызывает вопросы. Ведь даже при списании будет начисление.
    Смысл? Правильнее добавлять минус при списании к стоимости покупки, тогда это поле вообще не понадобится, а сумма по транзакциям будет правильной. Ну и на фронте исходя из знака отображать что там нужно...

    list_purchase, конечно можно вынести в отдельную таблицу и я понимаю даже почему, но данное поле даже необязательное, оно как примечание. Стоит ли для неважный вещей создавать таблицу?
    Вообще странно, что у вас покупка состоит вроде бы из набора итемов, но они нигде не перечислены, кроме как в необязательном поле...

    Не будет ли нарушаться принцип KISS?
    KISS это не принцип построения структур, это принцип построения кода, понятного для чтения и интерпретации. А изначально вообще принцип построения визуальных интерфейсов. В построении структуры реляционных баз основной принцип - соблюдение нормальных форм (см. ниже).

    И как бы Вы реализовали систему списания и начисления баллов? Наверное это самый главный вопрос
    Так а какая логика начислений? Надо добавить - делаем апдейт на нужную сумму, нужно списание - делаем апдейт на нужную разницу, в чем вопрос?

    Стоит ли делать зависимости? Чтобы сумма бонусов клиента зависела от таблицы покупок
    Может где то, в определённом источнике имеется свод информации, касаемо таких решений? Может где то, в определённом источнике имеется свод информации, касаемо таких решений?
    Это называется "нормальные формы". На практике вам будут нужны первая, вторая и третья нормальная форма (например хранение total_purchase нарушает 3 НФ, так как может быть вычислена из объединения с таблицей покупок).

    По наименованию полей: Вроде все более-менее норм, единственно что list_purchase и sum_purchase логичнее переставить - purchase_list и purchase_sum, хорошо же начинали с purchase_date, что пошло не так? )
    Ответ написан
    Комментировать
  • Увеличение записи на некоторое число по предыдущей записи?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Похоже что задача сводится к удалению всех айди и заполнения автоинкрементом с шагом 10.
    SET GLOBAL auto_increment_increment=10;
    SET GLOBAL auto_increment_offset=1;
    ALTER TABLE example DROP COLUMN id;
    ALTER TABLE example ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (id);
    Вообще задача странная, и попахивает очередным "гениальным" решением...
    Ответ написан
    1 комментарий
  • Не работает php код?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Логи смотри, ну или включи вывод ошибок.
    echo('Это имя пользователя уже занято.');
    header('Location: register.php'); // Возврат на форму регистрации
    Здесь стопудоф будет лажа, так как хеадер так не отправляется. Почему - учим матчасть. Собсно в логах это будет отражено.
    Ответ написан
  • Как записать base64 в таблицу?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    1) Хранить картинки в бд крайне кривое решение. Это может быть оправдано только в случае когда там хранится пара иконок, вставленная в текст прям через <имг срц="тут_бэйз64_строка"... и нет желания все это переделывать ради 2 кастомных микрокартинок. В остальном - конвертировать в картинку и хранить на диске. В бд писать путь до картинки. Если это какой-то аватар или картинка, связанная с другим объектом, соответственно заводить отдельную таблицу на картинки и связь один-к-одному или один-ко-многим, в зависимости от ситуации. В худшем случае поле в той же таблице, если точно будете знать что других картинок к объекту относиться не будет, но это должен быть путь до реальной картинки на диске.
    2) Почему хранение в бд - плохая идея: При каждом запросе у вас будет вытаскиваться пару мегабайт данных из бд, передаваться по каналу соединения с бд, помещаться в память, и после этого еще нужно программно отдавать картину, кроме прочего картинка в бэйс64 занимает примерно на 30% больше места.
    Когда у вас есть картинка на диске, вы просто вставляете путь до нее, это ~50 символов, и сервер отдает ее БЕЗ УЧАСТИЯ ПРОГРАММНОЙ ЧАСТИ, средствами вебсервера и ОС. Это быстрее, потребляет меньше памяти и занимает меньше места в хранилище.
    Ответ написан
    Комментировать
  • Почему не добавляется в базу данных информация с формы?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    $q = "INSERT INTO post(author, date_p, text_p) VALUES ('$author', '$datep', '$text_content')"; 
    //  ";" в одиночных запросах не ставится, а текстовые значения обрамляются кавычками
    var_dump($q); //смотрим глазками, проверяем в консоли
    $q = "INSERT INTO post(author, date_p, text_p) VALUES (?, ?, ?)"; 
    //никогда не лезем в бд без подготовленных выражений!
    $st = $pdo->prepare($q);
    $sth->execute([$author, $datep, $text_content]);
    Ответ написан
    1 комментарий
  • SQL запрос к БД через WordPress в 46 раз дольше чем через phpmyadmin?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых нужно нормально писать запрос, хотя бы для понимания что вы делаете:
    SELECT DISTINCT tt.term_id 
    FROM wp_term_relationships AS tr 
    JOIN wp_term_taxonomy AS tt 
    ON tr.term_taxonomy_id = tt.term_taxonomy_id 
    JOIN wp_terms AS t 
    ON tt.term_id = t.term_id 
    WHERE tr.object_id IN (
       SELECT p.ID 
       FROM wp_posts AS p 
       JOIN wp_term_relationships AS tr 
       ON p.ID = tr.object_id 
       JOIN wp_term_taxonomy AS tt 
       ON tr.term_taxonomy_id = tt.term_taxonomy_id 
       JOIN wp_terms AS t 
       ON tt.term_id = t.term_id 
       WHERE p.post_type = 'product' 
       AND p.post_status = 'publish' 
       AND tt.taxonomy = 'product_cat' 
       AND t.term_id = '2961' 
    ) 
    AND tt.taxonomy LIKE 'pa_%';

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

    Ну и в третьих, запросы без лимита почти всегда будут медленными, так как бд вынуждена перебирать все таблицы перебором. Если же такой запрос необходим по каким то причинам, то стоит посмотреть что же происходит с запросом. Нужно в первую очередь сделать отдельно вложенный запрос, проверить как он работает, оптимизировать, а затем то же самое сделать с внешним. Так же неплохо прогнать эти запросы через explain, посмотреть каких индексов не хватает. Ну и первое на что стоит обратить внимание это tt.taxonomy LIKE 'pa_%', что само по себе затратно, и требует обязательного индекса.
    Ответ написан
    Комментировать
  • Как правильно вывести последнее сообщение в блок слева который будет на картинке?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    SELECT m.*, u.login, i.img
        FROM messages m
        LEFT JOIN users u
        ON m.to_user_id = u.id
        LEFT JOIN image i 
        ON m.to_user_id = i.obj_id 
        WHERE m.date > :lastdate # надо выбирать все что позже уже полученных сообщений
        AND image.obj_type = 'user' 
        AND m.from_user_id = :fid  # айди "от юзера"
        AND m.to_user_id = :tid #айди "к юзеру"
        ORDER BY m.date  # по возрастанию все старше последнего полученного
    Ответ написан
    Комментировать
  • Как исправить ошибку?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    rank является зарезервированной функцией мускуля, скорее всего надо обернуть имя поля и имя таблицы в обратные кавычки.
    Ответ написан
    Комментировать
  • Отправка формы и разделение на массив данные из формы?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    explode(), foreach массива, trim() значений, опять explode(), получаете ваши значения.

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

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Транзакция это не логика, транзакция это защита от ситуации "что-то пошло не так". Логика проверок отдельно, внесение данных в транзакции отдельно. Если транзакция не прошла - откатываем все изменения внесенные до ошибки. То есть транзакция защищает целостность данных, где например счет одного клиента уменьшен, а другого не пополнен, например какой-то форенкей отсутствует. Нельзя строить логику проверки на транзакциях, она не для этого.
    Ответ написан
    Комментировать
  • Как получать данные из формы на сайте в разные таблицы БД?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    if(isset($submit)) А если я не нажал кнопку, просто нажал ентер в любом поле?
    $number = $_POST['phone_number'];Такого поля в форме вообще нет.
    if(isset($name) && isset($email)) Ну допустим есть такие переменные, если в них не нэйм и емэйл то что делать? С мессажем та же фигня...

    Запросы ВСЕГДА должны выполняться через подготовленные выражения.
    Ответ написан
    1 комментарий
  • Почему не работает $_SESSION?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Файл подключения:
    Зачем? Тут нет никакой логики связанной с логином.

    Что у вас в сессии смотрели?
    var_dump($_SESSION);
    if (isset($_SESSION['logged_user']))...
    Ответ написан
  • Как обновлять пост в базе данных mysql?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Как мне сделать , чтобы бэк сам послал запрос в базу данных в это время
    Никак, в это время будет каждый раз разное, и даже если использовать крон с какой-то долей разумности, отследить конкретно это время не получится, но это и не нужно...

    в посте есть еще пункт статус, который будет меняться на false,
    Зачем? Разве не понятно что текущее время больше даты окончания?

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

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    Хинт: ORDER BY может принимать более одного аргумента
    Ответ написан
    Комментировать
  • Как отобразить различный текст в зависимости от времени добавления данных в БД?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    У нас есть код "DATEPOSTED" из базы данных
    Допустим...

    $DATEPOSTED = date("Y m d");
    Теперь у нас нету DATEPOSTED из базы данных (
    Ответ написан
    Комментировать
  • Почему не работает PhpMyAdmin WAMP?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    первая строчка в гугле:
    https://stackoverflow.com/questions/11445678/binar...
    Ответ написан
    Комментировать
  • Как получить нужные id из mysql?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    1) поле id обычно используется для обеспечения уникальности данных на уровне строк. Если у вас там не уникальное значение, желательно использовать другое название. В идеале должно быть и уникальное `id` и кастомное `чтототам_id`...
    2) Rsa97 уже написал все ключевые функции для решения данной задачи. В принципе достаточно по ним загуглить...
    Ответ написан
    Комментировать
  • Не могу авторизоваться, почему?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    так, давайте по порядку:
    login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING);
    $pass = filter_var(trim($_POST['pass']), FILTER_SANITIZE_STRING);
    Во первых - зачем? Вы здесь не вносите никаких данных в систему, вы просто проверяете данные от пользователя с данными в бд.
    Во вторых - если у вас есть правила для логина и пароля - надо их и применять, а не втыкать абсолютно бесполезные фильтры.

    $pass = md5($pass."ghjsfkld2345");используйте встроенные функции, password_hash и password_verify для работы с паролями.

    $result = $mysql->query("SELECT * FROM `users` WHERE `login` = '$login' AND `pass` = '$pass '");
    Читаем про подготовленные выражения. Без них рано или поздно словите инъекцию. И начинать надо сейчас, на этапе обучения, и привыкнуть что по другому с переменными в запросах не работают. Так же, по уму подключение желательно вынести отдельно и добавить настройки. Рекомендую использовать PDO драйвер подключения к бд, он работает чуть быстрее и по функционалу побогаче.

    Warning: count(): Parameter must be an array or an object that implements Countable in D:\OSPanel\domains\Site1\auth.php on line 14
    по тому что читаем доку -
    fetch_assoc — Fetch the next row of a result set as an associative array
    Соответственно, если запрос пустой, то фетчить нечего. Для проверки существует num_rows.

    Выводит: "Такой пользователь не найден." Но в БД такой пользователь есть зарегестрированный, все данные авторизации правильные, а он выводит, что нету такого пользователя.
    Программу не на*бешь. Если говорит что нету, значит нету. А если не находит то что есть, значит вы не правильно ищете, что легко проверить. Вангую что запрос будет совершенно не таким как вы ожидаете:
    ...
    $query = "SELECT * FROM `users` WHERE `login` = '$login' AND `pass` = '$pass'";
    var_dump('check: ',$login, $pass,$query); 
    $result = $mysql->query($query);
    ...


    UPD: абсолютно верно подмечено Adamos - `pass` = '$pass ' никогда ничего не найдет из-за пробела в условии.
    Ответ написан
    Комментировать
  • MySQL. Поиск в Базе данных по одному параметру?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Во первых - научитесь разделять код и представление, винегрет из кода и разметки не то что отлаживать, читать тяжело.
    Во вторых - $result полученный в первом куске вы нигде не используете, ни в выводе, ни в вычислениях.
    Ну и в третьих - в последнем куске вы затираете ранее полученный результат выборки, так что смысл в первой выборке полностью теряется.
    Ответ написан
    Комментировать
  • Как увеличить скорость загрузки данных в Mysql?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    1) Как загружаются данные? Из консоли импортом дампа? Из пхпмайадмина? Из своего кода?
    2) Закомментируйте все строки создания индексов, это сильно ускорит загрузку. Естественно в конце надо будет пройтись и ручками добавить индексы в нужные места.
    3) про конфиг
    To check which configuration files are processed by the server, just execute
    $ /path_to_mysqld/mysqld --help --verbose
    At the beginning of output you will find information about configuration files, e.g.
    Ответ написан
    Комментировать