kookboek mysql php vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb al een ander topic geopend in http://gathering.tweakers.net/forum/list_messages/1174246

daar heb ik een query gemaakt en die geeft resultaten terug.

Nu kom ik er echter niet uit wat ik in php met deze data zou moeten zodat ik het goed weergegeven krijg. Wat er nu gebeurt is dat hij als er bijvoorbeeld 5 ingredienten gebruikt worden hij per ingredient de rest van de gevonden waardes ook weer opnieuw laat zien, hoe los ik dit in php op?

ik heb al behoorlijk lopen zoeken hoe dit zou moeten, maar het probleem is dat ik niet een goede naam weet hoe dit soort opdrachten heet in php zodat ik dus ook geen relevante waardes kan vinden.

het gaat om deze querie
SELECT kookboek.*, categorie.*, land.*, ingredienten.*, ingredienten_koppel.* FROM kookboek INNER JOIN categorie ON kookboek.categorie_id = categorie.id INNER JOIN land ON kookboek.land_id = land.id INNER JOIN ingredienten_koppel ON ingredienten_koppel.id = kookboek.id INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id

tabel indeling die ik gebruik:

Afbeeldingslocatie: http://rac-on.nl/public/pictures/kookboek.jpg

als ik dan dus in php de waardes op wil halen krijg ik bijvoorbeeld het volgende:

1
Wraps
Tapas
Meditteraans
1
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.

1
Wraps
Tapas
Meditteraans
2
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.

1
Wraps
Tapas
Meditteraans
3
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.

wat ik dus wil is dat hij inplaats van bovenstaande het volgende gaat weergeven

1
Wraps
Tapas
Mediteraans
- 1
- 2
- 3
- 4
- 5
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.

hoe krijg ik dat voor elkaar? of waarop zou ik moeten zoeken bij google om hier voorbeelden over te vinden alvast heel erg bedankt

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik snap je probleem niet helemaal? Wat komt er nou niet goed uit en wat wil je eruit hebben?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hij laat nu als er bijvoorbeeld 5 ingredienten zijn onderstaande stuk 5x zien en dan verandert er alleen die waarde waar hieronder nu commentaar achter staat



1
Wraps
Tapas
Meditteraans
1 < dit nummer verandert dan maar de rest post hij opnieuw
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.



wat ik dus wil is dat hij bij dat nummer wat dan steeds verandert dat hij alle gevonden waardes daar tegelijk neer zet zonder ook de rest te herhalen dus zoals het voorbeeld hieronder:



1
Wraps
Tapas
Mediteraans
- 1
- 2
- 3
- 4
- 5
Smeer de wrap helemaal in met roomkaas. Leg er lenteui, paprika en ham op. Rol de wrap op en snijd in stukjes.



ik hoop dat het zo duidelijk is zo niet zal ik proberen het nog duidelijker uit te leggen

ik post hieronder wat het resultaat is van de querie:

Afbeeldingslocatie: http://www.miss-dynastie.nl/kookboek1.jpg

[ Voor 13% gewijzigd door Verwijderd op 05-11-2006 22:59 ]


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 20-09 21:30

Pyrus

Hardknock life

Die rode streep in je plaatje betekende dat je die kolom er uit moest gooien en in je koppeltabel gebruik moet maken van het id uit de kookboek tabel.

Wat jij wilt is volgens mij zó niet te doen. Je zult een extra query moeten uitvoeren (en dan elke rij apart ophalen) óf de resultaten van deze query nalopen en kijken of je nog met het zelfde recept bezig bent als bij de vorige stap.

LinkedIn


Acties:
  • 0 Henk 'm!

Verwijderd

Elke rij, is zoals Janoz ook al aangaf, verschillend. Je query-result is prima, nu moet je nadenken hoe je dit afgedrukt wil hebben. Als je per gerecht een lijst met ingredienten wil hebben, kun je dit bijv. zo doen:

code:
1
2
3
4
5
6
$gerechten = [gerechten]
while $row = mysql_fetch_object($gerechten)
    // druk info gerecht af
    $ingedrienten = [ingredienten bij dit gerecht]
    // druk ingredienten af
