2015-12-15 26 views
6

Okulum için ping pong puanlarını günlüğe kaydetmek için php'de bir web sitesi oluşturuyorum ve şu anda kazanan oyuncu WinnerID, LoserID, PointsFor, PointsAgainst'u günlüğe kaydedecektir. Aşağıdaki ilişkilerle iki tablom var.Puan attı puan kazandıktan yardıma ihtiyacım var

Tablo: Kullanıcıların

  • USER_ID (PK)
  • kullanıcı adı
  • Elo

Tablo: oyunlar

  • game_id (PK)
  • WinnerID (FK)
  • LoserID
  • PointsAgainst (FK)
  • PointsFor

php dosyasında Benim insert ifadesi:

İşte
INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore')" 

ne denedim, ama göstermez puanlar doğru. Yukarıdaki resimde de görebileceğiniz gibi

SELECT min(u.username) 'Username', COUNT(g.WinnerID) 'Wins', sum(g.PointsFor) 'Points For', sum(g.PointsAgainst) 'Points Against', u.Elo 'Ranking' 
from games g 
LEFT JOIN users u 
on g.WinnerID = u.user_id 
Group by g.WinnerID 

This is the select statement output

, toplamlarınıza için puan ve puan eklemek yok. Şu anda, sadece kazanan kimsenin istatistiklerini gösterir. Eğer PlayerA 21-5 kazanırsa, seçim ifadesinden görünecektir, ancak PlayerB 5-21'lik bir skor göstermeyecektir. Herhangi bir yardım takdir edilir. sayfa puanları girmek için

PHP kodu:

if(isset($_POST['btn-post'])) 
{ 
    $opponent = $_POST["opponent"]; 
    //$opponent = array_key_exists('opponent', $_POST) ? $_POST['opponent'] : false; 

    $userscore = mysql_real_escape_string($_POST['userscore']); 
    $oppscore = mysql_real_escape_string($_POST['oppscore']); 

    if($userscore != $oppscore) 
    { 
     if($userscore > $oppscore) 
     { 
      $Winner_ID = $_SESSION['user']; 
      $query = mysql_query("SELECT user_id FROM users WHERE username = '".$opponent."'"); 
      $result = mysql_fetch_array($query) or die(mysql_error()); 
      $Loser_ID = $result['user_id']; 

      $query1 = mysql_query("SELECT Elo FROM users WHERE user_id=".$_SESSION['user']); 
      $result1 = mysql_fetch_array($query1) or die(mysql_error()); 
      $winnerRating = $result1['Elo']; 

      $query2 = mysql_query("SELECT Elo FROM users WHERE user_id=".$Loser_ID); 
      $result2 = mysql_fetch_array($query2) or die(mysql_error()); 
      $loserRating = $result1['Elo']; 

      $rating = new Rating($winnerRating, $loserRating, 1, 0);    
      $results = $rating->getNewRatings(); 

      if(mysql_query("UPDATE users SET Elo = " . $results['a'] . " WHERE user_id=".$_SESSION['user'])) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering winners(user) ranking...');</script> 
       <?php 
      } 
      if(mysql_query("UPDATE users SET Elo = " . $results['b'] . " WHERE user_id=".$Loser_ID)) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering losers(opp) ranking..');</script> 
       <?php 
      } 

     } 
     elseif($oppscore > $userscore) 
     {  
      $Loser_ID = $_SESSION['user']; 
      $query = mysql_query("SELECT user_id FROM users WHERE username = '".$opponent."'"); 
      $result = mysql_fetch_array($query) or die(mysql_error()); 
      $Winner_ID = $result['user_id']; 

      //get rating from user table in database 

      $query1 = mysql_query("SELECT Elo FROM users WHERE user_id=".$_SESSION['user']); 
      $result1 = mysql_fetch_array($query1) or die(mysql_error()); 
      $loserRating = $result1['Elo']; 

      $query2 = mysql_query("SELECT Elo FROM users WHERE user_id=".$Loser_ID); 
      $result2 = mysql_fetch_array($query2) or die(mysql_error()); 
      $winnerRating = $result1['Elo']; 

      $rating = new Rating($winnerRating, $loserRating, 1, 0);    
      $results = $rating->getNewRatings(); 

      $results = $rating->getNewRatings(); 
      if(mysql_query("UPDATE users SET Elo = " . $results['b'] . " WHERE user_id=".$_SESSION['user'])) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering losers(user) ranking...');</script> 
       <?php 
      } 
      if(mysql_query("UPDATE users SET Elo = " . $results['a'] . " WHERE user_id=".$Winner_ID)) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering winners(opp) ranking...');</script> 
       <?php 
      } 

     } 
     if(mysql_query("INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore')")) 
     { 
      ?> 
      <script>alert('Your scores were successfully entered');</script> 
      <?php 
     } 
     else 
     { 
      ?> 
      <script>alert('There was an error while entering your score...');</script> 
      <?php 
     } 
    } 
    else 
    { 
     ?> 
     <script>alert('There cannot be a tie in ping pong, please re-enter your scores...');</script> 
     <?php 
    } 

} 
?> 
+0

