Avatar billede klovnefisken Nybegynder
15. november 2011 - 19:45 Der er 6 kommentarer og
1 løsning

mysql implode problem ved antal over 12

her er den kode jeg prøver
        $sql="SELECT * FROM kursus WHERE kursus_id='".$nr."'";
        $result=mysqli_query($link,$sql) or die(mysqli_error($link));
        while($row = mysqli_fetch_array($result))
        {
            $kursus_navn=$row['kursus_navn'];
            $kursus_beskriv=$row['kursus_beskriv'];
            $kursus_pris=$row['kursus_pris'];
            $kursus_gruppe=$row['kursus_gruppe'];
            $kursus_opret=$row['kursus_opret'];
            $kursus_lek_id=explode(',' , $row['kursus_lektion']);
        }
       
        $kursus_lek_navn=array(); $kursus_lek_type=array();$kursus_lek_nr=array();

        $sql="SELECT * FROM lektioner WHERE lektion_id IN(".implode(',',$kursus_lek_id).')';
        $result=mysqli_query($link,$sql) or die(mysqli_error($link));
        while($row = mysqli_fetch_array($result))
        {
            $kursus_lek_nr[]=$row['lektion_id'];
            $kursus_lek_navn[]=$row['lektion_navn'];
            $kursus_lek_type[]=$row['lektion_type'];
        }

data i tabellen i databasen er 1,8,7,13,6,13,15,10,9,9,13,15 osv der er 22 tal, men det er kun de første 12 der kommer i arrayet til sidst
de første sql kald er ok det har jeg set i udskrift
men det er den sidste udtræk der driller mig
nummerene i database er id nummere til en ande tabel , og det er ikke sådan at de id'er ikke eksistere , det er også krontoleret

på forhånd tak
Bruno
15. november 2011 - 20:32 #1
Jeg har kikket på den kode du viser - du har, tror jeg, et antal kurser som du bevarer i tabellen kurser, og hver kursus har et antal lektioner som du bevarer i tabellen lektioner.  Der er (tror jeg) en en-til-mange relation mellem kurser og lektioner.  Hvert kursus har mange lektioner, hver lektion hører til et og kun et kursus.  Hver lektion har en lektion_id.  For at vide hvilke lektioner der hører til et kursus har du i kursus tabellen et felt hvor du viser en liste over de tilhørende kurser.  Jeg gætter på noget i retning af dette:

kursus
id navn lektioner
1  Engelsk 1,3,8,9,12
2  Judo    2,10,18
3  Musik    4,5,6,22,30

lektion
id navn
1  Engelsk grammatik
2  Intro to judo
3  Engelsk poesi
4  Om at lytte til musik

Den sædvanlige måde at modellere en-til-mange relationer er i 'mange-tabellen' at have et felt der henviser til 'en-tabellen' i stedet for som du gør, i 'en-tabellen' at have en liste over id'er i 'mange-tabellen'.  Med den gængse fremgangsmåde kan du undgå at implode og explode og lignende.  Således: 

kursus
id navn
1  Engelsk
2  Judo
3  Musik

lektion
id kursus navn
1  1      Engelsk grammatik
2  2      Intro to judo
3  1      Engelsk poesi
4  3      Om at lytte til musik

Altså lektion 1 hører til kursus 1, lektion 3 hører også til kursus 1, lektion 4 hører til kursus 3 o.s.v.

Så kan du få udskrevet de lektioner der hører for eksempel til engelsk kurset med et simpelt join query således:

SELECT k.id, k.navn, l.id, l.navn FROM kursus k JOIN lektion l ON k.id = l.kursus WHERE k.navn = 'Engelsk'

Det vil, med ovenstående data, give dette resultat
1 Engelsk 1 Engelsk grammatik
1 engelsk 3 Engelsk poesi

Din php behøver så kun at kalde en query, og du kan i php formattere udskrivningen efter behov.

