Hallo allemaal,

Ik hoop dat jullie mij kunnen helpen!
Ik ben een script aan het schrijven waarmee ik diensten voor klanten aan en uit kan zetten.
Ik kan deze diensten aan/uit zetten door middel van een checkbox welke de name dienst[] meekrijgt.
Het toevoegen van een enkele dienst gaat goed, en wanneer ik deze checkbox weer uit zet dan wordt deze ook uit het systeem gehaald.

Als ik nu 2 diensten toevoeg gaat dit ook goed, alleen als ik dan 1 van die 2 diensten OF allebei uitvink, dan gebeurt er helemaal niks.
Mijn code:

if(!empty($_POST['dienst'])){
	foreach($_POST['dienst'] AS $key=>$dienstupdate){
		$users->update_user_diensten($_GET['id'],$dienstupdate,$_SESSION['y_status']);
		$my_query = mysql_query("SELECT * FROM user_diensten WHERE user_id='".$_GET['id']."' AND dienst_id='".$dienstupdate."' ") or die(mysql_error());
		$my_rd = mysql_fetch_assoc($my_query);
		if(($my_rd['dienst_id'] != $dienstupdate) && ($my_rd['active'] == 1)){
			$setinactive = time();
			mysql_query("UPDATE user_diensten SET active=0, activeTill='".$setinactive."' WHERE user_id='".$_GET['id']."' AND dienst_id='".$dienstupdate."' ") or die(mysql_error());
		}
	}
} else {
	$users->set_diensten_inactive($_GET['id']);
}

Kunnen jullie zien wat hier fout gaat?

Alvast bedankt!!
Beste Cris, er gaat helemaal niks fout, alleen je controleert verkeerd. ALs je ze uitvinkt is $_POST['dienst'] namelijk leeg, dus je hele if statement stopt al bij de eerste regel. Daarnaast weet ik niet of je de invoer checkt, want een $_GET['id'] invoeren in de database zonder enige controle is niet veilig.
Als je nu bezig bent om dit te gaan realiseren zou ik je aanraden om het wel gelijk op een goede manier te doen. De mysql_* functies die je nu gebruikt zijn 'deprecated' en zullen op termijn verdwijnen. Na een server update zullen deze waarschijnlijk al meldingen gaan geven. Kijk eens naar mysqli of PDO.
Zorg voor je query's voor een goede afhandeling en dus geen die().
Je script is ook zo lek als een mandje. Alles wat binnen komt via de gebruiker (GET, POST) dien je te controleren of door een daarvoor bedoelde functie als htmlentities/htmlspecialchars/real_escape_string o.i.d. te halen.
Geef in je select altijd op wélke tabellen je wilt hebben en nu gewoon alles (*).

Ik weet niet wat er nog meer in $_POST['dienst'] zit, maar als dit jouw checkbox is dan bestaat deze niet zodra deze is uit gevinkt als zal je code dus worden overslagen, controleer hier dus op.
Michael - op 29/04/2014 15:30:12

Als je nu bezig bent om dit te gaan realiseren zou ik je aanraden om het wel gelijk op een goede manier te doen. De mysql_* functies die je nu gebruikt zijn 'deprecated' en zullen op termijn verdwijnen. Na een server update zullen deze waarschijnlijk al meldingen gaan geven. Kijk eens naar mysqli of PDO.
Zorg voor je query's voor een goede afhandeling en dus geen die().
Je script is ook zo lek als een mandje. Alles wat binnen komt via de gebruiker (GET, POST) dien je te controleren of door een daarvoor bedoelde functie als htmlentities/htmlspecialchars/real_escape_string o.i.d. te halen.
Geef in je select altijd op wélke tabellen je wilt hebben en nu gewoon alles (*).

Ik weet niet wat er nog meer in $_POST['dienst'] zit, maar als dit jouw checkbox is dan bestaat deze niet zodra deze is uit gevinkt als zal je code dus worden overslagen, controleer hier dus op.


De $_GET functies etc worden wel gecontroleerd en de portal die ik aan het bouwen ben is alleen bereikbaar voor medewerkers van dit bedrijf, dus ik ben ook niet echt bang voor vreemde injecties etc.

Ook wordt er gecontroleerd of $_POST['dienst'] leeg is of niet, dat is in de code te zien:

if(!empty($_POST['dienst'])){
....
} else {
....
}


