2017-10-24 1 views
-1

Ich habe ein Problem, einen Weg zu finden, das MySQL-Ergebnis in ein Array zurückzugeben, das die Daten aus der Anweisung für jede Zeile und Spalte enthält.Wie drucke ich mehrere Zeilen mit mehreren Spalten in einer Vorlage?

controller.class.php:

class Controller { 

    private $template; 
    private $view; 
    private $data; 

    public function __construct() { 
    $this->view = new View(); 
    $this->data = new Model(); 
    } 

    public function display() { 
     $this->view->setTemplate(); 
     $this->view->setContent("title", "Songs"); 
     $this->view->setContent("content", $this->data->getAllDataFromSongs()); 
     $this->view->setContent("footer", "&copy My name is Jeff\n"); 

     return $this->view->parseTemplate(); 
    } 

} 

model.class.php:

class Model { 
    public $db_connection = null; 

    public function __construct() { 
    $this->openDatabaseConnection(); 
    } 

    private function openDatabaseConnection() {  
    $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 

    if ($this->db_connection->connect_error) { 
     die('Connect Error (' . $this->db_connection->connect_errno . ') ' 
     . $this->db_connection->connect_error); 
    } 
    } 

    public function getAllDataFromSongs() { 
    $query = "SELECT * FROM songs"; 
    $row_content = array(); 

    if ($result = $this->db_connection->query($query)){ 

     while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
      array_push($row_content, $row['id']); 
      array_push($row_content, $row['artist']); 
      array_push($row_content, $row['song']); 
      array_push($row_content, $row['year']); 
     } 

     $result->free(); 

     return $row_content; 
    } 
    else 
     echo 'No results'; 
    } 

} 

view.class.php:

class View { 

    private $path   = 'templates'; 
    private $template; 
    private $content = array(); 

    public function setContent($key, $value){ 
    $this->content[$key] = $value; 
    } 

    public function setTemplate($template = 'default') { 
    $this->template = $this->path . DIRECTORY_SEPARATOR . $template . '.tpl.php'; 
    } 

    public function parseTemplate() { 
    if (file_exists($this->template)) { 

      ob_start(); 
      require_once('templates/header.tpl.php'); 
      include_once $this->template; 
      require_once('templates/footer.tpl.php'); 
      $output = ob_get_contents(); 
      ob_end_clean(); 

     return $output; 
    } 
    else{ 
     return "Can't find ".$this->template." Template"; 
    } 
    } 
} 

default.tpl.php:

<table> 
    <tr> 
    <th>ID</th> 
    <th>artist</th> 
    <th>song</th> 
    <th>year</th> 
    </tr> 
    <tr> 
    <?php 
    foreach ($this->content['content'] as $con){ 
     echo '<td>'. $con . '</td>'; 
    } 
    ?> 
    </tr> 
</table> 

<br> 
<?php echo $this->content['footer']; ?> 

Es ist nicht der gesamte Code, aber es sollte Ihnen zeigen, was ich versuche. Das Problem, das ich jetzt habe, ist, dass das Ergebnis von getAllDataFromSongs() ein Array mit allen Daten hintereinander ist. Ich kann sie nicht in einer Tabelle trennen.

Dies ist die Ausgabe:

Array ( 
    [0] => 1 [1] => Artist 1 [2] => Song 1 [3] => Year 1 
    [4] => 2 [5] => Artist 2 [6] => Song 2 [7] => Year 2 
    [8] => 3 [9] => Artist 3 [10] => Song 3 [11] => Year 3 
    [12] => 4 [13] => Artist 4 [14] => Song 4 [15] => Year 4 
    [16] => 5 [17] => Artist 5[18] => Song 5 [19] => Year 5 
) 

ID artist song year 
1 Artist 1Song 1Year 12Artist 2Song 2Year 2 3Artist 3Song 3Year 3... 

ich Ihnen erzählen kann hoffen, was ich versuche zu erklären ..

Antwort

0
while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
     array_push($row_content, $row['id']); 
     array_push($row_content, $row['artist']); 
     array_push($row_content, $row['song']); 
     array_push($row_content, $row['year']); 
    } 

hier Ihr Problem ist, dass Sie ein neues Array-Element schaffen für jede Spalte, so am Ende werden Sie sie alle nacheinander haben, eins das gleiche Niveau.

Entweder erstellen Sie eine temporäre Array zuerst, und dann, dass zuweisen (so dass Sie Reihen von Spalten erhalten),

while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
     $temp = []; 
     array_push($temp, $row['id']); 
     array_push($temp, $row['artist']); 
     array_push($temp, $row['song']); 
     array_push($temp, $row['year']); 

     array_push($row_content, $temp); 
    } 

Oder weisen Sie einfach die vollständige Reihe Array direkt:

while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 
     array_push($row_content, $row); 
     // $row_content[] = $row; // same thing 
    } 

Wenn Sie erhalten zusätzliche Spalten aus Ihrer SELECT-Anweisung, die Sie hier nicht haben möchten. Dann sollten Sie die Spalten direkt in der SELECT-Anweisung benennen, anstatt * auszuwählen.

Zusätzlich existiert auch mysqli_result::fetch_all. Diese Funktion setzt alle Zeilen in der Ergebnismenge in einem Array auf einmal - so können Sie die while Schleife vollständig beseitigen.

+0

Ich habe die erste Lösung versucht und ich bekomme jetzt ein Array mit Arrays für jede Zeile innerhalb ... Wie kann ich die Tabelle in meiner default.tpl.php Datei holen? – Alex

+1

@Alex eine verschachtelte foreach zu einer Vorlage hinzufügen? –

Verwandte Themen