Ik krijg een Array To String Conversion fout. Dit is de betreffende tabel in de database:

CREATE TABLE `menu_categorieen` (
  `categorie_id` tinyint(4) NOT NULL,
  `categorie` varchar(32) NOT NULL,
  `query_string` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Dit is de url die verwijst naar controller menu_categorie:

<a href="/menu/menu_categorie/soepen" id="soep">Soepen</a>


Dit is controller menu_categorie:

public function menu_categorieAction($params)
{
	$this->pageId    = 2;
	$categorie       = $params['id'];
	$background      = $this->page->get_background($this->pageId);
	$achtergrond	 = $background['achtergrond'];
		
	$categorie_naam  = $this->menu->get_categorie_naam($categorie);
		
	$pagina_vars = array (
		'body_id'      => 'menu_categorie',
		'meta_tags'    => $this->page->get_pagina_content($this->pageId),
		'robots'       => 'noindex, follow',
		'achtergrond'  => $achtergrond	
	);
		
	$this->render('menu_categorie', compact('categorie_naam') + $pagina_vars);
		
}


Dit is Model get_categorie_naam:

public function get_categorie_naam($categorie)
{
	$sql	=	"SELECT `categorie`
		           FROM `menu_categorieen`
				  WHERE `query_string` = ?";
					   
    $stmt = $this->pdo->prepare($sql);
	$stmt->execute(array($categorie));
		
	return $stmt->fetch();
}


En dit is de header waar ik dus de fout op krijg:

<h1><?php echo $categorie_naam; ?></h1>


Heb werkelijk geen idee waar het fout gaat.

Alvast bedankt
Ik zou het misschien iets anders aanpakken dan. Bijvoorbeeld door eerst te controleren of er een id is ingesteld, en anders uitgaan van de categorie-naam. Wat ik niet helemaal begrijp in je huidige controller is wat er precies in $params zit, je gaf voorheen $params['id'] door als categorie/query_string naam? :/

Wat je zou kunnen doen, maar weet niet helemaal of dit de goede plaats is, is in de get_categorie_naam() controleren op $_GET['menu_id'], en als deze bestaat en numeriek is, zou deze voorrang kunnen krijgen op de $categorie die nu wordt doorgegeven. Op die manier hoeft er mogelijk niets aangepast te worden in de controller en blijkt uit de implementatie van get_categorie_naam() ook echt dat dit een uitzonderingssituatie betreft die net een iets andere afhandeling heeft.

Bijvoorbeeld als volgt:
<?php
public function get_menu_items($categorie) { // als voorheen
    $sql = 'SELECT menu_item
    , omschrijving1
    , omschrijving2
    , omschrijving3
    , omschrijving4
    , omschrijving
    , prijs
    FROM menu_items
    WHERE';

    // definieer uitzondering - is er een id ingesteld in de URL?
    if (isset($_GET['menu_id']) && preg_match('#^[1-9][0-9]*$#', $_GET['menu_id']) == 1) {
        $sql .= ' item_id = ?';
        $args = array($_GET['menu_id']);
    } else {
        // default
        $args = array($categorie);
        $sql .= ' query_string = ?';
    }
    $stmt = $this->pdo->prepare($sql);
    $stmt->execute($args);

    return $stmt->fetch();
}
?>

Geen idee of dat werkt maar het idee lijkt mij duidelijk. En anders zul je even naar $params moeten kijken.
Hi Thomas, Ik denk dat ik in mijn eerdere bericht iets te vroeg heb gejuigd. De verschillende menu's werden inderdaad aangeroepen op de manier die ik voorstelde, maar de listings (voorgerechten, hoofdgerechten etc) werken niet meer. Ik ga nu de door jou manier proberen

Om je een beter idee te geven wat er zou moeten gebeuren: Dit is de link van de betreffende pagina

http://www.cantonamsterdam.nl/canton-menu.php

Deze is jaren geleden gemaakt en nog zonder framemwerk etc

[size=xsmall]Toevoeging op 16/06/2017 23:10:26:[/size]

Hi Thomas. Je laatste methode werkt perfect. Alles werk nu zoals ik voor ogen had. Hartelijk bedankt voor je geduld en duidelijke uitleg.

Laatste vraag? Hoe ziet de preg_match er uit als ik voor die 9 menu's ee string gebruik ipv een id b.v. ?menu_naam = 'canton_menu'
Uhm, uit welke karakters kunnen die namen dan bestaan? Hier zou je dan een aparte case voor moeten maken. Maar wellicht is het dan handiger om de naamgeving zo op te zetten zodat er eigenlijk maar één smaak is (oftewel geef URL's één en dezelfde opbouw) anders wordt je code zo'n spaghetti :p.

Eigenlijk zou dat dus de netste oplossing zijn: een uniforme naamgeving, dan hoef je al die uitzonderingsregels ook niet te programmeren. Dit houdt mogelijk in dat je dit probleem eigenlijk ergens anders zou moeten oplossen (dataverrijking in de database).

Reageren