[PHP/MySQLi] 3 loops in elkaar

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P Wever

P Wever

25/01/2021 13:14:37
Quote Anchor link
Hallo,

Ik ben bezig met een vragenlijst aan 't maken enkel moet deze vragenlijst uit 3 tabellen opgebouwd worden;
vragenlijst, kop, groep

kop is gekoppeld aan een vraag en moet een kop weergeven voor de aangegeven vraag#, groep is gekoppeld aan een vraag# of vraag # t/m # dit wil ik gebruiken voor puntentelling.


de vragenlijst database ziet er zo uit ;

Quote:
CREATE TABLE `vragenlijst` (
`id` INT NOT NULL AUTO_INCREMENT,
`mid` INT(9),
`date` DATETIME,
`vraag1` VARCHAR(255),
`antwoord1` VARCHAR(255),
`vraag2` VARCHAR(255),
`antwoord2` VARCHAR(255),
`vraag3` VARCHAR(255),
`antwoord3` VARCHAR(255),
`vraag4` VARCHAR(255),
`antwoord4` VARCHAR(255),
`vraag5` VARCHAR(255),
`antwoord5` VARCHAR(255),
`vraag6` VARCHAR(255),
`antwoord6` VARCHAR(255),
`vraag7` VARCHAR(255),
`antwoord7` VARCHAR(255),
`vraag8` VARCHAR(255),
`antwoord8` VARCHAR(255),
`vraag9` VARCHAR(255),
`antwoord9` VARCHAR(255),
`vraag10` VARCHAR(255),
`antwoord10` VARCHAR(255),
`vraag11` VARCHAR(255),
`antwoord11` VARCHAR(255),
`vraag12` VARCHAR(255),
`antwoord12` VARCHAR(255),
`vraag13` VARCHAR(255),
`antwoord13` VARCHAR(255),
`vraag14` VARCHAR(255),
`antwoord14` VARCHAR(255),
`vraag15` VARCHAR(255),
`antwoord15` VARCHAR(255),
`vraag16` VARCHAR(255),
`antwoord16` VARCHAR(255),
`vraag17` VARCHAR(255),
`antwoord17` VARCHAR(255),
`vraag18` VARCHAR(255),
`antwoord18` VARCHAR(255),
`vraag19` VARCHAR(255),
`antwoord19` VARCHAR(255),
`vraag20` VARCHAR(255),
`antwoord20` VARCHAR(255),
`vraag21` VARCHAR(255),
`antwoord21` VARCHAR(255),
`vraag22` VARCHAR(255),
`antwoord22` VARCHAR(255),
`vraag23` VARCHAR(255),
`antwoord23` VARCHAR(255),
`vraag24` VARCHAR(255),
`antwoord24` VARCHAR(255),
`vraag25` VARCHAR(255),
`antwoord25` VARCHAR(255),
`vraag26` VARCHAR(255),
`antwoord26` VARCHAR(255),
`vraag27` VARCHAR(255),
`antwoord27` VARCHAR(255),
`vraag28` VARCHAR(255),
`antwoord28` VARCHAR(255),
`vraag29` VARCHAR(255),
`antwoord29` VARCHAR(255),
`vraag30` VARCHAR(255),
`antwoord30` VARCHAR(255),
`vraag31` VARCHAR(255),
`antwoord31` VARCHAR(255),
`vraag32` VARCHAR(255),
`antwoord32` VARCHAR(255),
`vraag33` VARCHAR(255),
`antwoord33` VARCHAR(255),
`vraag34` VARCHAR(255),
`antwoord34` VARCHAR(255),
`vraag35` VARCHAR(255),
`antwoord35` VARCHAR(255),
`vraag36` VARCHAR(255),
`antwoord36` VARCHAR(255),
`vraag37` VARCHAR(255),
`antwoord37` VARCHAR(255),
`vraag38` VARCHAR(255),
`antwoord38` VARCHAR(255),
`vraag39` VARCHAR(255),
`antwoord39` VARCHAR(255),
`vraag40` VARCHAR(255),
`antwoord40` VARCHAR(255),
`vraag41` VARCHAR(255),
`antwoord41` VARCHAR(255),
`vraag42` VARCHAR(255),
`antwoord42` VARCHAR(255),
`vraag43` VARCHAR(255),
`antwoord43` VARCHAR(255),
`vraag44` VARCHAR(255),
`antwoord44` VARCHAR(255),
`vraag45` VARCHAR(255),
`antwoord45` VARCHAR(255),
`vraag46` VARCHAR(255),
`antwoord46` VARCHAR(255),
`vraag47` VARCHAR(255),
`antwoord47` VARCHAR(255),
`vraag48` VARCHAR(255),
`antwoord48` VARCHAR(255),
`vraag49` VARCHAR(255),
`antwoord49` VARCHAR(255),
`vraag50` VARCHAR(255),
`antwoord50` VARCHAR(255),
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
ALTER TABLE `vragenlijst` CHANGE `date` `date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `vragenlijst` CHANGE `mid` `mid` INT(9) NULL DEFAULT '000';


kop db:

Quote:
CREATE TABLE `kop` (
`id` INT(9) NOT NULL AUTO_INCREMENT,
`vraag` INT(9),
`vragenlijst` INT(9),
`title` TEXT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;


Ik kom niet uit t volgende;

Ik wil een loop maken die alle vragen weergeeft maar als er een kop overeenkomt met het vraag# uit vragenlijst moet deze kop weergegeven worden. enige wat er nu gebeurt is dat eerste 8 vragen niet weergeven worden en erna wel.

de data in vragenlijst die ik nu gebruik als voorbeeld staan 34 vragen in een record.

Quote:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
$mysqli
= new mysqli("localhost","root","","onderzoek");

if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}


$id= $_GET['id'];
if(isset($id)){

    $query = "SELECT * FROM kop WHERE vragenlijst={$id}";
    if ($result = $mysqli->query($query)) {

        /* fetch associative array */
        $koppen = array();
        while ($row = $result->fetch_assoc()) {

            $kop = array(
            "id" => $row['vraag'],
            "tekst" => $row['title']
            );


            array_push($koppen, $kop);
        }


        /* free result set */
        $result->free();
    }



    $query2 = "SELECT * FROM vragenlijst WHERE id={$id} LIMIT 1";
    if ($result = $mysqli->query($query2)) {

        /* fetch associative array */
        while ($row = $result->fetch_assoc()) {
            
            for($i=1;$i<=50;$i++){

                    if(!empty($row['vraag'.$i])){

                        if(!empty($koppen[$i]['id'])){

                            if($koppen[$i]['id'] == $i){
                                echo "[".$koppen[$i]['tekst']."] (#".$i.") ".$row['vraag'.$i]." <br/>";
                            }

                        }
else {
                            echo "(#".$i.") ".$row['vraag'.$i]." <br/>";
                        }

                    }

            }

        }


        /* free result set */
        $result->free();
    }


    $mysqli -> close();
}

?>


Mocht je meer informatie willen hebben stel ze gerust.


mvg,

Pascal
 
PHP hulp

PHP hulp

02/03/2021 15:13:13
 
Ramon van Dongen

Ramon van Dongen

25/01/2021 13:39:07
Quote Anchor link
Hallo Pascal,

Ik zou beginnen met de database aan te passen.
Zoek eens op database normaliseren.

Zodra je kolommen moet gaan nummeren, ben je in 99 van de 100 keer een foute weg ingeslagen.

Het hangt er een beetje vanaf hoe je het in de praktijk gaat gebruiken.
Maar ik zou nu één tabel maken 'vragenlijst' en één tabel 'vragen_antwoorden' (of zoiets).

In de tabel 'vragen_antwoorden' verwijs je naar 'vragenlijst', naar het ID daarvan. Daarnaast heb je een kolom 'vraag' en een kolom 'antwoord'.
Voor elke vraag/antwoord komt er een regel in die tabel.

Wellicht kun je zelfs de vragen en antwoorden nog apart van elkaar opslaan als de vragen elke keer hetzelfde zijn, maar alleen de antwoorden steeds anders zijn.
 
P Wever

P Wever

25/01/2021 13:41:55
Quote Anchor link
Ramon van Dongen op 25/01/2021 13:39:07:
Hallo Pascal,

Ik zou beginnen met de database aan te passen.
Zoek eens op database normaliseren.

Zodra je kolommen moet gaan nummeren, ben je in 99 van de 100 keer een foute weg ingeslagen.

Het hangt er een beetje vanaf hoe je het in de praktijk gaat gebruiken.
Maar ik zou nu één tabel maken 'vragenlijst' en één tabel 'vragen_antwoorden' (of zoiets).

In de tabel 'vragen_antwoorden' verwijs je naar 'vragenlijst', naar het ID daarvan. Daarnaast heb je een kolom 'vraag' en een kolom 'antwoord'.
Voor elke vraag/antwoord komt er een regel in die tabel.

Wellicht kun je zelfs de vragen en antwoorden nog apart van elkaar opslaan als de vragen elke keer hetzelfde zijn, maar alleen de antwoorden steeds anders zijn.


Bedankt voor 't snelle antwoord! Oke dan begin ik maar met database opnieuw te ontwerpen, mocht ik erna nog niet uitkomen plaats ik hier weer een bericht.
 
Ramon van Dongen

Ramon van Dongen

25/01/2021 13:43:07
Quote Anchor link
Niet het antwoord dat je wilde horen, maar wel de verstandigste keuze.
Maakt het jezelf voor de toekomst veel gemakkelijker.

Plaats je database ontwerp gerust hier, we kijken graag mee.
 
P Wever

P Wever

25/01/2021 14:02:12
Quote Anchor link
Nouja wel antwoord wat ik wilde, als het erna stukken makkelijker is om te beheren.

vragenlijst (koppeling persoon aan vragenlijst)
vragenlijst_id
vragenlijst_mid
vragenlijst_date

vragenlijst_data (voor ingevulde data)
vragenlijst_data_id
vragenlijst_data_mid
vragenlijst_data_date
vragenlijst_data_antwoorden (Wat is handige manier om een wisselbare aantal antwoorden op te slaan, maar ook overzicht niet kwijt te raken?)

als voorbeeld dit is hoe ik dacht dat 'vragenlijst_data_antwoorden' eruit ziet :
1:dit is mijn eerste antwoord.=1, 2:2=2, 3:dit mijn derde antwoord.=1

wat er na '=' komt is de soort vraag: 1 = open antwoord, 2 = multiple choice, 3 = multiple choice, 4 = multiple choice, 2 3 en 4 zijn allemaal anders.

vragen (de vraag, en een soort antwoord dat verwacht kan worden gekoppeld een vragenlijst id)
vragen_id
vragen_vid
vragen_vraag
vragen_soort (soort antwoord vier opties mogelijk)

koppen (de kop, gekoppeld een vragenlijst:id als kop:id overeenkomt met vragen:id dan kop:titel weergeven)
koppen_id
koppen_vid
koppen_titel

groepen (de groepen, gekoppeld aan vragenlijst:id, groep kan voor meerdere vragen zijn of een enkele vraag)
groepen_id
groepen_id
groepen_vragen

Ontbreekt er wat? en graag advies voor het opslaan van de data uit de vragenlijst ik heb namelijk aantal jaren niks gedaan met programmeren of ontwerpen van databases.
Gewijzigd op 25/01/2021 14:56:10 door P Wever
 
Ramon van Dongen

Ramon van Dongen

25/01/2021 15:33:27
Quote Anchor link
Ik probeer even goed te begrijpen wat je uiteindelijke doel precies is. Zodat ik je niet verkeerd adviseer.

Je hebt dus uiteindelijk een vragenlijst met daarin vragen. Tussen de vragen zet je af en toe een kop (die moet ik dus zien als tekstuele titel?).

De vragen zijn elke keer hetzelfde bij een zelfde vragenlijst?

Klopt het tot zover?

Daarnaast je heb je het nog over;
Quote:
vragen_soort (soort antwoord vier opties mogelijk)
Wat bedoel je daar precies mee? Dit?
Quote:
1 = open antwoord, 2 = multiple choice, 3 = multiple choice, 4 = multiple choice,

Want dan moet je per (mulitple choise) vraag dus inderdaad alle mogelijke antwoorden opslaan.
Eigenlijk hoef je de vraag soort dan niet op te slaan; als er geen (meerdere) antwoord mogelijkheden zijn, is het dus een open vraag. Toch?

Toevoeging op 25/01/2021 15:42:01:

Zoiets krijg je dan denk ik;
https://racmedia.nl/uploads/103863.png
 
P Wever

P Wever

25/01/2021 15:53:14
Quote Anchor link
Ramon van Dongen op 25/01/2021 15:33:27:
De vragen zijn elke keer hetzelfde bij een zelfde vragenlijst?


Ik heb twee vragenlijsten (Eerste werkdag evaluatie en dan elke 3 maanden);

vragenlijst 1; word enkel de eerste keer gebruikt, alle andere keren dat vragenlijst ingevuld moet worden, word er gebruikt gemaakt van vragenlijst 2.

vragenlijst 1 bevat 34 vragen en vragenlijst 2 bevat 45 vragen.

Ramon van Dongen op 25/01/2021 15:33:27:
Je hebt dus uiteindelijk een vragenlijst met daarin vragen. Tussen de vragen zet je af en toe een kop (die moet ik dus zien als tekstuele titel?).


Ja dit klopt helemaal, maar daar boven liggend is de groep omdat sommige vragen samen gegroepeerd word maar soms bestaat een 'groep' maar uit een vraag.

Ramon van Dongen op 25/01/2021 15:33:27:
Daarnaast je heb je het nog over;
Quote:
vragen_soort (soort antwoord vier opties mogelijk)
Wat bedoel je daar precies mee? Dit?
Quote:
1 = open antwoord, 2 = multiple choice, 3 = multiple choice, 4 = multiple choice,

Want dan moet je per (mulitple choise) vraag dus inderdaad alle mogelijke antwoorden opslaan.
Eigenlijk hoef je de vraag soort dan niet op te slaan; als er geen (meerdere) antwoord mogelijkheden zijn, is het dus een open vraag. Toch?


vragen_soort is inderdaad soort antwoord dat er gegeven kan worden, dit is zeer belangrijk voor punten telling anders is gehele vragenlijst overbodig.

soort antwoorden

1;
Sterk oneens
oneens
neutraal
eens
sterk mee eens

2;
Zeer ontvreden
Ontevreden
Neutraal
Tevreden
Zeer tevreden

3;
open antwoord

4;
Nee, geen verandering
Ja, slechter geworden
Ja, beter geworden

Wat ik er nog niet in heb verwerkt, is als je een soort antwoord weet; weet je nog niet welke uit de lijst van soort antwoord gekozen is. Stel voor soort antwoord is 2 maar dan weet je nog niet of Zeer ontevreden, Ontevreden, Neutraal, Tevreden, Zeer tevreden.
Gewijzigd op 25/01/2021 16:47:06 door P Wever
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/01/2021 23:35:50
Quote Anchor link
Je moet bij het ontwerp denken aan entiteiten of dingen. Een vraag is een vraag. of die nou bij vragenlijst 1 of 2 hoort en of die nou multiple choice of open is maakt niet uit want dat zijn kenmerken.

Dus als ik je laatste post eens doorlees dan krijg je iets als

tabel vragenlijsten
lijst_id
naam

tabel vraag_groepen (een groep vragen)
vraag_groep_id
groepsnaam
volgorde (hiermee creeer je de mogelijkheid om de volgorde waarop de groepen getoond worden aan te passen)

tabel vragen
vraag_id
groep_id (geeft aan in welke groep deze vraag thuis hoort)
lijst_id (geeft aan in welke lijst deze vraag thuis hoort)
vraag (de vraag, tekst dus)
type (multiple choice of open of whatever)

tabel antwoorden (voor alle (mogelijke) antwoorden die bij een multiple choice vraag horen)
antwoord_id
vraag_id (bij welke vraag hoort dit mogelijke multiple choice antwoord)
antwoord (de tekst)
juist (true als dit het juiste antwoord is)

Voor de duidelijkheid: in de tabel vragen komen dus ALLE vragen. Het maakt niet uit in welke lijst of welke groep de vraag hoort. Het maakt ook niet uit wat voor type vraag het is.

Bij elk database ontwerp moet je keuzes maken. In mijn voorbeeld ben ik er van uit gegaan dat iedere vraag slechts in één groep hoort en slechts in één vragenlijst komt te staan maar ik had er ook voor kunnen kiezen dat een vraag in meerdere groepen of lijsten mag voorkomen.
Daarnaast heb ik de kolom lijst_id in de tabel vragen geplaatst maar ik had deze ook in de tabel groepen kunnen plaatsen. in dat geval hoort een vraag enkel bij een bepaalde groep en een groep bij een bepaalde lijst. Zo zie je dat een juist database-ontwerp tijd en ervaring vergt ...
Gewijzigd op 26/01/2021 00:01:09 door Frank Nietbelangrijk
 
P Wever

P Wever

26/01/2021 11:36:48
Quote Anchor link
Frank Nietbelangrijk op 25/01/2021 23:35:50:
Je moet bij het ontwerp denken aan entiteiten of dingen. Een vraag is een vraag. of die nou bij vragenlijst 1 of 2 hoort en of die nou multiple choice of open is maakt niet uit want dat zijn kenmerken.

Dus als ik je laatste post eens doorlees dan krijg je iets als

tabel vragenlijsten
lijst_id
naam

tabel vraag_groepen (een groep vragen)
vraag_groep_id
groepsnaam
volgorde (hiermee creeer je de mogelijkheid om de volgorde waarop de groepen getoond worden aan te passen)

tabel vragen
vraag_id
groep_id (geeft aan in welke groep deze vraag thuis hoort)
lijst_id (geeft aan in welke lijst deze vraag thuis hoort)
vraag (de vraag, tekst dus)
type (multiple choice of open of whatever)

tabel antwoorden (voor alle (mogelijke) antwoorden die bij een multiple choice vraag horen)
antwoord_id
vraag_id (bij welke vraag hoort dit mogelijke multiple choice antwoord)
antwoord (de tekst)
juist (true als dit het juiste antwoord is)

Voor de duidelijkheid: in de tabel vragen komen dus ALLE vragen. Het maakt niet uit in welke lijst of welke groep de vraag hoort. Het maakt ook niet uit wat voor type vraag het is.

Bij elk database ontwerp moet je keuzes maken. In mijn voorbeeld ben ik er van uit gegaan dat iedere vraag slechts in één groep hoort en slechts in één vragenlijst komt te staan maar ik had er ook voor kunnen kiezen dat een vraag in meerdere groepen of lijsten mag voorkomen.
Daarnaast heb ik de kolom lijst_id in de tabel vragen geplaatst maar ik had deze ook in de tabel groepen kunnen plaatsen. in dat geval hoort een vraag enkel bij een bepaalde groep en een groep bij een bepaalde lijst. Zo zie je dat een juist database-ontwerp tijd en ervaring vergt ...


Heel erg bedankt voor je antwoord, hier kan ik wat mee!
 



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.