Det var ikke det du spurgte om, men jeg håber det kan give dig ideer til at komme videre.
15. november 2011 - 20:41 #2
Hvis jeg har misforstået situationen, hvis for eksempel nogle lektioner kan høre til flere forskellige kurser (for eksempel at lektionen sprogstruktur hører til både engelsk og matematik, og lektionen nodelære hører således at der er en mange-til-mange relation mellem kurser og lektioner) så fortæl mere.  Så prøver vi igen.
Avatar billede klovnefisken Nybegynder
15. november 2011 - 20:59 #3
jep det er jo lige der jeg har et problem også , et lektion kan blive brugt i flere kurser
men den ide med en extra tabel i databasen der indeholder relationen , eks en id, kursus,lektion hvor man under kursus skriver eks_id på kursus og id under lektion
det giver så en linje for hver lektion der er i en kursus

det var da en måde at gribe sagen an på

i den tabel vil jeg jo også nem kunne læse begge veje tælle hvor mange lektioner der er til en given kursus og hvor mange gange en lektion er brugt

der er nemlig sådan at en kursus består af et antal lektioner

jeg så bare et lys i at kunne gemme lektion nummerene i et komma sepereret streng, det ville være mere overskulig

hvad mener andre der er den mest smarte løsning her ?
15. november 2011 - 21:18 #4
Altså en mange-til-mange relation mellem kurser og lektioner.  Hvert kursus kan have fra 0 til mange lektioner og hver lektion kan høre til fra 0 til mange kurser.

Den gængse måde at modellere sådanne mange-til-mange relationer er at have en tabel, i dette tilfælde, for kurser, en tabel for lektioner, og en tabel for relationerne der i mellem.  Så som:

kursus
id navn
1  Engelsk
2  Fransk
3  Piano
4  Violin

lektion
id navn
1  sprogstruktur
2  engelsk poesi
3  franske verber
4  nodelære

kursus_lektion
id kursus lektion
1    1        1
2    1        2
3    2        1
4    2        3
5    3        4
6    4        4

Altså til kursus 1 hører lektion 1 og 2.  Lektion 1 hører til kursus 1 og kursus 2.  O.s.v.

Hvis du så skal finde kursusnavn og lektionsnavn for alle lektioner der hører til kursus Engelsk gør du således:

SELECT k.navn, l.navn FROM kursus k JOIN kursus_lektion kl ON k.id = kl.kursus JOIN lektion l ON kl.lektion = l.id WHERE k.navn = 'Engelsk'

hvilket vil give dig
engelsk sprogstruktur
engelsk engelsk poesi

Hvis du vil finde kursusnavn og lektionsnavn for de kurser der bruger nodelære bliver det:

SELECT k.navn, l.navn FROM kursus k JOIN kursus_lektion kl ON k.id = kl.kursus JOIN lektion l ON kl.lektion = l.id WHERE l.navn = 'nodelære'
15. november 2011 - 21:31 #5
komma separerede lister/strenge har mange anvendelser, men relationelle database management systemer såsom mysql er optimatiserede på såkaldte normaliserede data strukturer hvor der ikke er sådanne lister.  Der er mange programmerings situationer hvor for eksempel excel spreadsheets er en tilstrækkelig, og derfor bedre, løsning end mere komplicerede database systemer, men hvis man vælger at bruge en database, så bør man normalisere sine data, så man kan kan tage fuld fordel af de tilrådeværende database metoder.
Avatar billede klovnefisken Nybegynder
15. november 2011 - 21:44 #6
Christian_Belgien i #4 skriver du lige som det er jeg skal bruge det , altså en mange til mange relation, ja jeg kan godt se den med SELECT k.navn, l.navn FROM kursus k JOIN kursus_lektion kl ON k.id = kl.kursus JOIN lektion l ON kl.lektion = l.id WHERE k.navn = 'Engelsk'

er lige metoden til mit problem lige nu , det er den vej jeg kommer til at læse mest

jeg kan godt gennemskue den , nu den er skrevet , men det var lige det at det så meget mere smart ud det med implode som jeg fandt på nettet ,
nu vil jeg snart sove på den , og så bruge imorgen på at programmere mig igennem dette
takker til nu
men lader lige denne stå åben , hvis der kommer flere ting til angående denne sql sætnig
15. november 2011 - 21:58 #7
Jamen hvis mine indlæg har været til nytte, så tillader jeg mig at oprette et svar.  Når du så kommer til det næste problem, er det som regel hensigtsmæssigt at afslutte dette spørgsmål og oprette et frisk spørgsmål for det nye problem. Så vil det blive set af alle Ekspertens medlemmer (hvoraf nogle måske er klogere end jeg) og ikke kun der følger denne tråd.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester