Ga naar inhoud

Twee keer inhoud van een tabel verschijnen van een MYSQL database in een php script?


kunoke
 Delen

Aanbevolen berichten

Beste, Al een tijd ben ik bezig met data van een mysql database te verschijnen in php (HTML) dat lukt.

Nu wil ik iets maken dat je een tabel hebt waar data van een database word verschenen en daaronder is nog een tabel en die verschijnt alle inhoud waar in de rij oke iets 0 bevat.

Dus ik wil twee tabellen hebben waar alle bij de data van een database word verschenen.

Maar dat werkt niet.

Een tegelijk wel!

Als ik een verbinding maak met een database en een tabel laat komen met daarin SELECT Item from Krokus werkt het. Wil ik alle items weergeven waar de rij oke 0 bevat doe ik: SELECT Item where oke LIKE 0 .

Dan krijg ik ook alles waar ik om vroeg.

Maar wil ik de 2 tegelijk in de pagina zetten werkt dat niet (HTTP ERROR 500 of soms een witte pagina)

Ik heb alles al geprobeerd, Php opnieuw eindigen en beginnen 2 MYSQL connecties, 1 mysql connectie niks werkt

In het kort de bedoeling is dat de onderstaande codes die inhoud weergeven in een pagina moeten komen!

Ik zal hieronder de code laten zien:

Als ik alle items die ik heb wil zien: (Werkt)

Quote

<!DOCTYPE html>
<html>
<body>

<?php
echo "<table style='border: solid 1px black;'>";
 echo "<tr><th>Item</th><th>Vergeten?</th></tr>";

class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }

    function current() {
        return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
    }

    function beginChildren() { 
        echo "<tr>"; 
    } 

    function endChildren() { 
        echo "</tr>" . "\n";
    } 

$servername = "localhost";
$username = "ff weg";
$password = "ffweg";
$dbname = "claesonl_ben";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT item FROM Krokus"); 
    $stmt->execute();

    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
        echo $v;
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";

?> 


</body>
</html>

Als ik alle items wil zien waar bij oke 0 staat (Werkt)

Quote

<!DOCTYPE html>
<html>
<body>

<?php
echo "<table style='border: solid 1px black;'>";
 echo "<tr><th>Item</th><th>Vergeten?</th></tr>";

class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }

    function current() {
        return "<td style='width: 150px; border: 1px solid black;'>" . parent::current(). "</td>";
    }

    function beginChildren() { 
        echo "<tr>"; 
    } 

    function endChildren() { 
        echo "</tr>" . "\n";
    } 

$servername = "localhost";
$username = "ff weg";
$password = "ffweg";
$dbname = "claesonl_ben";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT item FROM Krokus WHERE Oke LIKE 0"); 
    $stmt->execute();

    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 

    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
        echo $v;
    }
}
catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";

?> 


</body>
</html>

Kan iemand me bij dit helpen?

Alvast bedankt,

Met Vriendelijke Groet,

Kuno Claes

P.S: Sorry al ik het een beetje ingewikkeld uitleg, Ik ben daar niet de beste in

Link naar reactie
Delen op andere sites

Ik denk dat je de foutmelding krijgt omdat de class TableRows al bestaat, en je geen 2 dezelfde class namen mag hebben in PHP.

 

Ik heb even iets gemaakt wat je zou kunnen gebruiken. 

 

Dit is nog steeds jouw TableRows class, en ik heb er ook een ORM class aan toegevoegd. Vervolgens als je ergens een tabel wilt plaatsen hoef je alleen nog maar het volgende toe te voegen.

 

<?php
echo new TableRows(new RecursiveArrayIterator($orm->get("SELECT item FROM Krokus WHERE Oke = :status", array('status' => 0))));
?>

 

Zoals je kunt zien kun je (maar dat hoeft niet) de parameters waarop je wilt zoeken ook aangeven met een dubbele punt (:status). Vervolgens moet je die parameters ook opgeven met een array. Dit is o.a. een stuk veiliger wanneer de inhoud van de zoekopdracht (Oke = 0) ook door de gebruiker van de pagina aangepast kan worden.

 

De titels van de tabel zijn ook de titels van de kolommen. Maar wil je een titel anders, dan kun je de SQL query aanpassen naar bijv. (let op dat bij een vraagtegen in de titel, er quotes omheen moeten

SELECT item AS Onderwerp, Oke AS "Klaar?" FROM Krokus WHERE Oke = 0

 

Dit is het scriptje wat je zou kunnen gebruiken. Ik heb dit getest, en het werkt naar behoren.

 

<?php

$servername = "localhost";
$username = "ff weg";
$password = "ffweg";
$dbname = "claesonl_ben";

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

class TableRows extends RecursiveIteratorIterator { 

    private $first = true;

    function __construct($it) { 
        $data = $it->getArrayCopy();
        array_unshift($data, array_keys(current($data)));
        parent::__construct(new RecursiveArrayIterator($data), self::LEAVES_ONLY); 
    }

    function beginIteration() {
        $this->first = true;
        echo "<table style='border: solid 1px black;'>";
    }

    function endIteration() {
        echo "</table>";
        
    }

    function current() {
        $tableRowType = $this->first ? "th" : "td";
        return "<$tableRowType style='width: 150px; border: 1px solid black;'>" . parent::current(). "</$tableRowType>";
    }

    function beginChildren() { 
        echo "<tr>"; 
    } 

    function endChildren() { 
        echo "</tr>" . "\n";
        $this->first = false;
    } 

    function __toString() {
        ob_start();
        foreach($this as $k => $v){
            echo $v;
        }
        return ob_get_clean();
    }
} 

class ORM 
{

    private $connection;

    function __construct(PDO $connection)
    {
        $this->connection = $connection;
    }

    public function get($query, array $params = [])
    {
        try{
            $stmt = $this->connection->prepare($query);
            $stmt->execute($params);
            $stmt->setFetchMode(PDO::FETCH_ASSOC);
            return $stmt->fetchAll();
        }catch(PDOException $e){
            die("PDO Error: ". $e->getMessage());
        }
        
    }

}

$orm = new ORM($conn);

?>

<!DOCTYPE html>
<html>
<body>

<h2>Alles</h2>

<?php
echo new TableRows(new RecursiveArrayIterator($orm->get('SELECT item FROM Krokus')));
?> 

<h2>Oke === 0</h2>

<?php
echo new TableRows(new RecursiveArrayIterator($orm->get("SELECT item FROM Krokus WHERE Oke = 0")));
?>

</body>
</html>

 

PS:

Als je dit bestand ergens in een ander bestand gaat includen of requiren, dan moet je alle PHP code vóór de regel:  <!DOCTYPE html> in een apart bestand zetten (bijv. database.php) en in de pagina's waar je het wilt gebruiken het volgende typen.

<?php
require_once "database.php"
?>

Als je require_once gebruikt i.p.v. require of include, dan zal dat bestand maar 1x worden ingeladen en krijg je geen error 500 omdat de classen TableRows en ORM al bestaan.

aangepast door leroy
Link naar reactie
Delen op andere sites

Dank u wel, Zelf had ik al door dat er iets door elkaar liep omdat dezelfde naam zou hebben maar wist ik niet wat en dat was lastig. En ook bedankt om het zo uitgebreid uit te leggen want nu weet ik ook precies wat er fout liep. Veder heb ik een paar stappen verder nog een irritant probleem wat ik niet kan vinden:

Neem daar alstublieft ook heel even een kijken op

Verder bedankt,

Met vriendelijke groet, Kuno Claes

Link naar reactie
Delen op andere sites

 Delen

×
×
  • Nieuwe aanmaken...