Diensten voor klanten bewerken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Cris Kolkman

Cris Kolkman

29/04/2014 15:23:07
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
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!!
 
PHP hulp

PHP hulp

23/12/2024 02:41:31
 
Davey Mat

Davey Mat

29/04/2014 15:28:44
Quote Anchor link
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.
 
Michael -

Michael -

29/04/2014 15:30:12
Quote Anchor link
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.
 
Cris Kolkman

Cris Kolkman

29/04/2014 15:37:01
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
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.
 
Davey Mat

Davey Mat

29/04/2014 15:42:52
Quote Anchor link
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.
 
Cris Kolkman

Cris Kolkman

29/04/2014 15:50:03
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if(!empty($_POST['dienst'])){

}

thuis aangezien er 1 of meerdere diensten WEL aangevinkt zijn.
 
Michael -

Michael -

29/04/2014 15:53:28
Quote Anchor link
> 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.

Toevoeging op 29/04/2014 15:59:09:

Dit zou wel moeten werken

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
<?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>
 
Cris Kolkman

Cris Kolkman

29/04/2014 16:00:08
Quote Anchor link
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.
 
Davey Mat

Davey Mat

29/04/2014 16:01:44
Quote Anchor link
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




Toevoeging op 29/04/2014 16:02:15:

Waarom is checkboxen een eigen naam geven geen optie?
 
Cris Kolkman

Cris Kolkman

29/04/2014 16:06:45
Quote Anchor link
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




Toevoeging op 29/04/2014 16:02:15:

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.

Toevoeging op 29/04/2014 16:11:45:

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


Toevoeging op 29/04/2014 15:59:09:

Dit zou wel moeten werken

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
<?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.
 
- SanThe -

- SanThe -

29/04/2014 16:12:22
Quote Anchor link
Geef het de name van de dienst.
 
Davey Mat

Davey Mat

29/04/2014 16:13:17
Quote Anchor link
Is toch met php en de database mogelijk?
Als er een nieuwe dienst bij komt sla je die naam in de database op met daarnaast bijvoorbeeld op de hoeveelste plaats deze getoond moet worden.
Daarnaast begrijp ik het niet meer helemaal. Je zei net dat het om een intern systeem gaat, maar nu komen er klanten bij kijken?

Wat voor informatie staat er trouwens over de checkboxen in de database?
TOEVOEGING:

JE kunt in het stukje van Micheal - toch zelf met een query per selectbox de value erin zetten? Iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="checkbox" name="dienst[1]" value="<?php echo $row['value']; ?>"/>
Gewijzigd op 29/04/2014 16:17:13 door Davey Mat
 
Cris Kolkman

Cris Kolkman

29/04/2014 16:17:35
Quote Anchor link
Davey Mat op 29/04/2014 16:13:17:
Is toch met php en de database mogelijk?
Als er een nieuwe dienst bij komt sla je die naam in de database op met daarnaast bijvoorbeeld op de hoeveelste plaats deze getoond moet worden.
Daarnaast begrijp ik het niet meer helemaal. Je zei net dat het om een intern systeem gaat, maar nu komen er klanten bij kijken?

Wat voor informatie staat er trouwens over de checkboxen in de database?


Wij kunnen deze diensten koppelen aan klanten, aan de records zit ook een begin- en einddatum gekoppeld voor de facturatie, maar het is niet zo dat klanten kunnen inloggen op deze portal.

De opbouw van de checkboxen in de database is niet heel erg relevant voor dit probleem, maar ziet er als volgt uit:

id (auto incr., primary)
naam (van de dienst)
prijs (van de dienst)
deleted (dienst actief ja of nee)
deletedBy (door wie is de dienst inactief gezet)
 
- SanThe -

- SanThe -

29/04/2014 16:20:43
Quote Anchor link
Gebruik gewoon name="dienst[en_hier_het_id]" dan weet je precies over welke dienst het gaat.
 
Michael -

Michael -

29/04/2014 16:20:52
Quote Anchor link
> deze geeft namelijk de checkbox die WEL is aangevinkt active=0 mee
Foutje :) De eerste 0 (regel 6) moet dus 1 zijn, maar dan heb je in principe het zelfde als je nu hebt. Wat niet geset is zou je dan alsnog eerst op 0 moeten zetten.

Dus je zou voordat je controleert welke checkbox'en gecheckt zijn, alles op 0 kunnen zetten en dan die wél gecheckt zijn weer op 1 zetten. Een mooie oplossing is het niet.

