Упростите PHP в MySQL

В настоящее время я пишу своего рода игру, и мне нужно упростить часть PHP до MySQL.

Прямо сейчас, чтобы обновить столбец, я делаю это (в PHP):

$res = $db->query("
SELECT succeeded
     , failed
     , prison 
  FROM users_crime_masteries 
 WHERE uid = $uid 
   AND cid = $crimeid
");
if ($status == 'succeeded') {
        if (!$res->num_rows) {
            $db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($uid, $crimeid, 1)");
            return 1;
        }
        else {
            $row = $res->fetch_object();
            $db->query("UPDATE users_crime_masteries SET succeeded = succeeded + 1 WHERE uid = $uid AND cid = $crimeid");
            return $row->succeeded += 1;
        }
    }

^ Это половина функции, но идею вы поняли.

То, что я в основном пытаюсь достичь только в mySQL, - это то, что если нет строк, вставьте новую строку с cid и uid - если строка существует, обновление выполнено успешно с + 1.

Я просматривал stackoverflow и в основном понимаю, что мне нужно использовать запрос INSERT ... ON DUPLICATE KEY UPDATE.

Но я наткнулся на этот комментарий: MySql Table Insert, если не существует, иначе обновить

У меня есть столбец с именем id, который является автоматическим приращением и первичным ключом. Мой вопрос: вызовет ли это какие-либо проблемы?

Моя текущая версия MySQL: 5.7.24

Кроме того, для этого ON DUPLICATE KEY UPDATE я должен сделать столбцы uid и cid ключевыми?

Дополнительная информация:

Изменены запросы на:

switch($status) {
        case 'succeeded' :
            $db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE succeeded = succeeded + 1");
        break;
        case 'failed' :
            $db->query("INSERT INTO users_crime_masteries (uid, cid, failed) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE failed = failed + 1");
        break;
        case 'prison' :
            $db->query("INSERT INTO users_crime_masteries (uid, cid, failed, prison) VALUES($userid, $crimeid, 1, 1) ON DUPLICATE KEY update failed = failed + 1, prison = prison + 1");
        break;
    }

Выполните следующий запрос MySQL:

ALTER TABLE `users_crime_masteries`


ADD UNIQUE KEY `uid` (`uid`),
  ADD UNIQUE KEY `cid` (`cid`),

Совершил несколько преступлений с другим cid, проверил через phpmyadmin, но есть только одна строка, обновляющая успешное поле.

Я что-то упустил?

Нет проблем @ Love2Code. Просто обновите его, используя идентификатор или первичный ключ.

AT-2017 23.12.2018 14:27

Узнайте о подготовленных операторах для предотвращения внедрения sql

Jens 23.12.2018 14:44

Я не понимаю смысла выбора

Strawberry 23.12.2018 14:47

Если вы можете включить ADOdb, вы можете использовать метод заменять()

Agnius Vasiliauskas 23.12.2018 15:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
4
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы добавите в таблицу уникальный ключ (uid, cid), ON DUPLICATE KEY UPDATE должен работать. Ваша колонка id не пострадает и не вызовет проблем.

Кроме того, вы должны позаботиться о том, чтобы ваш код не был подвержен SQL-инъекциям, похоже, что это может быть.

почти работает! Можете ли вы проверить опубликованные мной правки?

Love2Code 23.12.2018 14:50

Точно не знаю вашу модель, но думаю, что это будет ALTER TABLE users_crime_masteries ADD UNIQUE KEY crime_key (uid, cid);. Crime_key - это просто имя ключа, вы можете выбрать для него другое имя.

digijay 23.12.2018 15:31

Другие вопросы по теме