2016-04-11 5 views
5

Więc stworzyliśmy interfejs, który akceptuje wejście z listy rozwijanej .. enter image description hereJak logicznie używać PHP do wyświetlania wszystkich możliwych wartości tabeli bazy danych?

następnie wyświetla dane z trzech różnych tabel bazy danych w tabeli HTML ze wszystkimi wpisami, które są zgodne z kryteriami. enter image description here

Tabela jest pokazana na dole powyższego obrazu.

Moje pytanie brzmi: jak używać PHP, używając pętli lub w inny sposób, aby przerobić mój kod i stworzyć ogromną stronę HTML, która przechodzi przez każde wydarzenie? AKA muszę wygenerować 126 tabele:

enter image description here

Ale nie jestem pewien, w jaki sposób podejść do tego. Moją pierwszą myślą było użyć pętli i po prostu umieścić kod, aby wygenerować w nim jedną tablicę, ale nie wiedziałbym, w jaki sposób zatrzymać warunek, ani nie wiedziałem, jak przełączać się między różnymi opcjami na listach rozwijanych. Nie proszę nikogo, aby utworzył kod dla mnie, ale raczej wskaż mi, w jakiej logice się posługiwać. Po tym, prawdopodobnie będę mógł sam to wymyślić. Dziękuje wszystkim. :)

Poniżej jest mój kod, który używam do generowania każdej tabeli, z adnotacjami w postaci komentarza:

<?php 

error_reporting(E_ALL); 

$dbhost  = "localhost"; //logs into my localhost server 
$dbname  = "sportsDay"; 
$dbuser  = "root"; 
$dbpass  = "..."; 

$year=$_POST['Year']; //gets variables from the drop-downs in the form displayed above 
$gender=$_POST['Gender']; 
$event=$_POST['Event']; 

$result[]=0; 
try 
{ 

    $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $conn->exec("SET CHARACTER SET utf8mb4"); 

    $sql = "SELECT Students.lName, Students.fName, Students.house 
    FROM Entries INNER JOIN Events ON Entries.ev1ID = Events.ID 
    JOIN Students ON Students.stID = Entries.stID 
    WHERE (Entries.ev1ID = :event or Entries.ev2ID = :event2) and (Students.year = :year) 
    AND (Students.gender = :gender) 
    ORDER BY Students.house ASC"; 
    //my SQL code that matches up the values from the drop-downs to the values in the database tables 

    $stmt = $conn->prepare($sql); 

    $stmt->bindValue(':event', $event); 
    $stmt->bindValue(':event2', $event); 
    $stmt->bindValue(':year', $year); 
    $stmt->bindValue(':gender', $gender); 

    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    $count = $stmt->rowCount(); 
} 

catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 
    ?> 
    <html> 
    <body> 
    <?php if ($count > 0): ?> //checks to see if there are results. if there are results, it displays them: 
    <table border="1" > 
     <tr> 
      <th>Name</th> 
      <th>House</th> 
      <th>Score</th> 
     </tr> 
     <?php foreach ($result as $row) { 
      ?> 
     <tr> 
      <td><?php echo $row['fName']. ' '.$row['lName'] ?></td> 
      <td><?php echo $row['house'] ?></td> <td></td> 
     </tr> 
     <?php } ?> 
    </table> 
<?php else: echo "No results." ?> //if not, it displays that there are no results. 
<?php endif ?> 
    </body> 
    </html> 
+0

Więc post był dużo objąć, ale jesteś próbując wygenerować wiele tabel naraz? To właśnie zyskałem czytając dolną część? – Jek

+1

@Jek tak, w zasadzie próbuję wygenerować wiele tabel na raz. Tak mi przykro, że to było niejasne, będę edytować post dla jasności. –

+1

@Jek ma teraz sens? –

Odpowiedz

1

Skoro masz już swój kod, aby wygenerować jeden stół, masz rację, że ciebie może użyć tego do wygenerowania wszystkich z nich.

Wszystko, co musisz zrobić, to przeglądać wszystkie możliwości, jakie oferuje twoja forma.