endwhile

Weet niet precies wat je wilt, bovenstaande kan ook met de huidige query bijvoorbeeld. Het gaat er dus om hoe je het afgedrukt wilt hebben, maar dat kan ik niet echt opmaken uit je posts...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
klopt ik heb dit plaatje zo laten zien met die rode steep omdat die rij inderdaad is vervallen en dat het nu dus zoals in dat plaatje loopt.

Ik dacht dat je met behulp van php er dus voor kunt zorgen dat hij dan dus wel die 1 t/m 5 waardes laat zien terwijl hij de rest maar 1 x laat zien

maar hoe zou dit dan volgens jou opgelost moeten worden?
[b][message=26792339,noline]
Elke rij, is zoals Janoz ook al aangaf, verschillend. Je query-result is prima, nu moet je nadenken hoe je dit afgedrukt wil hebben. Als je per gerecht een lijst met ingredienten wil hebben, kun je dit bijv. zo doen:
code:
1
2
3
4
5
$gerechten = [gerechten]
while $row = mysql_fetch_object($gerechten)
// druk info gerecht af
$ingedrienten = [ingredienten bij dit gerecht]
// druk ingredienten af
endwhile

Weet niet precies wat je wilt, bovenstaande kan ook met de huidige query bijvoorbeeld. Het gaat er dus om hoe je het afgedrukt wilt hebben, maar dat kan ik niet echt opmaken uit je posts...
De bedoeling is inderdaad dat hij dus het volgende laat zien

gerechtnaam
categorie
land
ingredienten
- 1
- 2
- etc.
bereidingswijze
opmerkingen

[ Voor 54% gewijzigd door Verwijderd op 05-11-2006 23:23 ]


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
mister_dynastie, zoals ik in het vorige topic ook heb aangegeven is wat jij wilt wel te doen in 1 query, maar dan krijg je bergen null velden terug (of dubbele data zoals bij jouw)

wat jij nodig hebt zijn 2 query's, zoals boland het uitlegt.

1 query die je recept opvraagt, het land wat er bij hoort en categorie.
vervolgens haal je met het 'id' van de recepten tabel alle ingredienten op die bij het recept horen.

dit staat helemaal los van je andere query, behalve dat je het id nodig hebt uit `kookboek`

het is al een aantal keer boven me uitgelegt, maar ik zal het even uitkauwen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
  $res1 = mysql_query("SELECT * FROM `kookboek`");   //hier moet je dus ff land en categorie bij doen
  while ($row1 = mysql_fetch_object($res1)) {
    echo "recept: <b>$row1->gerechtnaam</b><br><br>";

    $res2 = mysql_query("SELECT * FROM `ingredienten` WHERE `id` = '$row1->id'");
    echo "ingredienten:<br><ul>";
    while ($row2 = mysql_fetch_object($res2)) {
      echo "<li>$row2->ingredienten</li>";
    }
    echo "</ul>";
  }
?>


copy paste dat en het werkt

