我有一个基于浏览器的游戏的个人项目,我目前正在使用旧代码,并尝试优化和更新所有内容。我有很多功能,如下面的一个,它基本上更新了球员项目数量。使用该项目时,该行将保留在数据库中,但金额设置为0,然后当玩家购买/找到更多该项目时更新金额。
在这里搜索之后,我有一个想法,像'更新,如果存在'可以工作,而不是使用COUNT查询,可能是更新的多查询,但我只是不确定实现这一目标的最佳方法,如果可能的话。
表格有一个自动递增的ID,但是玩家可以在表格中有多行,我用userID识别。
如果这是一个新问题我道歉,但我是自学成才,如果你不问那些知道自己在做什么的人,你就永远不会学习正确的做事方式:)
也很乐意获得有关代码的建议。
function power_caps_to_loot($userID, $itemID, $amount, $itemName, $updateInv) {
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// check if user has any of items already
$query = "SELECT COUNT(itemID) from lootbag where userID = $userID AND itemID = $itemID";
$result = $mysqli->query($query);
$row = $result->fetch_array(MYSQLI_NUM);
$count = $row[0];
// if user has/had some already update amount, else insert new row
if ($count > 0) {
$query = "UPDATE lootbag SET amount = amount + $amount WHERE userID = $userID AND itemID = $itemID";
$mysqli->query($query);
} else {
$query = "INSERT INTO lootbag (itemID, userID, amount, itemName, type, sub_type)
VALUES ($itemID, $userID, $amount, '$itemName', 'Cyborg Power Capsule', 'cyb_power')";
$mysqli->query($query);
}
// if item comes from inventory, update amount
if ($updateInv == 1) {
$query = "UPDATE inventory SET amount = amount - $amount WHERE userID = $userID AND itemID = $itemID";
$mysqli->query($query);
}
$mysqli->close();
答案 0 :(得分:3)
用于重复密钥更新或“upsert”
insert into .... on duplicate key update col1 = values(col1) ...
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
将索引设置为不允许重复,并且该语句将处理其余的
INSERT INTO lootbag (itemID, userID, amount, itemName, type, sub_type)
VALUES ($itemID, $userID, $amount, '$itemName', 'Cyborg Power Capsule', 'cyb_power')
ON DUPLICATE KEY UPDATE amount = amount + values(amount)
应该有效,假设您有关于商品ID和用户ID的唯一索引