Smarty met PDO
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function getAllNieuws($limit) {
$query = "
SELECT
n.nieuws_id, n.kop, n.subkop
FROM
nieuws n
ORDER BY
n.datum DESC
LIMIT
:limit
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
$array = $stmt->fetchAll();
return $array;
}
?>
function getAllNieuws($limit) {
$query = "
SELECT
n.nieuws_id, n.kop, n.subkop
FROM
nieuws n
ORDER BY
n.datum DESC
LIMIT
:limit
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
$array = $stmt->fetchAll();
return $array;
}
?>
Hier de index.php:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
require_once("lib/includes/header.inc.php");
$nieuwsberichten = $nieuws->getAllNieuws(10);
foreach($nieuwsberichten as $row) {
$row[] = $nieuwsberichten;
}
$smarty->assign('nieuws', $row);
$smarty->display('main.tpl');
?>
require_once("lib/includes/header.inc.php");
$nieuwsberichten = $nieuws->getAllNieuws(10);
foreach($nieuwsberichten as $row) {
$row[] = $nieuwsberichten;
}
$smarty->assign('nieuws', $row);
$smarty->display('main.tpl');
?>
En hier nieuws.tpl:
{section name=nieuws loop=$nieuws}
<h2>{$nieuws.kop}</h2>
<h3>{$nieuws.subkop}</h3>
<p>{$nieuws.datumNL}</p>
<p>{$nieuws.bericht}</p>
{/section}
Er staan 3 nieuwsberichten in de DB, maar met bovenstaande code wordt echter 13x 1 nieuwsbericht laten zien.
Ik weet niet goed hoe ik de juiste koppeling moet maken want volgens mij heb ik op dit moment een array in een array ($row[] en return $array in de functie) das btje dubbelop geloof ik. (N.B. In de header.inc.php wordt overigens de database connectie gemaakt en wordt smarty aangeroepen.)
Iemand een idee?
B.v.d.
Gewijzigd op 01/01/1970 01:00:00 door Marco
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function getAllNieuws($limit) {
$query = "
SELECT
n.nieuws_id, n.kop, n.subkop
FROM
nieuws n
ORDER BY
n.datum DESC
LIMIT
:limit
";
$newsitem = array();
$stmt = $this->db->prepare($query);
// $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); Binding geeft nog unexpected behaviour, slechte PDO implementatie
$stmt->execute(array(':limit' => (int) $limit));
while($row= $stmt->fetch(PDO::FETCH_ASSOC))
$newsitems[] = $row;
return $newsitem;
}
?>
function getAllNieuws($limit) {
$query = "
SELECT
n.nieuws_id, n.kop, n.subkop
FROM
nieuws n
ORDER BY
n.datum DESC
LIMIT
:limit
";
$newsitem = array();
$stmt = $this->db->prepare($query);
// $stmt->bindParam(':limit', $limit, PDO::PARAM_INT); Binding geeft nog unexpected behaviour, slechte PDO implementatie
$stmt->execute(array(':limit' => (int) $limit));
while($row= $stmt->fetch(PDO::FETCH_ASSOC))
$newsitems[] = $row;
return $newsitem;
}
?>
Deze loop klopt niet. Je leest de array $nieuwsberichten uit waarbij je elke entry in $row krijgt. Vervolgens ken je de gehele array $nieuwsberichten als nieuwe entry aan de array $row toe?
Overigens snap ik het nut van die hele foreach loop niet. De fetchAll() method geeft immers al een array met alle records terug. Die kunt je toch gewoon gebruiken in je template? Dus:
Tenslotte laad je de template main.tpl terwijl de benodigde code in nieuws.tpl staat? Of include je nieuws.tpl weer in main.tpl?
ps. @Ed: de functie zoals jij hem voorstelt resulteert in precies hetzelfde als de oorspronkelijke functie.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Begrijp ik dan goed dat onderstaande al voldoende zou moeten zijn? Zo ja, dan krijg ik daarmee een lege array terug. (de functie heb ik gelaten zoals ie was).
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
require_once("lib/includes/header.inc.php");
$smarty->assign('nieuws', $nieuws->getAllNieuws(10));
$smarty->display('main.tpl');
?>
require_once("lib/includes/header.inc.php");
$smarty->assign('nieuws', $nieuws->getAllNieuws(10));
$smarty->display('main.tpl');
?>
nieuws.tpl wordt inderdaad geinclude in main.tpl
aanroept?
Weet je zeker dat je query lukt? PDO geeft volgens mij standaard PHP warnings, en die kan je gemakkelijk uitzetten. Probeer eens bij de code waar je een nieuwe PDO instantie in $this->db stopt deze extra regel:
Op die manier zijn de queries die mislukken makkelijk te zien (en makkelijk af te vangen met een try-catch constructie)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
require_once("lib/includes/header.inc.php");
//var_dump($nieuws->getAllNieuws(10));
$smarty->assign('nieuws', $nieuws->getAllNieuws(10));
$smarty->display('main.tpl');
?>
require_once("lib/includes/header.inc.php");
//var_dump($nieuws->getAllNieuws(10));
$smarty->assign('nieuws', $nieuws->getAllNieuws(10));
$smarty->display('main.tpl');
?>
Is er dan misschien iets mis met onderstaande? Mijn Smarty kennis is namelijk niet hoog :)
{section name=nieuws loop=$nieuws}
<h2>{$nieuws.kop}</h2>
<h3>{$nieuws.subkop}</h3>
<div>{$nieuws.datumNL}</div>
<p>{$nieuws.bericht}</p>
{/section}
Code (php)
1
2
3
4
5
6
2
3
4
5
6
{foreach from=$nieuws item=nieuws}
<h2>{$nieuws.kop}</h2>
<h3>{$nieuws.subkop}</h3>
<div>{$nieuws.datumNL}</div>
<p>{$nieuws.bericht}</p>
{/foreach}
<h2>{$nieuws.kop}</h2>
<h3>{$nieuws.subkop}</h3>
<div>{$nieuws.datumNL}</div>
<p>{$nieuws.bericht}</p>
{/foreach}
Dat werkt dan weer wel ;-)
Je kunt ook gewoon de array meteen doorsturen dus:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$nieuws = $class->getnieuwsberichten(10);
$smarty->assign('nieuws', $nieuws);
?>
$nieuws = $class->getnieuwsberichten(10);
$smarty->assign('nieuws', $nieuws);
?>
{foreach from=$nieuws key=key item=nieuwsitem}
// doe hier iets met de berichten en $nieuwsitem.veldnaam
{foreachelse}
<p>Geen nieuwsberichten gevonden.</p>
{/foreach}
Edit: Han was me voor, maar ik zou zelf geen query doen om de data te manipuleren. (zoals in de query). Ik zou gaan voor rauwe output. Zo kun je in bijv een meertalig systeem een andere template laden zonder dat de query aangepast moet worden.
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Bedankt