PHP mysql Update

WmzBot

Поклонник кармы
Участник
Старожил I степени
Сообщения
563
Розыгрыши
0
Решения
1
Репутация
68
Реакции
181
Баллы
775
Хроники
  1. Chronicle 1: Harbingers of War
Сборка
web
добренького. такая проблемка. делаю проверку на наличие предмета в базе по owner и item_id.
если проверка дает результат, должен выполниться запрос UPDATE, иначе же, если результаов нет, выполнить INSERT .
проблема в следующем: все работает, пака в базе 1 запись, как только появляется вторая запись с другим owner_id, запрос не делает insert, а пытается сделать update не существующей записи.

PHP:
   public function AddItem($char_id, $item_id, $count, $enchant) {
     
        $result = $this->game_db->select("SELECT count(*) as `count` FROM items WHERE owner_id = $char_id AND item_id = $item_id");
        if ($result[0]['count'] > 0)
            {                  
            $link = mysqli_connect("IP", "Login", "Pass", "DBname");
            if($link === false){
            die("ERROR: Could not connect. "
            . mysqli_connect_error());
            }
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count
         
            );
            $sql = "UPDATE items SET count = count + $count WHERE owner_id = $char_id AND item_id = $item_id";
                if(mysqli_query($link, $sql))
                {
                    mysqli_close($link);
                        }
        }     else {
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count,
            'enchant_level' => $enchant,
            'loc' => 'INVENTORY'
         
            );
            $this->game_db->insert("items", $item_data);
            }
    }
проверял в ручную запрос на вывод колличества строк, результат 0. мне непонятно это поведение, ведь условие составлено верно.
 

Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
добренького. такая проблемка. делаю проверку на наличие предмета в базе по owner и item_id.
если проверка дает результат, должен выполниться запрос UPDATE, иначе же, если результаов нет, выполнить INSERT .
проблема в следующем: все работает, пака в базе 1 запись, как только появляется вторая запись с другим owner_id, запрос не делает insert, а пытается сделать update не существующей записи.

PHP:
   public function AddItem($char_id, $item_id, $count, $enchant) {
    
        $result = $this->game_db->select("SELECT count(*) as `count` FROM items WHERE owner_id = $char_id AND item_id = $item_id");
        if ($result[0]['count'] > 0)
            {                 
            $link = mysqli_connect("IP", "Login", "Pass", "DBname");
            if($link === false){
            die("ERROR: Could not connect. "
            . mysqli_connect_error());
            }
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count
        
            );
            $sql = "UPDATE items SET count = count + $count WHERE owner_id = $char_id AND item_id = $item_id";
                if(mysqli_query($link, $sql))
                {
                    mysqli_close($link);
                        }
        }     else {
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count,
            'enchant_level' => $enchant,
            'loc' => 'INVENTORY'
        
            );
            $this->game_db->insert("items", $item_data);
            }
    }
проверял в ручную запрос на вывод колличества строк, результат 0. мне непонятно это поведение, ведь условие составлено верно.
попробуй вместо INSERT -> REPLACE
 
Групировку надо в первый запрос)
 
Можно еще извратиться таким вот образом и не писать кучу кода
SQL:
INSERT INTO `items` (`owner_id`, `item_id`, `count`, `enchant_level`, `loc`) VALUES({$char_id}, {$item_id}, {$count}, {$enchant}, 'INVENTORY') ON DUPLICATE KEY UPDATE `count` = `count ` + {$count};
конечно для коректного срабатвания запроса подразумевается что в таблице есть индекс на owner_id + item_id
 
Я не уверен, но если вместо ` count(*) as `count` сделать просто *, то должно всё быть ок.


То-есть какой смысл тут от count, в базе возможна запись одних и тех же строк с разными айди?
 
Я не уверен, но если вместо ` count(*) as `count` сделать просто *, то должно всё быть ок.


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

Можно еще извратиться таким вот образом и не писать кучу кода
SQL:
INSERT INTO `items` (`owner_id`, `item_id`, `count`, `enchant_level`, `loc`) VALUES({$char_id}, {$item_id}, {$count}, {$enchant}, 'INVENTORY') ON DUPLICATE KEY UPDATE `count` = `count ` + {$count};
конечно для коректного срабатвания запроса подразумевается что в таблице есть индекс на owner_id + item_id
а вот это стоит опробовать.
 
неа, не 1 из вариантов не помогает. он просто не заносит даже инсерт на другой owner_id. то есть не делает даже вторую запись с другого аккаунта.
 
Можно еще извратиться таким вот образом и не писать кучу кода
SQL:
INSERT INTO `items` (`owner_id`, `item_id`, `count`, `enchant_level`, `loc`) VALUES({$char_id}, {$item_id}, {$count}, {$enchant}, 'INVENTORY') ON DUPLICATE KEY UPDATE `count` = `count ` + {$count};
конечно для коректного срабатвания запроса подразумевается что в таблице есть индекс на owner_id + item_id
обновляет только 1 запись, не важно с каким owner_id это отправляется.
 
Решено. проблема была воточ, что столбец обьект ид имел примари кей.

пака решал, код переписал покороче.
Код:
        public function AddItem($char_id, $item_id, $count, $enchant) {
        
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count,
            'enchant_level' => $enchant,
            'loc' => 'INVENTORY'
            
            );
            
        $result = $this->game_db->select("SELECT * FROM items WHERE owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");
        
        if (count($result) > 0)
        $this->game_db->update("items", array('count' => ($result[0]['count'] + $count)), "owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");

        else
        $this->game_db->insert("items", $item_data);

}
 
Решено. проблема была воточ, что столбец обьект ид имел примари кей.

пака решал, код переписал покороче.
Код:
        public function AddItem($char_id, $item_id, $count, $enchant) {
       
            $item_data = array(
            'owner_id' => $char_id,
            'item_id' => $item_id,
            'count' => $count,
            'enchant_level' => $enchant,
            'loc' => 'INVENTORY'
           
            );
           
        $result = $this->game_db->select("SELECT * FROM items WHERE owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");
       
        if (count($result) > 0)
        $this->game_db->update("items", array('count' => ($result[0]['count'] + $count)), "owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");

        else
        $this->game_db->insert("items", $item_data);

}


Я подозреваю что это был ключевой момент
Код:
AND loc = 'INVENTORY'"

По поводу покороче:
Код:
public function AddItem($char_id, $item_id, $count, $enchant) {

    $result = $this->game_db->select("SELECT * FROM items WHERE owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");

    if (count($result) > 0) {
        return $this->game_db->update("items", ['count' => ($result[0]['count'] + $count)], "owner_id = $char_id AND item_id = $item_id AND loc = 'INVENTORY'");
    }

    return $this->game_db->insert("items", [
        'owner_id' => $char_id,
        'item_id' => $item_id,
        'count' => $count,
        'enchant_level' => $enchant,
        'loc' => 'INVENTORY'
    ]);

}
 
Назад
Сверху Снизу