[ Voor 36% gewijzigd door BasieP op 05-11-2006 23:28 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BasieP schreef op zondag 05 november 2006 @ 23:23:
mister_dynastie, zoals ik in het vorige topic ook heb aangegeven is wat jij wilt wel te doen in 1 query, maar dan krijg je bergen null velden terug (of dubbele data zoals bij jouw)

wat jij nodig hebt zijn 2 query's, zoals boland het uitlegt.

1 query die je recept opvraagt, het land wat er bij hoort en categorie.
vervolgens haal je met het 'id' van de recepten tabel alle ingredienten op die bij het recept horen.

dit staat helemaal los van je andere query, behalve dat je het id nodig hebt uit `kookboek`
aha oke nu is het duidelijker, ik dacht dat je dit met 1 querie kon oplossen, en dat ik het dan met php moest afhandelen. Zo leer ik nog eens iets, ik zou dan dus met de waardes die ik uit de eerste querie haal vervolgens met een nieuwe query die ingredienten moeten ophalen.

oke dat maakt een hoop duidelijker

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zondag 05 november 2006 @ 23:26:
[...]


aha oke nu is het duidelijker, ik dacht dat je dit met 1 querie kon oplossen, en dat ik het dan met php moest afhandelen. Zo leer ik nog eens iets, ik zou dan dus met de waardes die ik uit de eerste querie haal vervolgens met een nieuwe query die ingredienten moeten ophalen.

oke dat maakt een hoop duidelijker
Het kan ook wel in 1 query... Door de resultaten heen lopen en als een recept-id wijzigt weet je dat je bij een nieuw recept bent. Probleem is dan inderdaad wel dat je dubbele data hebt.

NOFI, maar dit is wel redelijk basic... Lees eens een goede php-tutorial, php is niet iets magisch of zo hoor :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 05 november 2006 @ 23:28:
[...]

Het kan ook wel in 1 query... Door de resultaten heen lopen en als een recept-id wijzigt weet je dat je bij een nieuw recept bent. Probleem is dan inderdaad wel dat je dubbele data hebt.

NOFI, maar dit is wel redelijk basic... Lees eens een goede php-tutorial, php is niet iets magisch of zo hoor :)
Ik snap dat php niet magisch is, maar zo'n soort query + methode om zoiets te laten zien gebruik ik niet dagelijks, dus ik begreep niet helemaal hoe ik dit goed kan weergeven en hoe ik hier dus tutorials over kon vinden. als je weet hoe zoiets heet of als je hier een goede tutorial over hebt, zou ik die graag willen zien, dan leer ik er tenminste ook iets van ( ik gebruik trouwens php in combinatie met smarty)

Acties:
  • 0 Henk 'm!

Verwijderd

als ik zo kijk naar die screen van je phpmyadmin dan denk ik dat het probleem hem toch in een slechte database opzet zit, dit moet je veel verder normaliseren om goede resultaten te krijgen, het kan wel zo maar dan worden je sql statements gewoon veel ingewikkelder, kijk eens naar select distinct.

of zoals basiep zegt is ook mogelijk

