mvc data in tabel showen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Jansen

Robert Jansen

05/10/2017 15:06:39
Quote Anchor link
Hallo,

Ik heb een script waarmee je data uit een database selecteert. De bedoeling is dat de data in een table getoond wordt. De kolommen zijn voornaam en achternaam.

Op dit moment wordt alleen het cijfer 1 getoond in de browser i.p.v. voornamen en achternamen.
Ik denk dat ik ergens een while loop moet zetten? en waar? of toch iets anders?

Ik maak geen gebruik van een framework.

Mijn vraag is: hoe kan ik de data uit de database tonen in de table?

alvast bedankt.

index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
</head>

<body>
<?php
include_once("Controller/controller.php");
 $Controller = new MyController();
 $Controller->index();
?>

</body>
</html>


model.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

class MyModel{

private $conn;
    
 public function __construct()
 {

     $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "dbtuts";
  $this->conn = new mysqli($servername, $username, $password, $dbname);
  // Check connection
  if ($this->conn->connect_error) {
    die("Connection failed: " . $this->conn->connect_error);
    }
 }


public function select(){
    $stmt = $this->conn->prepare("SELECT * FROM users");
    $stmt->execute();
    return $stmt->fetch();
    }
}

?>


controller.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include_once("Model/model.php");

class MyController {

    function
index() {
        $object = new MyModel();
        $data = $object->select();
        require_once "View/view.php";
    }

}


?>


view.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
</head>

<body>
<table border="1">
<tr>
    <td><?php echo $data ?></td>
    <td><?php echo $data ?></td>
</tr>
</table>
</body>
</html>
 
PHP hulp

PHP hulp

23/11/2024 02:12:44
 
Rob Doemaarwat

Rob Doemaarwat

05/10/2017 16:08:36
Quote Anchor link
Fetch retourneert een boolean: http://php.net/manual/en/mysqli-stmt.fetch.php
'1' wil dus zeggen dat alles OK is (maar het is uiteraard niet de data die je nodig hebt ;-) ).
Gewijzigd op 05/10/2017 16:08:49 door Rob Doemaarwat
 
Robert Jansen

Robert Jansen

05/10/2017 16:43:32
Quote Anchor link
ok, bedankt voor de info
krijg nu de melding: Catchable fatal error: Object of class mysqli_stmt could not be converted to string in C:\xampp\htdocs\php\oop\mvc\select\View\view.php on line 15

en line 15 is: echo $data;
hoe kan ik dit oplossen?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/10/2017 16:47:22
Quote Anchor link
Heb je ook een specifieke reden waarom dit in MVC zou moeten, en waarom gebruik je prepared statements binnen mysqli? Dit laatste is onwijs "clunky".

EDIT: $data is/bevat (nu waarschijnlijk) een object van het type mysqli_statement, deze kun je niet (zomaar) als een stuk tekst op je scherm tonen.
Gewijzigd op 05/10/2017 16:48:54 door Thomas van den Heuvel
 
Robert Jansen

Robert Jansen

05/10/2017 17:08:28
Quote Anchor link
maar waarom laat de browser dan eerst 1 zien en dan nu: Catchable fatal error: Object of class mysqli_stmt could not be converted to string?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/10/2017 18:23:06
Quote Anchor link
Geen idee? Mogelijk heb je ondertussen iets veranderd in code?

Het nadeel van prepared statements in mysqli is dat het een vreselijk omslachtige manier is die je voor select-statements weinig winst geeft. Niet in performance en ook niet in programmeer- of leesgemak. In plaats van resultaten direct te kunnen gebruiken zet je ze klaar voor gebruik. Daarnaast zul je vantevoren moeten definiëren hoe dit resultaat er uitziet:
Quote:
Note that all columns must be bound by the application before calling mysqli_stmt_fetch().

Een SELECT * op je users tabel is dan ook niet echt een handige constructie. Stel dat deze nu uit twee kolommen "id" en "naam" bestaan en je deze kolommen al (vantevoren) gebind hebt. En vervolgens breid je je tabel uit met een kolom "email". Waarschijnlijk breekt je code dan omdat het aantal kolommen (3 stuks) niet meer matcht met de kolommen die je vantevoren hebt gebind (id, naam). Een SELECT * probeert dan 3 kolommen in 2 placeholders te proppen en dat past niet.

Daarnaast kleeft er nog een ander nadeel aan prepared statements, dit zijn standaard zogenaamde ongebufferde result sets. Los van allerlei technische implicaties waar je mogelijk nog niet bekend mee bent zijn prepared statements (zeker in MySQLi) nou niet echt intuïtief om mee te starten.

Ik denk dat het voor deze oefening gewoon een stuk makkelijker is om gewoon een query uit te voeren en vervolgens het resultaat uit te lezen. Je zou in je model ook alles in één keer kunnen uitlezen en dit vervolgens via een eenvoudig loopje in je view kunnen weergeven.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.