Musisz mieć listę możliwych opcji, aby zbudować formularz HTML, po prostu użyj tych list opcji w zagnieżdżonej pętli foreach.

foreach ($event as $e) { 
    foreach ($gender as $g) { 
    foreach ($year as $y) { 
     // Use $e, $g and $y for your query and table construction. 
     $sql = ...; // Query stays the same. 

     $stmt->bindValue(':event', $e); 
     $stmt->bindValue(':event2', $e); 
     $stmt->bindValue(':year', $y); 
     $stmt->bindValue(':gender', $g); 
    } 
    } 
} 

Oto pełna przykład zgodnie z kodem, który podałeś:

<?php 

error_reporting(E_ALL); 

$dbhost  = "localhost"; //logs into my localhost server 
$dbname  = "sportsDay"; 
$dbuser  = "root"; 
$dbpass  = "..."; 

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$conn->exec("SET CHARACTER SET utf8mb4"); 

?> 
<html> 
<body> 
<?php 

// Lists of possible DB values 
$event = array("100m", "100m relay", "High Jump", ...); // a list of all events 
$gender = array("F", "M"); // a list of all genders 
$year = array(7, 8, 9, 10, 11, 12); // a list of all classes 

foreach ($event as $e) { 
    foreach ($gender as $g) { 
    foreach ($year as $y) { 

     $result[] = 0; 
     try { 
      $sql = "SELECT Students.lName, Students.fName, Students.house 
      FROM Entries INNER JOIN Events ON Entries.ev1ID = Events.ID 
      JOIN Students ON Students.stID = Entries.stID 
      WHERE (Entries.ev1ID = :event or Entries.ev2ID = :event2) and (Students.year = :year) 
      AND (Students.gender = :gender) 
      ORDER BY Students.house ASC"; 

      $stmt = $conn->prepare($sql); 

      $stmt->bindValue(':event', $e); 
      $stmt->bindValue(':event2', $e); 
      $stmt->bindValue(':year', $y); 
      $stmt->bindValue(':gender', $g); 

      $stmt->execute(); 
      $result = $stmt->fetchAll(); 
      $count = $stmt->rowCount(); 
     } 
     catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 

    if ($count > 0) { 
?> 
    <table border="1" > 
     <tr> 
      <th>Name</th> 
      <th>House</th> 
      <th>Score</th> 
     </tr> 
     <?php foreach ($result as $row) { 
      ?> 
     <tr> 
      <td><?php echo $row['fName']. ' '.$row['lName'] ?></td> 
      <td><?php echo $row['house'] ?></td> <td></td> 
     </tr> 
     <?php } ?> 
    </table> 

<?php 
     } 
     else { 
     echo "No results for $e ($g, $y)."; 
     } 
    } 
    } 
} 
?> 
</body> 
</html> 
+1

Cześć Paul, rozumiem rozumowanie tej metody foreach(). Jednak jestem bardzo zdezorientowany, jak wprowadzić to w akcję formularza: "$ year = $ _ POST ['Year']; $ gender = $ _ POST ['Gender']; $ event = $ _ POST ['Event "];" Muszę zmienić tę część, prawda? –

+0

Nie potrzebujesz już formularza, ponieważ wszystkie możliwości (tabele) zostaną wydrukowane. Możesz użyć zmiennych '$ e $ g i $ y' w zapytaniu do bazy danych. Zobacz zaktualizowaną odpowiedź. – Paul

+1

Umm .. http://pastebin.com/jWyMjJku w ten sposób? Jestem bardzo zdezorientowany, przepraszam ... Wygląda na to, że może mi brakować czegoś poważnego ... –

0

I odtworzono strukturę db. Korzystając z lewego sprzężenia, udało mi się pobrać wszystkie potrzebne dane posortowane według identyfikatora zdarzenia.

Moja baza rekreacji:

Studenci stół