Het gaat er nu dus om dat het kan zijn dat 1 dienst wel en de andere niet is geselecteerd (die hiervoor wel geselecteerd was).
Deze moet dus een bewerking in de database krijgen.
Nee Cris, if(!empty($_POST['dienst'])){ controleert of er 1 of meer velden zijn aangevinkt. Maar jouw voorbeeld dat als allebei de velden leeg zijn (niet aangevinkt), levert als resultaat dat de if statement niet wordt uitgevoerd.
Davey Mat op 29/04/2014 15:42:52

Nee Cris, if(!empty($_POST['dienst'])){ controleert of er 1 of meer velden zijn aangevinkt. Maar jouw voorbeeld dat als allebei de velden leeg zijn (niet aangevinkt), levert als resultaat dat de if statement niet wordt uitgevoerd.


Dat is het hem dus juist, hij checkt of de velden zijn ingevoerd en als dat niet zo is dan gaat hij naar de } else { $users->set_diensten_inactive($_GET['id']); }

Dit werkt gewoon prima, als ik geeneen van de checkboxen heb aangevinkt terwijl deze hiervoor wel aangevinkt waren, worden ze netjes aangepast in de database, gewoon zoals ik het wil hebben.

Maar als ik nu 2 checkboxen aanzet en opsla, komen ze netjes allebei in de database te staan.
Als ik daarna 1 van de 2 uitzet, dan hoort die in de database aangepast te worden zodat die dienst niet meer actief is, en dat is dus wat niet gebeurt.
Waar ik het nu dus over heb hoort gewoon tussen de

if(!empty($_POST['dienst'])){

}

thuis aangezien er 1 of meerdere diensten WEL aangevinkt zijn.
> de portal die ik aan het bouwen ben is alleen bereikbaar voor medewerkers van dit bedrijf, dus ik ben ook niet echt bang voor vreemde injecties etc.

Vreemde opmerking. Heb je zoveel vertrouwen in je medewerkers dat je verwacht dat het altijd goed gaat?
Of het project nou voor jezelf is, intern of extern, leer jezelf aan om user input altijd te controleren.

> Ook wordt er gecontroleerd of $_POST['dienst'] leeg is of niet, dat is in de code te zien:

Ja dat klopt, maar je controleert hiermee alle checkbox'en. Als er geen is aangevinkt krijg je de else statement, en als er minimaal 1 is aangevinkt krijg je de if statement met update query.
I.m.o. kun je beter elke checkbox een eigen naam geven en controleren of deze wel of niet is aangevinkt.

[size=xsmall]Toevoeging op 29/04/2014 15:59:09:[/size]

Dit zou wel moeten werken


<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {

if(isset($_POST['dienst'])) {
	foreach($_POST['dienst'] AS $key=>$val) {
		echo 'UPDATE user_diensten SET active=0 WHERE dienst_id='.(int)$key;
		
		echo '<br/>';
	}
} else {
	echo 'UPDATE user_diensten SET active=0';
}

}
?>
<form method="POST">

<input type="checkbox" name="dienst[1]" />
<input type="checkbox" name="dienst[2]" />
<input type="checkbox" name="dienst[3]" />
<input type="checkbox" name="dienst[4]" />
<input type="checkbox" name="dienst[5]" />

<button>Test</button>

</form>
Michael - op 29/04/2014 15:53:28

> de portal die ik aan het bouwen ben is alleen bereikbaar voor medewerkers van dit bedrijf, dus ik ben ook niet echt bang voor vreemde injecties etc.

Vreemde opmerking. Heb je zoveel vertrouwen in je medewerkers dat je verwacht dat het altijd goed gaat?
Of het project nou voor jezelf is, intern of extern, leer jezelf aan om user input altijd te controleren.

> Ook wordt er gecontroleerd of $_POST['dienst'] leeg is of niet, dat is in de code te zien:

Ja dat klopt, maar je controleert hiermee alle checkbox'en. Als er geen is aangevinkt krijg je de else statement, en als er minimaal 1 is aangevinkt krijg je de if statement met update query.
I.m.o. kun je beter elke checkbox een eigen naam geven en controleren of deze wel of niet is aangevinkt.


De checkboxen een eigen naam geven is helaas geen optie, anders had ik dit allang gedaan :)

Inderdaad, als er minimaal 1 is aangevinkt krijg je de update query, maar deze wordt dus niet uitgevoerd.
Ben het met beide punten van Micheal - eens. Dus voor de diensten zoiets als:
<input type="checkbox" name="option1" value="1"> 1
<input type="checkbox" name="option2" value="2"> 2




[size=xsmall]Toevoeging op 29/04/2014 16:02:15:[/size]

Waarom is checkboxen een eigen naam geven geen optie?
Davey Mat op 29/04/2014 16:01:44

Ben het met beide punten van Micheal - eens. Dus voor de diensten zoiets als:
<input type="checkbox" name="option1" value="1"> 1
<input type="checkbox" name="option2" value="2"> 2




[size=xsmall]Toevoeging op 29/04/2014 16:02:15:[/size]

Waarom is checkboxen een eigen naam geven geen optie?


Omdat de checkboxen dynamisch uit een database komen (de diensten die worden toegevoegd via de portal moeten dan beschikbaar voor klanten zijn).
Als ik de checkboxen een eigen naam zou geven zou dit betekenen dat elke keer dat er een dienst toegevoegd of verwijderd wordt, er dus een stukje code bij/af moet.

[size=xsmall]Toevoeging op 29/04/2014 16:11:45:[/size]

Michael - op 29/04/2014 15:53:28



[size=xsmall]Toevoeging op 29/04/2014 15:59:09:[/size]

Dit zou wel moeten werken


<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {

if(isset($_POST['dienst'])) {
	foreach($_POST['dienst'] AS $key=>$val) {
		echo 'UPDATE user_diensten SET active=0 WHERE dienst_id='.(int)$key;
		
		echo '<br/>';
	}
} else {
	echo 'UPDATE user_diensten SET active=0';
}

}
?>
<form method="POST">

<input type="checkbox" name="dienst[1]" />
<input type="checkbox" name="dienst[2]" />
<input type="checkbox" name="dienst[3]" />
<input type="checkbox" name="dienst[4]" />
<input type="checkbox" name="dienst[5]" />

<button>Test</button>

</form>



De code hierboven is helaas niet de oplossing, deze geeft namelijk de checkbox die WEL is aangevinkt active=0 mee, terwijl degene die niet is aangevinkt dit juist moet krijgen.
Geef het de name van de dienst.

Reageren