Checkbox met foreach en database gegevens

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nicolai Slagter

Nicolai Slagter

17/11/2020 23:21:19
Quote Anchor link
Hallo,

Ik kom er maar niet uit.. van alles geprobeerd.. wellicht niet goed.

Ik haal via een while gegevens uit de database. In deze gegevens laat ik een checkbox komen welk het id nummer mee heeft.

Als name=extra[] value=idnummer

Nu krijg ik wanneer ik de opdracht uitvoer de id nummers die ik nodig ben op een rij.

Maar als ik een ander veld niet goed ingevuld heb krijg ik een waarschuwing. En verlies ik de check van de checkbox.

If(extra == $regelvandata[id]){ dan check }

Wanneer ik 1 regel check gaat dit goed, maar bij meerdere niet. Omdat hij meer nummers laat zien, pakt hij alleen het laatste nummer.

Hoe kan ik er voor zorgen dat hij de nummers opsplits en deze controleert, zodat ik bij een fout niet alles opnieuw hoef te checken?

Alvast bedankt.

Nicolai
 
PHP hulp

PHP hulp

27/11/2020 09:24:14
 
- Ariën -
Beheerder

- Ariën -

18/11/2020 00:28:05
Quote Anchor link
Wat voor waarschuwing krijg je dan als je een veld niet hebt ingevuld?
 
Nicolai Slagter

Nicolai Slagter

18/11/2020 05:37:19
Quote Anchor link
Dat de eindplaats of km stand niet ingevuld is. Dat is een foutmelding die ik voor mezelf ter contole geef. Maar daarin kun je kan ik gewoon de $_Post gegevens gebruiken. Maar omdat ik via de checkbox die foreach gebruikt gaat dat nu niet op.
 
- Ariën -
Beheerder

- Ariën -

18/11/2020 10:02:13
Quote Anchor link
Kan je wat relevante code geven?
 
Nicolai Slagter

Nicolai Slagter

18/11/2020 10:16:43
Quote Anchor link
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
echo'<form method="post">';

$sql = "SELECT * FROM `ritten-stukgoed` where door='$stat[naam]' and klaar='0' order by id asc";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
                                        
while($row = $result->fetch_assoc()) {    

$numm++;

echo'

<div class="row gtr-uniform">

<div class="col-12">
<h3>'
.$numm.'. '.$row[laadplaats].'</h3>
</div>

'
;

if($row[bezig] == "1"){

echo'

<div class="col-6 col-12-small">
<input type="text" placeholder="Losplaats" name="losplaats" value="'
.$losplaats.'" />        
</div>

<div class="col-6 col-12-small">
<input type="number" placeholder="Km-stand" name="loskm" value="'
.$loskm.'" />    
</div>
                                                            
<div class="col-12">
<ul class="actions">
<li><input type="submit" value="Opslaan" name="opslaan" class="primary" Onclick="return zekerweten();"/></li>
<li><a href="?stoppen='
.$row[id].'" class="button primary" Onclick="return stoppen();">Stoppen</a></li>
</ul>
</div>

'
;

}
else{

if($blok == "0"){

echo'

<div class="col-12">
<ul class="actions stacked">
<li><a href="?starten='
.$row[id].'" class="button primary">Starten</a></li>
</ul>

</div>

'
;

}
else{

if($row[id] == $extras){

$check = "checked";

}
else{

$check = "";

}


echo'

<div class="col-12">
<input type="checkbox" id="extra'
.$row[id].'" name="extra[]" value="'.$row[id].'" '.$check.'>
<label for="extra'
.$row[id].'">Deze locatie ook afsluiten</label>
</div>

'
;

}

}


echo'

</div>

<hr>

'
;

}

}
else{

echo'<div class="box">Op dit moment is er geen rit om af te sluiten.</div>';

}


?>
                

</form>
Gewijzigd op 18/11/2020 10:19:58 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

18/11/2020 10:22:26
Quote Anchor link
Mij lijkt het verstandig om ook met isset() te controleren of het ook in de $_POST zit.
 
Nicolai Slagter

Nicolai Slagter

18/11/2020 10:33:11
Quote Anchor link
Ik heb het volgende.