Yani asıl sorunun, kaybedenin sadece kazananı gösteren sorgunuzda göstericinin nasıl görünmesi gerektiği? – Sean

+0

Bize şimdi SELECT'inizin ne getirdiğini ve geri dönmesini istediğiniz şeyin bir örneğini gösterebilir misiniz? –

+0

@Sean Tam Olarak. Sadece WinnerID için bilgi görüntüler, inanıyorum, yanılıyorsam beni düzeltin. Benim meselem, bu ve buna karşı olan puanların eklenmemesi. Eşit olurdu. Kazanç ve kayıplarla aynı. –

cevap

1

Sorgulama başarısız çünkü oyuncunun kaybeddiği satırları dikkate almıyor. Bunu unions kullanarak düzeltebilirsiniz. Aşağıdaki sorgu istediğini yapmalıdır: "kaybetme sorguda" alan PointsAgainst ve tersi "için noktaları" sayaç oyuncunun olarak olması gerektiği

SELECT username AS "Username", 
    SUM(wins) AS "Wins", 
    SUM(PF) AS "Points For", 
    SUM(PA) AS "Points Against", 
    elo AS "Ranking" 
FROM (
    (SELECT users.user_ID, 
      users.username AS username, 
      COUNT(games.WinnerID) AS wins, 
      SUM(games.PointsFor) AS PF, 
      SUM(games.PointsAgainst) AS PA, 
      users.Elo AS elo 
    FROM users, games 
    WHERE games.WinnerID = users.user_ID 
    GROUP BY users.user_ID) 
    UNION ALL 
    (SELECT users.user_ID, 
     users.username AS username, 
     0 AS wins, 
     SUM(games.PointsAgainst) AS PF, 
     SUM(games.PointsFor) AS PA, 
     users.Elo AS elo 
    FROM users, games 
    WHERE games.LoserID = users.user_ID 
    GROUP BY users.user_ID) 
) AS t 
GROUP BY username 
ORDER BY user_ID; 

Not.

+0

Çok teşekkür ederim! Hatta kayıp sütununu oraya nasıl yerleştireceğimi bile anladım. Çok takdir! –

0

Sizin

INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore') 

sorgu potansiyel yanlış sırada $userscore ve $oppscore değerleri içerir. Koşullu işleminizde $Winner_ID ve $Loser_ID değişebilir, ancak $userscore ve $oppscore o sırada benzer şekilde ters çevrilmez. Ayrıca, koşullu yapınızın genel olarak gereksiz bir şekilde ayrıntılı olduğu da açıktır. İlk olarak kazanan ve kaybeden kimliğini ve skorunu belirleyebilmeniz ve daha sonra neredeyse aynı kodun hata eğilimli kopyala-çoğaltmasına başvurmak yerine tüm işlemlerinizi yapabilmeniz gerektiği gibi görünüyor. Başkasının göreve sizi önce yerine mysql ait mysqli (ya da daha iyi kullanıyor olmalıdır,

SELECT u.username, COUNT(g.WinnerID), 
     SUM(g.PointsFor), SUM(g.PointsAgainst), u.Elo 
    FROM users u, games g 
    WHERE u.user_id = g.WinnerID 
    GROUP BY u.username, u.Elo; 

Ayrıca:

1

bir iç birleşim olarak deneyin ve username sütun üzerinde MIN() kurtulmak henüz, PDO) ve dinamik SQL yerine hazırlanmış ifadeler kullanıyor olmalısınız.

+0

Bu hala –

+0

üzerindeki SELECT deyimimle aynı çıktıyı alır. Verilerinizi tamamlamadan önce tamamlandığından emin olalım. Tavşan deliğinden çok uzakta. “SELECT SUM (PointsFor), SUM (PointsAgainst)” oyunlarını çalıştırın ve eğer çalışıyorsa, SELECT WinnerId, SUM (PointsFor), SUM (PointsAgainst) oyunlarını BAŞLANGIÇ OYUN GRUBU'NDAN deneyin; –

İlgili konular