Smarty met PDO

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco

Marco

18/06/2009 13:15:00
Quote Anchor link
Ik zit te worstelen met smarty en de output van de volgende functie.
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
<?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;
}

?>

Hier de index.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>


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
 
PHP hulp

PHP hulp

22/12/2024 12:19:17
 
Ed

Ed

18/06/2009 22:11:00
Quote Anchor link
Beetje memory misbruik zo, beter oplossing is om je function(? dit is is het OOP gedeelte van het form). Gelijk de goede output te laten retourneren. Is gebruikelijk. Dus als volgt:

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
<?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;
}

?>
 
Joren de Wit

Joren de Wit

18/06/2009 23:19:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($nieuwsberichten as $row) {
    $row[] = $nieuwsberichten;
}

?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$smarty
->assign('nieuws', $nieuws->getAllNieuws(10));
?>


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
 
Marco

Marco

22/06/2009 13:43:00
Quote Anchor link
Ja het gebruik van een foreach loop was zoals ik aangaf al overbodig.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
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
 
Jelmer -

Jelmer -

22/06/2009 18:56:00
Quote Anchor link
Wat krijg je te zien wanneer je
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump($nieuw->getAllNieuws(10));
?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

Op die manier zijn de queries die mislukken makkelijk te zien (en makkelijk af te vangen met een try-catch constructie)
 
Marco

Marco

23/06/2009 09:32:00
Quote Anchor link
Na het uitvoeren van var_dump krijg ik gewoon de juiste volle array te zien net als bij het uitvoeren van print_r. De query is dus goed (krijg ook geen melding na je PDO toevoeging) alleen wordt het nog niet meegenomen in de opmaak.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>


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}
 
Jelmer -

Jelmer -

23/06/2009 09:40:00
Quote Anchor link
De mijne ook niet :)

Als je de documentatie erbij pakt, lijkt het erop dat je zoiets als syntax moet hanteren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
{section name=nieuws loop=$nieuws}

<h2>{$nieuws[nieuws].kop}</h2>
<h3>{$nieuws[nieuws].subkop}</h3>
<div>{$nieuws[nieuws].datumNL}</div>
<p>{$nieuws[nieuws].bericht}</p>

{/section}
 
Han eev

Han eev

23/06/2009 09:50:00
Quote Anchor link
Je kan ook
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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}


Dat werkt dan weer wel ;-)
 
Jurgen assaasas

Jurgen assaasas

23/06/2009 09:51:00
Quote Anchor link
{section} is een soort loop.

Je kunt ook gewoon de array meteen doorsturen dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

$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
 
Marco

Marco

23/06/2009 10:01:00
Quote Anchor link
Aah thx mannen, foreach was nodig voor de output. Hartelijk dank. Ik zal mij even wat beter in Smarty gaan verdiepen.

Bedankt
 



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.