+------+---------+-----------+-------+ 
| stID | fName | lName  | house | 
+------+---------+-----------+-------+ 
| 1 | Nadir | Roman  | east | 
| 2 | Jesus | Lopez  | west | 
| 3 | Ioannis | Chalkadis | west | 
| 4 | Adry | Pepes  | east | 
| 5 | David | Caretas | west | 
+------+---------+-----------+-------+ 

Wydarzenia stół

+----+-----------+---------------+ 
| ID | name  | location  | 
+----+-----------+---------------+ 
| 1 | 100m  | Track   | 
| 2 | 400m  | Track   | 
| 3 | High Jump | High Jump Pit | 
+----+-----------+---------------+ 

wyniki

+------+-------+-------+ 
| stID | ev1ID | ev2ID | 
+------+-------+-------+ 
| 1 |  1 |  2 | 
| 2 |  2 |  3 | 
| 3 |  1 |  3 | 
| 4 |  1 |  2 | 
| 5 |  1 |  3 | 
+------+-------+-------+ 

zapytaniu:

mysql> SELECT Events.ID, Events.name, location, Scores.stID, fName, lName, house FROM Scores LEFT JOIN (Students, Events) ON (Students.stID = Scores.stID AND (Events.ID = Scores.ev1ID OR Events.ID = Scores.ev2ID)) ORDER BY ID; 

a wyjście jest:

+------+-----------+---------------+------+---------+-----------+-------+ 
| ID | name  | location  | stID | fName | lName  | house | 
+------+-----------+---------------+------+---------+-----------+-------+ 
| 1 | 100m  | Track   | 1 | Nadir | Roman  | east | 
| 1 | 100m  | Track   | 5 | David | Caretas | west | 
| 1 | 100m  | Track   | 4 | Adry | Pepes  | east | 
| 1 | 100m  | Track   | 3 | Ioannis | Chalkadis | west | 
| 2 | 400m  | Track   | 2 | Jesus | Lopez  | west | 
| 2 | 400m  | Track   | 1 | Nadir | Roman  | east | 
| 2 | 400m  | Track   | 4 | Adry | Pepes  | east | 
| 3 | High Jump | High Jump Pit | 2 | Jesus | Lopez  | west | 
| 3 | High Jump | High Jump Pit | 5 | David | Caretas | west | 
| 3 | High Jump | High Jump Pit | 3 | Ioannis | Chalkadis | west | 
+------+-----------+---------------+------+---------+-----------+-------+ 

Można podzielić to wyjście do różnych tablic, 1 za imprezy:

$result = $stmt->fetchAll(); 
$mappedEvents = []; 

array_map(function($entry) 
{ 
    if(!isset($mappedEvents[$entry['ID']])) 
    { 
     $mappedEvents[$entry['ID']] = []; 
    } 
    $mappedEvents[$entry['ID'][] = $entry; 
}, $result); 

foreach($mappedEvents as $eventID => $data) 
{ 
     // $eventID = event ID 
     // $data = Array with all info about the event (students, location, etc..) 
} 
+1

witam, proszę pana. Punktacja nie jest tabelą w bazie danych :) jest po prostu zewnętrzną częścią tabeli, ponieważ tworzony przeze mnie system ma na celu tworzenie stron, które można wydrukować tak, aby strony mogły być pisane ręcznie, czyli pusta kolumna stołu ma być pusta, więc można ją wypełnić osobiście. czy mogę prosić o dodatkowe wyjaśnienie Twojej odpowiedzi? Nie rozumiem, jak odpowiada na moje pytanie, ponieważ jestem bardzo niedoświadczony w PHP i jestem pewien, że źle zrozumiałem twoją odpowiedź. dziękuję nadir :) –

+0

Może brakuje mi odpowiedzi na twoje pytanie. Próbujesz zbudować stronę html, która wyświetli tabelę dla każdego wydarzenia, a na każdej tabeli będziesz wyświetlał informacje o uczniach, którzy na niej uczestniczą, czy tak? – Nadir

+0

tak. :) ale potrzebuję osobnej tabeli dla każdego zdarzenia, wydaje się, że twój wynik to jedna tabela? –

Powiązane problemy