[ Voor 6% gewijzigd door Verwijderd op 06-11-2006 12:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ondertussen is er al weer het een en ander verandert

gebruik nu de volgende algemene query
$home = $dbh->getAll('SELECT kookboek.*, categorie.*, land.*, ingredienten.*, ingredienten_koppel.* FROM kookboek INNER JOIN categorie ON kookboek.categorie_id = categorie.id INNER JOIN land ON kookboek.land_id = land.id INNER JOIN ingredienten_koppel ON ingredienten_koppel.id = kookboek.id INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient

in de vorige zat inderdaad nog een fout

dit geeft als resultaat het volgende overzicht:

Afbeeldingslocatie: http://www.miss-dynastie.nl/kookboek2.jpg

dat is eindelijk een mooi resultaat

om het bruikbaar te gaan gebruiken heb ik het vervolgens opgesplits in op de volgende manier:
(ik gebruik smarty)

code:
1
2
3
4
5
6
7
8
{
    $home = $dbh->getAll('SELECT kookboek.*, categorie.*, land.* from kookboek INNER JOIN categorie ON kookboek.categorie_id = categorie.id INNER JOIN land ON kookboek.land_id = land.id');
    
    if ($home)
    {
        $home1 = $dbh->getAll('SELECT ingredienten.*, ingredienten_koppel.* from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient WHERE ingredienten_koppel.id=$kookboek.id');
    }
}

alleen nu heb ik dus een probleem bij $kookboek.id daar krijg ik met geen mogelijkheid die waarde te staan, als ik daar keihard een waar van de id inzet dan werkt alles verder wel, maar is dit zo bruikbaar? en hoe nu verder, het werkt bijna

alvast weer bedankt allemaal, en ik weet dat het heel basic is, maar ik kan er nog steeds geen goede tutorial over vinden :(

Acties:
  • 0 Henk 'm!

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 24-08 06:41
Doordat je je query maakt doormiddel van een string met enkele quotes ' , wordt de variabele $kookboek.id in de string gezet als de letterlijke $kookboek.id ipv de waarde die de variabele heeft.

Je kunt dit veranderen door er dubbele quotes van te maken:
code:
1
2
3
$dbh->getAll("SELECT ingredienten.*, ingredienten_koppel.* 
from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient 
WHERE ingredienten_koppel.id=$kookboek.id");


of op het eind de string te concateneren ( aan elkaar te plakken met de . ) Dus
code:
1
2
3
$dbh->getAll('SELECT ingredienten.*, ingredienten_koppel.* 
from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient 
WHERE ingredienten_koppel.id= ' . $kookboek.id);


Je kunt dit in het vervolg heel snel zelf vinden door de query te echo-en dan zie je welke sql-query uitgevoerd gaat worden

[ Voor 21% gewijzigd door bat266 op 06-11-2006 14:25 . Reden: code tags toegevoegd ]

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bat266 schreef op maandag 06 november 2006 @ 14:18:
Doordat je je query maakt doormiddel van een string met enkele quotes ' , wordt de variabele $kookboek.id in de string gezet als de letterlijke $kookboek.id ipv de waarde die de variabele heeft.

Je kunt dit veranderen door er dubbele quotes van te maken:
code:
1
2
3
$dbh->getAll("SELECT ingredienten.*, ingredienten_koppel.* 
from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient 
WHERE ingredienten_koppel.id=$kookboek.id");


of op het eind de string te concateneren ( aan elkaar te plakken met de . ) Dus
code:
1
2
3
$dbh->getAll('SELECT ingredienten.*, ingredienten_koppel.* 
from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient 
WHERE ingredienten_koppel.id= ' . $kookboek.id);)


Je kunt dit in het vervolg heel snel zelf vinden door de query te echo-en dan zie je welke sql-query uitgevoerd gaat worden
Dat werkt :) bedankt voor je uitleg, dat ging er dus nog mis :)

kleine update voor degene die ook zoiets wil gaan bouwen, de php code die je nog nodig hebt om het weer te geven is het volgende
code:
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
28
29
30
31
32
33
34
35
36
37
    mysql_connect('localhost', $user, $password);
    mysql_select_db('$dbase');
        $kookboek_result = mysql_query("SELECT kookboek.*, categorie.*, land.* from kookboek INNER JOIN categorie ON kookboek.categorie_id = categorie.categorie_id INNER JOIN land ON kookboek.land_id = land.land_id")
    or die(mysql_error());
    
    while ($kookbook_row = mysql_fetch_row($kookboek_result))
    {
        $gerechtnaam = $kookbook_row[1];
        $categorie = $kookbook_row[8];
        $land = $kookbook_row[10];
        $bereidingswijze = $kookbook_row[4];
        $opmerkingen = $kookbook_row[5];
        $foto = $kookbook_row[6];

        print("<b>gerechtnaam:</b> $gerechtnaam<br>");
        print("<b>categorie:</b> $categorie<br>");
        print("<b>land:</b> $land<br>");
        print("<b>ingredienten:</b><br>");
        {
            $ingredient_result = 
                mysql_query("SELECT ingredienten.*, ingredienten_koppel.* from ingredienten_koppel INNER JOIN ingredienten ON ingredienten.id_ingredient = ingredienten_koppel.id_ingredient WHERE ingredienten_koppel.id=$kookbook_row[0]")
            or die(mysql_error());

            while ($ingredient_row = mysql_fetch_row($ingredient_result))
            {
                $hoeveelheid = $ingredient_row[4];
                $ingredient = $ingredient_row[1];

                print("$hoeveelheid $ingredient<br>");
            }
        }
        print("<b>bereidingswijze:</b><br>");
        print("$bereidingswijze<br>");
        print("<b>opmerking:</b><br>");
        print("$opmerkingen<br>");
        print("$foto<br>");
    }

[ Voor 44% gewijzigd door Verwijderd op 07-11-2006 16:09 ]

Pagina: 1