将php简化为mysql

lymnna71  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(265)

我现在正在写一个游戏,我需要把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 if not exist otherwise update
我有一个专栏叫 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检查,但只有一行,正在更新succeeded字段。
我错过什么了吗?

c6ubokkw

c6ubokkw1#

如果在表中添加唯一键(uid,cid),那么 ON DUPLICATE KEY UPDATE 应该有用。你的 id 列不会受到影响或导致问题。
此外,您还应该注意您的代码不容易被sql注入,看起来可能是这样。

相关问题