Array To String Conversion fout

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Donald Boers

Donald Boers

15/06/2017 13:36:53
Quote Anchor link
Ik krijg een Array To String Conversion fout. Dit is de betreffende tabel in de database:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


Dit is de url die verwijst naar controller menu_categorie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="/menu/menu_categorie/soepen" id="soep">Soepen</a>


Dit is controller menu_categorie:
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
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}


En dit is de header waar ik dus de fout op krijg:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<h1><?php echo $categorie_naam; ?></h1>


Heb werkelijk geen idee waar het fout gaat.

Alvast bedankt
 
PHP hulp

PHP hulp

25/11/2024 05:11:51
 
Ivo P

Ivo P

15/06/2017 14:02:53
Quote Anchor link
wat geeft
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    printf('<pre>%s</pre>', print_r( $categorie_naam, 1));

?>



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.
 
Donald Boers

Donald Boers

15/06/2017 15:14:42
Quote Anchor link
Hi Ivo. Dank je voor de reactie dit is wat ik krijg op de printf

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
Array
(
    [Categorie] => Soepen
    [0] => Soepen
)
 
Ivo P

Ivo P

15/06/2017 15:46:27
Quote Anchor link
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.
 
Donald Boers

Donald Boers

15/06/2017 18:55:40
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="/menu/menu_categorie/menus?menu_id=81" id="menus">Canton Menu</a>


Dus ik heb momenteel het volgende in de Model:
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
    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
 
Thomas van den Heuvel

Thomas van den Heuvel

16/06/2017 10:57:27
Quote Anchor link
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:
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
<?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();
}

?>
 
Donald Boers

Donald Boers

16/06/2017 11:24:03
Quote Anchor link
Hoi Thomas! Te gek, hartelijk bedankt. Rest me nog een vraag? Hoe verwerk ik dit in de controller? Dit is wat ik nu heb:
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
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
 
Thomas van den Heuvel

Thomas van den Heuvel

16/06/2017 13:18:06
Quote Anchor link
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.
 
Donald Boers

Donald Boers

16/06/2017 13:42:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="/menu/menu_categorie/menus?menu=pekingeend_menu" id="menus">Pekingeend Menu</a>


of iets dergelijks
 
Thomas van den Heuvel

Thomas van den Heuvel

16/06/2017 13:59:01
Quote Anchor link
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.
Gewijzigd op 16/06/2017 13:59:49 door Thomas van den Heuvel
 
Donald Boers

Donald Boers

16/06/2017 21:49:01
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;    
}

Op deze wijze kan ik menu_id dus toevoegen aan de methode in de Controller:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$menu_items= $this->menu->get_menu_items($categorie, $menu_id);
Gewijzigd op 16/06/2017 22:24:22 door Donald Boers
 
Thomas van den Heuvel

Thomas van den Heuvel

16/06/2017 22:44:04
Quote Anchor link
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:
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
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();
}

?>

Geen idee of dat werkt maar het idee lijkt mij duidelijk. En anders zul je even naar $params moeten kijken.
 
Donald Boers

Donald Boers

16/06/2017 22:59:52
Quote Anchor link
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

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
 
Thomas van den Heuvel

Thomas van den Heuvel

17/06/2017 00:12:38
Quote Anchor link
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).
 



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.