Array To String Conversion fout
Code (php)
1
2
3
4
5
2
3
4
5
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;
`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:
Dit is controller menu_categorie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
}
{
$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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
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();
}
{
$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:
Heb werkelijk geen idee waar het fout gaat.
Alvast bedankt
Toevoeging op 15/06/2017 14:05:26:
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.
--
en mogelijk wil je daarbij ook nog htmlspecialchars() gebruiken, om ellende te voorkomen als gebruikers zelf namen kunnen invoeren.
Dus ik heb momenteel het volgende in de Model:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();
}
{
$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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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();
}
?>
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();
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
}
{
$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
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.
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:
Code (php)
1
<a href="/menu/menu_categorie/menus?menu=pekingeend_menu" id="menus">Pekingeend Menu</a>
of iets dergelijks
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.
Gewijzigd op 16/06/2017 13:59:49 door Thomas van den Heuvel
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:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
if ($menu_id)
{
$menu_id = filter_input(INPUT_GET, 'menu_id', FILTER_SANITIZE_NUMBER_INT);
}
else
{
$menu_id = NULL;
}
{
$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:
Gewijzigd op 16/06/2017 22:24:22 door Donald Boers
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:
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
27
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
27
<?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();
}
?>
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.
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
Toevoeging op 16/06/2017 23:10:26:
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'
Gewijzigd op 16/06/2017 23:20:03 door Donald Boers
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).