2011-09-11 5 views
0

私はハイスコアテーブルを持っているが、それはランダムな時間にそれが戻っ0に特定のユーザーをリセットしているように見えるの問題から離れて正常に動作しているようだ、これは私のクエリです:MySQL UPDATE値をランダムにリセットしますか?

$user = isset($_GET['username']) ? $_GET['username'] : ""; 
$time = isset($_GET['time']) ? $_GET['time'] : ""; 
$videos = isset($_GET['videos']) ? $_GET['videos'] : ""; 
$credits = isset($_GET['credits']) ? $_GET['credits'] : ""; 


$user = mysql_real_escape_string($user); 
$time = mysql_real_escape_string($time); 
$videos = mysql_real_escape_string($videos); 
    $credits = mysql_real_escape_string($credits); 
    $secret = mysql_real_escape_string($secret); 

// Main Query 
$retval = mysql_query(" 
    INSERT INTO 
    highscores(Username, Time, Videos, Credits) 
    VALUES 
    ('$user', '$time', '$videos', '$credits') 
    ON DUPLICATE KEY UPDATE 
    Time = '$time', 
    Videos = '$videos', 
    Credits = '$credits' 
    ", 
    $conn 
    ); 

それはの罰金ほとんどを更新します時間は、誰が問題が何であるかを見ることができますか?

+1

各変数には何が含まれていますか?それぞれが設定されていることを確認しましたか?それは実際にはデータベースの不具合ですか? –

+0

テーブルのPRIMARYキーとUNIQUEキーは何ですか? –

+0

今のところ、誰も問題を見ることはできません。もう少しコンテキストを提供し、それらの変数の値が何であるか教えてください。 – tdammers

答えて

2

クレジットを更新してゼロにしないと思います。

クエリを実行する前に$ creditを0に設定すると、ON DUPLICATE KEY UPDATE部分よりも現在のユーザークレジットがゼロになるとします。私はあなたが

$query = sprintf("INSERT INTO highscores(Username, Time, Videos, Credits) 
    VALUES('%s', '%s', '%s', '%s') 
    ON DUPLICATE KEY UPDATE Time = Time + %2$s, Videos = Videos + %3$s, Credits = Credits + %4$s"  
    mysql_real_escape_string($user), // escape every variable you will be using in 
    mysql_real_escape_string($time), // an SQL query to protect yourself against 
    mysql_real_escape_string($videos), // SQL injection or use parametriezed 
    mysql_real_escape_string($credits)); // queries with wrappers such as PDO or MySQLi 

$retval = mysql_query($query,$conn); 

を探しているユーザーが既に存在する場合は、「これはただ現在のCreditsに新しい値を追加しますが、それは勝ったと思う

<?php 
$user = 109; 
$time = time(); 
$videos = 'something'; 
$credits = 0; 
$retval = mysql_query("INSERT INTO 
         highscores 
         (Username, Time, Videos, Credits) 
         VALUES 
         ('$user', '$time', '$videos', '$credits') 
         ON DUPLICATE KEY UPDATE 
         Time = '$time', 
         Videos = '$videos', 
         Credits = Credits + 1", $conn); 
+0

ありがとうございました。 – Jamie

1

:代わりに、このような何かを行う必要があります他の何かを変える。これは私にとっては論理的なようです。 Videosなどの他の列も増やす必要がある場合は、Creditsの場合と同じことをします。

+0

'%s'とは何か' Time'と 'Videos'も更新したいですが' Time'はTime Ran、 'Videos'はVideos Watchedです、' Credits'は得られたクレジットです。 – Jamie

+0

@Jamie:['sprintf'](http://php.net/manual/en/function.sprintf.php)機能について読んでください。これは文字列フォーマット関数です。私はここでそれを使用しました。なぜなら、変数を変数から切り離すことで、クエリをより簡単に読むことができるからです。 – Shef

+0

ありがとう、それを試してみましょう。 – Jamie

0

この動作の原因は他にも指摘されています。 ON DUPLICATE UPDATEの別の構文は次のとおりです。

// Main Query 
$retval = mysql_query(" 
    INSERT INTO highscores 
     (Username, Time, Videos, Credits) 
    VALUES 
     ('$user', '$time', '$videos', '$credits') 
    ON DUPLICATE KEY UPDATE 
     Time = Time + VALUES(Time), 
     Videos = Videos + VALUES(Videos), 
     Credits = Credits + VALUES(Credits) 
    ", 
    $conn 
    ); 
関連する問題