2016-04-19 11 views
1

Ich codiere ein ähnliches Spiel zu Karten gegen die Menschheit und ich bin ein bisschen stecken auf die Ergebnisse mit PHP zusammen, ich bin neu in PHP so haben einen Stolperstein treffen.Gleichheit vergleichen und zählen, wie oft die gleiche Zeichenfolge in einer zurückgegebenen Sql-Abfrage

Also ich habe alle meine Spieldaten in einer SQL-Tabelle auf meinem localhost und es sieht aus wie diese etwa: Dies sind die Spaltenüberschriften und Eingang, wie es in der Tabelle ist:

+------------+-----------------+------------+-----------------+ 
| FirebaseID |  Votes  | GameNumber | Submission | 
+------------+-----------------+------------+-----------------+ 
|  id1 | Option number 6 | Game 9 | Option number 6 | 
|  id2 | Option number 6 | Game 9 | Option number 1 | 
|  id3 | Option number 6 | Game 9 | Option number 6 | 
|  id4 | Option number 1 | Game 9 | Option number 1 | 
|  id5 | Option number 6 | Game 9 | Option number 4 | 
+------------+-----------------+------------+-----------------+ 

Wo Stimmen ist die Antwort, die sie wählen, um die beste zu sein und Submission ist ihre eigene Unterordnung zum Kartenspiel. Ich weiß, dass die Werte im Moment nicht viel bedeuten, aber sobald ich das Ding funktioniere, gebe ich verschiedene Werte für jede Karte ein.

Mein Code ist dies:

$conn = new mysqli($servername, $username, $password, $db); 

// Check connection 
if ($conn->connect_error) { 
    die("Database connection failed: " . $conn->connect_error); 
} 

$q = $_GET['q']; 

$sql="SELECT Votes, FirebaseID FROM cauusers WHERE GameNumber = '".$q."'"; 

$result = mysqli_query($conn,$sql); 

$length = $result->num_rows; 

if ($result->num_rows > 0) { 
// output data of each row 
    $myResArray = []; 
    $count = 0; 

    while($row = $result->fetch_assoc()) { 
     $myResArray[$count] = $row["Votes"]; 
     $count++; 
    } 

    //var_dump($myResArray); 
    $max = 0; 
    $winner = ""; 
    $index = 1; 
    //$length = count($myResArray) (This prints 5); 

    for($i = 0; $i < $length;$i++){ 
     for($j = 0; $j < $length; $j++){ 
      if($myResArray[$i]===$myResArray[$j]){ 
       $max += 1; 
       $winner = $myResArray[$i]; 

      } 
     } 
    } 
    echo $winner . "<br>"; 

    $sqlSel="SELECT FirebaseID FROM cauusers 
      WHERE GameNumber = '".$q."' AND Submission = '".$winner."'"; 

    $Submission = mysqli_query($conn,$sql); 
    echo var_dump($Submission); 

    if ($Submission->num_rows > 0) { 
     while($row = $Submission->fetch_assoc()) { 
      echo $row["FirebaseID"] . "<br>"; 
     } 
    } 
} else { 
    echo "0 results"; 
} 
mysqli_close($conn); 
?> 

Wenn ich q $ drucken ich:

Spiel 9

Als ich var_dump$ myResArray ich;

array(5) { 
    [0] => string(15) "Option number 6" 
    [1] => string(15) "Option number 6" 
    [2] => string(15) "Option number 6" 
    [3] => string(15) "Option number 1" 
    [4] => string(15) "Option number 6" 
} 

So versuche ich, für später, welche Karte gewählt wurde für die meisten und dann basierend auf, dass herauszufinden, was die Person (oder Personen), die geltend gemacht, dass Karten-IDs ist, so kann ich vergeben dann die Gewinner mit Münzen zu sammeln Verwenden Sie im Spiel. Ich kann sehen, dass ich die Daten, die ich brauche, abrufen kann, aber nicht auf jede einzelne Zeichenfolge zugreifen kann, um sie miteinander zu vergleichen. Im Moment, wenn es zwei Antworten gibt, die für dieselbe Anzahl von Malen abgestimmt wurden, wird nur eine Antwort zurückgegeben.

Es druckt die richtige Antwort zu gewinnen, aber er druckt alle 5 Firebase-IDs anstelle des

Jede Hilfe wäre massiv geschätzt.

Prost

Antwort

0

Statt diese Logik in PHP Kodierung, Sie am meisten in SQL tun könnte. Die folgende Abfrage wird bestimmen, was die meisten gestimmt ist, und die Aufzeichnungen zurück, die diese Abstimmung entsprechen:

SELECT * 
FROM cauusers 
WHERE Votes = (
    SELECT Votes 
    FROM  cauusers 
    WHERE GameNumber = 'Game 9' 
    GROUP BY Votes 
    ORDER BY COUNT(*) DESC 
    LIMIT 1); 

Siehe SQL Fiddle.

integrieren, die in Ihrem PHP, und Sie werden etwas wie diese erhalten (nicht getestet):

$sql = "SELECT * 
     FROM cauusers 
     WHERE Votes = (
      SELECT Votes 
      FROM  cauusers 
      WHERE GameNumber = GameNumber = '$q' 
      GROUP BY Votes 
      ORDER BY COUNT(*) DESC 
      LIMIT 1)"; 
$result = mysqli_query($conn, $sql); 
if ($result->num_rows > 0) { 
    // output winners 
    $winner = ""; 
    while($row = $result->fetch_assoc()) { 
     if ($winner=="") { 
      $winner = $row['Votes']; 
      echo "winner: $winner<br>"; 
     } 
     echo $row["FirebaseID"] . "<br>"; 
    } 
} else { 
    echo "0 results"; 
} 

Eine Sache, die Sie noch verbessern sollten: Es ist besser, nicht $ q in der SQL zu injizieren String, sicherlich nicht, wenn es ein Wert ist, der vom Benutzer bereitgestellt wird. Dann sind Sie anfällig für SQL injection. Besser ist es, prepared statements und parameters zu verwenden.

+0

Das ist toll, danke für die Hilfe trincot. Sehr geschätzt!! –

+0

Gern geschehen. Ich würde mich freuen, wenn Sie die Antwort als akzeptiert markieren würden (das graue Häkchen links davon). – trincot

+0

Fertig, danke nochmal! –

Verwandte Themen