1

ねえ、私の SQL/PHP/JAVA アプリケーションで小さな問題が発生しました。皆さんが助けてくれることを願っています :) 私は、Java アプリケーションが実行されていることを検証するときに、私の Web サイトに接続されている Java アプリケーションを持っています。私のWebサイトは、JavaアプリケーションとWebサイト自体の両方にセッションIDを割り当てます。

今のところ大丈夫ですか?

さて、私の Java アプリケーションは、Dashboard.php というページに定期的にデータを送信します。データを Mysql テーブルに保存し、セッション ID が同じ Java アプリケーションから Dashboard.php が新しいデータを受信したときに、データを保存したいと考えています。受信したばかりの新しいデータにテーブルを更新したい

これは動作しませんが、これまでに持っている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";
    }
}

私も試しON DUPLICATE KEY UPDATE value = VALUES(value)てみましたが、運がなかったのですが、誰かが解決策を持っていますか? どんな助けでも大歓迎です

4

1 に答える 1

0

これがテーブルにレコードを挿入できる唯一の方法である場合Dashboard、2 つのレコードが同じレコードを共有することは不可能です(とコマンドsession_idの間で発生する競合の危険を除いて)。その場合、次のことを行う必要があります。SELECTINSERT

  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
    ]);
    
于 2013-07-10T19:39:23.273 に答える