if(isset($_POST['opslaan'])){

$losplaats = htmlspecialchars($_POST["losplaats"]);
$loskm = htmlspecialchars($_POST["loskm"]);
$extra = $_POST["extra"];

Foreach($extra as $extra){

Echo $extra;

}

Dan krijg ik de id nummers van de extra geselecteerde ritten.

Alleen als ik de km stand niet of verkeerd invul dan krijg ik wel van uit de post de losplaats terug in zn veld. Maar moet dan de regels opnieuw selecteren. Terwijl ik juist dezr regels dan geselecteerd wil houden.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2020 12:24:33
Quote Anchor link
Het bovenstaande zal in ieder geval (waarschijnlijk?) voor een zwik notice-foutmeldingen zorgen. "id" staat namelijk niet tussen quotes en zal dus in eerste instantie als constante worden geïnterpreteerd.

Dan echo je een heleboel lappen statische HTML. Dat leest niet echt prettig, en daarbij is dan het onderscheid tussen wat gewoon "platte" HTML is en wat dynamisch door PHP wordt gevuld moeilijker te bepalen.

Misschien is een betere strategie ook om in de index van de checkbox-naam het id op te nemen, dus in plaats van

name="extra[]" value="<het row id>"

zou je kunnen opteren voor

name="extra[<het row id>]" value="1"

Sidenote: alle checkboxen die niet aangevinkt zijn worden in het geheel niet gePOST, deze bestaan simpelweg niet in $_POST, ook al waren deze wel als checkbox-element aanwezig in het oorspronkelijke formulier.

Quote:
Alleen als ik de km stand niet of verkeerd invul dan krijg ik wel van uit de post de losplaats terug in zn veld. Maar moet dan de regels opnieuw selecteren. Terwijl ik juist dezr regels dan geselecteerd wil houden.

Naarmate je langere/complexere formulieren krijgt en het geheel van deze pagina's verdacht veel gaat lijken op een administratief systeem (of misschien is dit het al) dan wordt het heel snel steeds interessanter om te investeren in een goed werkend formuliersysteem met duidelijk gescheiden stappen ofwel "acties":
- een actie voor het tonen van een nieuw formulier, eventueel met eerder ingevulde data die incompleet is
- een verwerkstap met validatie van de ingevulde gegevens met een beslismoment: doorgaan en opslaan, of terugkeren naar het formulier met heldere foutmeldingen zodat de incomplete informatie alsnog aangevuld/verbeterd kan worden
- een actie voor het tonen van eerder ingevulde informatie, waarbij het formulier vanuit de database gevuld wordt

Het opdelen in aparte acties zorgt ervoor dat alle verantwoordelijkheden beter gescheiden worden en bevordert het overzicht en de onderhoudbaarheid van deze code. Het principe wat je dan waarschijnlijk volgt is het POST/redirect/GET patroon. Een bijkomstigheid is dat je deze informatie tussen deze acties of pagina-aanroepen soms zult moeten onthouden. Deze stap ontbreekt nu blijkbaar want het klinkt alsof je informatie verliest als je iets verkeerd invult. Als je zo'n systeem veelvuldig gebruikt wordt dat natuurlijk heel snel strontvervelend; het zorgt voor frustratie maar bovendien onnodig tijdsverlies.

Anyhow, wanneer de validatie mislukt en bepaalde zaken onvolledig zijn ingevuld zul je dus teruggestuurd moeten worden naar het oorspronkelijke formulier waarbij de zojuist ingevulde informatie hierin moet worden teruggestopt. Deze informatie zul je dus tijdelijk ergens op moeten slaan om deze weer over te kunnen hevelen in het formulier op het moment dat je hier naar wordt teruggestuurd. Sessies kunnen hier uitkomst bieden en zouden je in staat moeten stellen om (volledig) te voorkomen dat je informatie verliest.
 
Nicolai Slagter

Nicolai Slagter

18/11/2020 13:13:00
Quote Anchor link
Bedankt voor je brede uitleg.
Zo diep zit ik helaas er niet in. Het is idd een stukje administratie voor de chauffeurs om bij te houden. Voor als nog werkt het prima, voor wat ik nodig ben. Ik dacht om het te versimpelen checkboxen gebruiken. Als de km stand bv lager is dan de laatst bekende slaat hij gegevens niet op. Maar blijft het veld van losplaats en km stand wel ingevuld, zodat men kan zien wat ze verkeerd ingevuld hebben.

Alleen moeten ze de checkbox op nieuw aanvinken.

Als ik dan nu extra[metid] gebruik met de value als 1. Hoe lees ik deze dan uit als id nummer?
 
Thomas van den Heuvel

Thomas van den Heuvel

18/11/2020 13:37:30
Quote Anchor link
$_POST['extra'] is nog steeds een verzameling van key-value paren (een array) van aangevinkte checkboxen.

Voorheen zat het id in de value en had de key niet echt een betekenis.
Nu zit het id in de key heeft de value eigenlijk geen betekenis meer, anders dan de waarde 1.

Voor de goede orde zou je alle informatie eerst moeten valideren op kloppendheid, en dan zou je deze data pas mogen gaan gebruiken. Zo zou je eigenlijk eerst moeten controleren of:
$_POST['extra'] niet leeg is (indien het verplicht is om op zijn minst één checkbox aan te vinken);
$_POST['extra'] een array is;
$_POST['extra'] uitsluitend geldige keys bevat.

Voor nu gaan we er vanuit dat er niet is gesjoemeld met deze waarden, en doen we een hele eenvoudige check, we controleren enkel of $_POST['extra'] bestaat, daarna doorlopen we deze velden. Zoals aangegeven is het beter om de validatie niet te combineren met het verdere gebruik, maar goed, het zal zoiets worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
if (false === empty($_POST['extra'])) {
    // $_POST['extra'] bestaat en is niet-leeg
    foreach ($_POST['extra'] as $key => $dummy) {
        // we gebruiken hier $dummy om aan te geven dat de waarde er niet echt toe doet
        // ... doe hier iets met $key ...

    }
}

?>
 



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.