Edit: Ah, dan kun je dus alsnog de naam of id uit de database meesturen en controle of deze dan is geset of niet.
Gewijzigd op 29/04/2014 16:21:56 door Michael -
 
Davey Mat

Davey Mat

29/04/2014 16:23:13
Quote Anchor link
Wat weerhoud je dan om het op de manier van Micheal - te doen +
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="checkbox" name="dienst[1]" value="<?php echo $row['value']; ?>"/>
 
Cris Kolkman

Cris Kolkman

29/04/2014 16:25:57
Quote Anchor link
Michael - op 29/04/2014 16:20:52:
> deze geeft namelijk de checkbox die WEL is aangevinkt active=0 mee
Foutje :) De eerste 0 (regel 6) moet dus 1 zijn, maar dan heb je in principe het zelfde als je nu hebt. Wat niet geset is zou je dan alsnog eerst op 0 moeten zetten.

Dus je zou voordat je controleert welke checkbox'en gecheckt zijn, alles op 0 kunnen zetten en dan die wél gecheckt zijn weer op 1 zetten. Een mooie oplossing is het niet.

Edit: Ah, dan kun je dus alsnog de naam of id uit de database meesturen en controle of deze dan is geset of niet.


Ik heb er inderdaad ook al aan gedacht om alles op 0 te zetten en dan degene die geset zijn op 1 te zetten, maar dan komt het volgende probleem:
De diensten die eerst op 1 stonden en nu op 0 moeten, moeten een einddatum meekrijgen, deze einddatum mag absoluut niet met de diensten die gewoon op 1 moeten blijven staan meegegeven worden.

Toevoeging op 29/04/2014 16:27:31:

Davey Mat op 29/04/2014 16:23:13:
Wat weerhoud je dan om het op de manier van Micheal - te doen +
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="checkbox" name="dienst[1]" value="<?php echo $row['value']; ?>"/>


Davey, hij krijgt sowieso al een waarde mee:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="checkbox" value="'.$check_diensten['dienst'].'" id="check_'.$check_diensten['dienst'].'" name="dienst[]" />
 
Michael -

Michael -

29/04/2014 16:31:18
Quote Anchor link
Die waarde kun je dan beter als 'key' gebruiken zodat je weet welke je verwacht.

name="dienst[' . $check_diensten['dienst'] . ']"

Maak een array met alle diensten uit de database, en controleer in een foreach welke wel en niet geset zijn.
 
Cris Kolkman

Cris Kolkman

29/04/2014 16:41:37
Quote Anchor link
Michael - op 29/04/2014 16:31:18:
Die waarde kun je dan beter als 'key' gebruiken zodat je weet welke je verwacht.

name="dienst[' . $check_diensten['dienst'] . ']"

Maak een array met alle diensten uit de database, en controleer in een foreach welke wel en niet geset zijn.


Als ik dit zou doen werkt foreach($_POST['dienst'] AS $key=>$dienstupdate){ toch niet meer?

Toevoeging op 29/04/2014 16:47:36:

Michael - op 29/04/2014 16:31:18:
Die waarde kun je dan beter als 'key' gebruiken zodat je weet welke je verwacht.

name="dienst[' . $check_diensten['dienst'] . ']"

Maak een array met alle diensten uit de database, en controleer in een foreach welke wel en niet geset zijn.


En bedoel je dan zoiets?:

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
<?php
    class users{
        public function check_diensten(){
            $query = mysql_query("SELECT * FROM diensten WHERE deleted=0") or die(mysql_error());
            while($rd = mysql_fetch_assoc($query)){
                $result[] = $rd;
            }

            return $result;
        }
    }

    
    $check_diensten = $users->check_diensten();
    foreach($_POST['dienst'] AS $key=>$dienstupdate){
        foreach($check_diensten AS $key=>$diensten){
            if(isset($dienstupdate[''.$diensten['id'].''])){
                //Hier een update query...?
            }
        }
    }

?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/04/2014 17:36:07
Quote Anchor link
Dat kan gewoon in één update query:
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
<?php

$sql
= "UPDATE diensten SET
    deleted = 1,
    deletedBy = 'Cris',
    end_date = CURRENT_DATE
WHERE
    customer_id = 678
    AND
    deleted = 0"
;
/* Als er iets is aangevinkt extra where clause */
if (isset($_POST['diensten']) {
    $sql .= "
    AND
    dienst_id NOT IN ("
. implode(',', $_POST['diensten']) . ")";
?>

Je moet dan wel de id's van de diensten als value van de checkbox geven.
Gewijzigd op 29/04/2014 17:36:54 door Ger van Steenderen
 



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.