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
wat geeft
<?php
printf('<pre>%s</pre>', print_r( $categorie_naam, 1));

?>


[size=xsmall]Toevoeging op 15/06/2017 14:05:26:[/size]

Daarin zit je hele record.

in dit geval haal je met je query maar 1 kolom op, maar dat weet die functie niet. Stel er stond

SELECT categorie, foo, bar FROM ...

Dan moeten die andere 2 kolommen ook ergens blijven.

Daarom bestaan dus $categorie_naam['categorie'] en $categorie_naam['foo'] etc.
Hi Ivo. Dank je voor de reactie dit is wat ik krijg op de printf


Array
(
    [Categorie] => Soepen
    [0] => Soepen
)
en dus wil je niet $categorie_naam echo-en, maar $categorie_naam['Categorie']

--
en mogelijk wil je daarbij ook nog htmlspecialchars() gebruiken, om ellende te voorkomen als gebruikers zelf namen kunnen invoeren.
Hi Ivo. Dat was inderdaad het probleem. Waar zat ik met mijn hoofd :(. Ik heb nog een aavullende vraag als het mag? Bijna alle categorieen kunnen getoond worden met gebruik van alleen the query_string. Er zijn echter ook een aantal menu's die tevens gebruik maken van het betreffende id:


<a href="/menu/menu_categorie/menus?menu_id=81" id="menus">Canton Menu</a>


Dus ik heb momenteel het volgende in de Model:

	public function get_menu_items($categorie)
	{
		$sql	=	"SELECT menu_item
		                   , omschrijving1
						   , omschrijving2
						   , omschrijving3
						   , omschrijving4
						   , omschrijving
						   , prijs
						FROM menu_items
					   WHERE query_string = ?";
					   
		if ($menu_id)
		{
			$sql.=	" AND item_id = ?";	
		}
		
        $stmt = $this->pdo->prepare($sql);
		$stmt->execute(array($categorie));
		
		return $stmt->fetch();
	}


Mijn vraag is nu moet ik menu_id ook als parameter invoegen en zo ja hoe?

Alvast bedankt
Je zult in eerste instantie de methode moeten uitbreiden met dit optionele argument ($menu_id wordt op dit moment op geen enkele manier doorgegeven?). En vervolgens moet je deze toevoegen aan de lijst van argumenten bij het uitvoeren. Bij de aanroep moet je uiteraard ook het id meegeven indien beschikbaar. Je krijgt dan zoiets:
<?php
public function get_menu_items($categorie, $menu_id=false) { // optioneel $menu_id argument
    $args = array($categorie); // accumulatievariabele voor queryargumenten
    $sql = 'SELECT menu_item
    , omschrijving1
    , omschrijving2
    , omschrijving3
    , omschrijving4
    , omschrijving
    , prijs
    FROM menu_items
    WHERE query_string = ?';

    if ($menu_id !== false) {
        $sql .= ' AND item_id = ?';
        $args[] = $menu_id; // voeg menu_id toe aan argumenten
    }

    $stmt = $this->pdo->prepare($sql);
    $stmt->execute($args);

    return $stmt->fetch();
}
?>
Hoi Thomas! Te gek, hartelijk bedankt. Rest me nog een vraag? Hoe verwerk ik dit in de controller? Dit is wat ik nu heb:

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);
	$menu_items	  = $this->menu->get_menu_items($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', 'menu_items') + $pagina_vars);	
}


Alvast bedankt
Hmm, misschien heb ik de materie niet goed geïnterpreteerd. Heb je alleen een menu-id indien de menu-categorie de (speciale?) waarde "menus" heeft? Dan zou je op grond daarvan een tweedeling kunnen maken: indien menus -> lees id uit, zoniet, gebruik de waarde voor het query_string argument in je query.

Maar dan zou je eens terug kunnen gaan naar de opbouw van je URL, ik bedoel, je gebruikt nu:
/menu/menu_categorie/soepen, en
/menu/menu_categorie/menus?menu_id=81 en misschien nog meer varianten, maar zou het niet veel "logischer" / beter leesbaar zijn als je (respectievelijk) zoiets had:
/menus/soepen, en
/menus/81 ?
Dan zou je gewoon kunnen kijken of iets een numerieke waarde heeft (wat een menu-id impliceert) of tekst bevat (wat een zoekmachinevriendelijke variant van het menu-id, oftewel query_string, zou inhouden).

En misschien moet je ook rekening houden met de situatie waar de query geen resultaten oplevert, tenzij je dat elders op een andere manier (exceptions?) al had afgevangen.
Hoi Thomas. Bedankt voor de reactie. In 90 % van de gevallen is de query_string afdoende in de andere 10% dient het menu_id te worden toegevoegd. Het betreft hier de daadwerkelijke menu's. Bij de eerste 90% gaat het over een categorie (listing van alle soepen, voorgerechten, hoofdgerechten etc) Duw wat ik heel graag wil is dat ook bij de daad werkelijke menu's de query_string ook blijft bestaan:


<a href="/menu/menu_categorie/menus?menu_id=81" id="menus">Canton Menu</a>


Aangezien het nouwelijks gebeurt dat er menu's bijkomen of afvallen zou ik voor deze categorie ook nog wel een veld in de database kunnen toevoegen:

<a href="/menu/menu_categorie/menus?menu=pekingeend_menu" id="menus">Pekingeend Menu</a>


of iets dergelijks
Wat je ook vaak ziet/zag is een combinatie, bijvoorbeeld /<rubriek>/<id>/<titel>, dus bijvoorbeeld /nieuws/10/man-bijt-hond, waarbij dat "man-bijt-hond" niet relevant is, je zou de aanroep kunnen veranderen naar /nieuws/10/maaktnietuit en de website zal nog steeds hetzelfde artikel laden omdat de code van het id gebruik maakt voor identificatie van het artikel.

Ik weet niet hoeveel werk het is, maar je zou die 10% ook kunnen voorzien van een (unieke) dummy-naam, dan heb je deze rare spagaat id <--> query_string uberhaupt niet, een spagaat die je dan in code ook niet hoeft af te vangen. Vraag jezelf gewoon af wat het simpelste is, en ga daarmee aan de slag :p.
Hi Thomas. Jou idee met dat optionele ar argument in de methode sprak/spreekt me erg. Het gaat om in totaal 9 menu's dus dat is te overzien. Ik heb echter geen idee hoe ik de door jou voorgestelde methode in de Controller moet verweken.

Ik zou het enorm op prijs stellen als je me in de juiste richting zou kunnen helpen


Edit: na het nodige gerommel heb ik het op de volgende manier opgelost in de Controller:

if ($menu_id)
{
	$menu_id	 = filter_input(INPUT_GET, 'menu_id', FILTER_SANITIZE_NUMBER_INT);		
}
else
{
	$menu_id     = NULL;	
}

Op deze wijze kan ik menu_id dus toevoegen aan de methode in de Controller:

$menu_items= $this->menu->get_menu_items($categorie, $menu_id);

Reageren