mvc data in tabel showen
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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>
<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)
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
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();
}
}
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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";
}
}
?>
include_once("Model/model.php");
class MyController {
function index() {
$object = new MyModel();
$data = $object->select();
require_once "View/view.php";
}
}
?>
view.php
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 ;-) ).
Fetch retourneert een boolean: '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
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?
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
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?
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.