2013-07-10 4 views
1

Эй, я столкнулся с небольшой проблемой в моем приложении SQL/PHP/JAVA. Я надеюсь, что вы, ребята, можете помочь :) У меня есть приложение Java, которое при запуске связано с моим сайтом, когда приложение Java подтверждает, что он работает с моим сайтом, и мой сайт назначает идентификатор сеанса как для приложения Java, так и для самого веб-сайта.MySQL вставить, а затем обновить данные таблицы

прохладно, мы хорошо до сих пор?

alright my java-приложение отправляет данные через регулярные промежутки времени на страницу под названием Dashboard.php, что я хотел бы сделать, это сохранить данные в моей таблице Mysql, а затем, когда новые данные будут получены Dashboard.php из моего приложения java, sessionID тот же, я хотел бы, чтобы таблица обновлялась до новых данных, которые только что были получены

вот php, я до сих пор, хотя он не работает.

function update($script_name, $version, $runtime, $status, $ranged, $attack, $defense, $strength, $magic, $sessionID, $username) 
{ 
    global $db; 
    $sql = "SELECT * FROM Dashboard WHERE session_id = '$sessionID'"; 
    try { 
     $results = $db->query($sql); 
     if ($results->rowCount() <= 0) { 
      $query = "INSERT INTO Dashboard (script_name, version, runtime, status, ranged, attack, defense, strength, magic, session_id, username) VALUES ('$script_name', '$version', '$runtime', '$status', '$ranged', '$attack', '$defense', '$strength', '$magic', '$sessionID', $username)"; 
      $db->exec($query); 
     } else { 
      foreach ($results as $row) { 
       $timerunnew = $row['runtime'] + $runtime; 
       $v4new = $row['ranged'] + $range; 
       $v5new = $row['attack'] + $attack; 
       $v6new = $row['defense'] + $defense; 
       $v7new = $row['strength'] + $strength; 
       $v8new = $row['magic'] + $magic; 
      } 
      $db->exec("UPDATE Dashboard SET `runtime` = $timerunnew, `ranged` = $v4new, `attack` = $v5new, `defense` = $v6new, `strength` = $v7new, `magic` = $v8new WHERE session_id = '$sessionID'"); 
     } 
    } catch (PDOException $ex) { 
     echo "fail"; 
    } 
} 

Ive также пытались экспериментировать с ON DUPLICATE KEY UPDATE value = VALUES(value) однако я не имел никакой удачи ли кто-нибудь есть решение? любая помощь была бы оценена

+1

В вашем параметре у вас есть '$ ranged', но вы используете' $ range' o n: '$ v4new = $ row ['ranged'] + $ range;' – Timber

+0

oh wow я не видел, что позволило мне изменить это и проверить его –

ответ

0

Если это единственный способ, что записи могут быть вставлены в Dashboard таблицу, то невозможно две записи, чтобы одни и те же session_id (за исключением опасности гонки происходит между SELECT и INSERT команд). В этом случае, вы должны:

  1. Убедитесь, что есть UNIQUE ключа, определенные на session_id:

    ALTER TABLE Dashboard ADD UNIQUE KEY (session_id); 
    
  2. Использование INSERT ... ON DUPLICATE KEY UPDATE, в идеале с правильно параметризованным подготовленным заявлением:

    $qry = $db->prepare(' 
        INSERT INTO Dashboard (
        script_name, version, runtime, status, ranged, attack, 
        defense, strength, magic, session_id, username 
    ) VALUES (
        :script_name, :version, :runtime, :status, :ranged, :attack, 
        :defense, :strength, :magic, :session_id, :username 
    ) ON DUPLICATE KEY UPDATE 
        runtime = runtime + VALUES(runtime), 
        attack = attack + VALUES(status), 
        defense = defense + VALUES(defense), 
        strength = strength + VALUES(strength), 
        magic = magic + VALUES(magic) 
    '); 
    
    $qry->execute([ 
        ':script_name' => $script_name, 
        ':version'  => $version, 
        ':runtime'  => $runtime, 
        ':status'  => $status, 
        ':ranged'  => $ranged, 
        ':attack'  => $attack, 
        ':$defense' => $defense, 
        ':strength' => $strength, 
        ':magic'  => $magic, 
        ':session_id' => $sessionID, 
        ':username' => $username 
    ]); 
    
+0

большое спасибо, я дам этот шанс! и посмотреть, работает ли это! –