Sla meerdere forms in een keer op

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bryan De Baar

Bryan De Baar

08/03/2020 13:18:04
Quote Anchor link
Hallo,


Ik ben opzoek naar wat hulp voor het volgende. In mijn backoffice heb ik een pagina gemaakt om de openingstijden te beheren.
Hiervoor heb ik het volgende gemaakt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<form>
    <div class="groupdays">
        <label>maandag</label>
        <input name="mondaystart"/>
        <input name="mondayend"/>
    </div>
    <div class="groupdays">
        <label>dinsdag</label>
        <input name="tuesdaystart"/>
        <input name="tuesdayend"/>
    </div>

enz. enz.

Hier vul je de starttijd en de eindtijd in.

Deze dagen wil ik in een batch opslaan in de database via ajax.

Wat zijn hier de mogelijkheden voor? Ik heb al een beetje gegoogled maar heb nog niets bruikbaars gevonden.

Toevoeging:
Voor elke dag wil ik een record in de database
ID-DAY-START-END
1-Maandag-09:00-18:00
2-Dinsdag-09:00-18:00
Gewijzigd op 08/03/2020 13:32:33 door Bryan De Baar
 
PHP hulp

PHP hulp

23/11/2020 23:20:43
 
- Ariën -
Beheerder

- Ariën -

08/03/2020 13:24:54
Quote Anchor link
Waarop heb je dan gezocht? Want de basis van AJAX, welke overal wel uitgelegd wordt, kan je hier prima op toepassen.
 
Bryan De Baar

Bryan De Baar

08/03/2020 13:34:57
Quote Anchor link
Ik heb de vraag iets uitgebreid. Ik was vergeten te zeggen dat ik voor elke dag een nieuwe record wil.
Het opslaan via AJAX als 1 record snap ik. Moet ik dan een each gebruiken en de AJAX herhalen of doe ik alles in een keer weg en laat PHP een splitsing tussen de dagen maken?
 
- Ariën -
Beheerder

- Ariën -

08/03/2020 13:45:20
Quote Anchor link
Waarom doe je in name niet dit:
openingstijden['monday']['begin']
openingstijden['monday']['end']

Dan kan je makkelijker foreachen in je PHP.

Vergeet geen .serialize() toe te passen in je AJAX-request (jQuery in dit geval).
Gewijzigd op 08/03/2020 13:51:47 door - Ariën -
 
Bryan De Baar

Bryan De Baar

08/03/2020 15:19:51
Quote Anchor link
Ariën,

Ik heb het inderdaad zo gedaan zoals je zij en heb tot nu toe dit:

Deze array krijg ik als ik in PHP print_r gebruik
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
Array
(
    ['monday'] => Array
        (
            ['start'] => 09:00
            ['end'] => 18:00
        )

    ['tuesday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

    ['wednesday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

    ['thursday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

    ['friday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

    ['saturday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

    ['sunday'] => Array
        (
            ['start'] =>
            ['end'] =>
        )

)


Om de data te doorlopen heb ik een foreach gemaakt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$data
= $_GET['hours'];
foreach($data as $days => $times){
    foreach($times as $time){
        echo $days;
        echo $time;
    }
}

?>


Dit krijg ik als resultaat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
'monday'09:00'monday'18:00'
tuesday''tuesday''
wednesday''wednesday''
thursday''thursday''
friday''friday''
saturday''saturday''
sunday''sunday'


Nu wil de start en end los koppelen zodat ik beide kan gebruiken waar ik wil en dacht dat te kunnen doen met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$data
= $_GET['hours'];
foreach($data as $days => $times){
    foreach($times as $time){
        echo $days;
        echo $time['start'];
        echo $time['end'];
    }
}

?>


Maar krijg niet het gewenste resultaat en krijg dan 0 en 1 terug
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'monday'0'monday'1
Gewijzigd op 08/03/2020 15:20:26 door Bryan De Baar
 
Jan R

Jan R

08/03/2020 18:23:31
Quote Anchor link
gewoon zo?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
echo $times['start'];
echo $times['end'];
 
Bryan De Baar

Bryan De Baar

08/03/2020 20:46:36
Quote Anchor link
@jan r,


Heb ik ook geprobeerd, maar ook die werkt niet.
Ik wil de dag en de tijden apart zodat ik die in een query kan gebruiken om in de database op te slaan.
 
- Ariën -
Beheerder

- Ariën -

08/03/2020 20:49:02
Quote Anchor link
Je kan op die plek van die echo toch die waardes INSERT'en?
 
Bryan De Baar

Bryan De Baar

08/03/2020 21:26:07
Quote Anchor link
Dat is uit eindelijk de bedoeling. Maar als ik een lege echo heb dan is er ok niets te inserten.
Daarom wil ik eerst de loops testen
 
- Ariën -
Beheerder

- Ariën -

08/03/2020 21:28:45
Quote Anchor link
Gooi eens $times en $time in een print_r() ?
 
Bryan De Baar

Bryan De Baar

08/03/2020 22:15:18
Quote Anchor link
$times
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'start''end''start''end''start''end''start''end''start''end''start''end''start''end'


$time
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
09:0018:00
 
- Ariën -
Beheerder

- Ariën -

08/03/2020 22:22:41
Quote Anchor link
In $time staat toch de tijd?
Gooi die in een INSERT-query?
Gewijzigd op 08/03/2020 22:23:01 door - Ariën -
 
Bryan De Baar

Bryan De Baar

09/03/2020 00:21:14
Quote Anchor link
Hi Ariën,


Dat klopt maar dat is zowel de start als de eindtijd.
Ik wil ze apart hebben zodat ik deze in aparte kolommen kan zetten.
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2020 00:30:52
Quote Anchor link
Ik ben hier niet altijd een voorstander van, maar je zou je formulier wat compacter kunnen opzetten door wat naamgeving in te korten. Zo zou je alles in een "days" array kunnen stoppen. Vervolgens zou je de codering van de date() functie kunnen gebruiken voor de dag van de week (0 = zondag, 6 = zaterdag). Vervolgens zou je op index 0 de openingstijd kunnen zetten, en op index 1 de sluitingstijd. Dan moet je er ook zorg voor dragen dat als je een openingstijd invult, dat je een ook een sluitingstijd invult, maar dat soort logica kun je ook in de validatie stoppen ofzo, of je maakt hiervoor een aparte "closed" checkbox oid.

Vervolgens kun je de afhandeling vereenvoudigen door door de eerdergenoemde "days" heen te loopen.

Bijvoorbeeld als volgt:
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
<?php
// https://www.phphulp.nl/php/forum/topic/sla-meerdere-forms-in-een-keer-op/103370
function escape($in) {
    return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}

function
dump($in) {
    if (is_array($in)) {
        $in = print_r($in, true);
    }

    echo '<pre>'.escape($in).'</pre>';
}

?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>

<body>
<form action="" method="POST">
<?php
$dayNames
= array(0 => 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
$firstDay = 1; // start on monday
for ($i=0; $i<7; $i++) { // edit: aanpassing
    $weekDay = ($i + $firstDay) % 7; // edit: aanpassing
    echo escape($dayNames[$weekDay]); ?>
: <input type="text" name="days[<?php echo escape($weekDay); ?>][]"> - <input type="text" name="days[<?php echo escape($weekDay); ?>][]"><br><?php
}
?>

<button type="submit">go</button>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    dump($_POST);
}

?>

</body>
</html>


Een uitdraai van $_POST wordt dan bijvoorbeeld:
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
Array
(
    [days] => Array
        (
            [1] => Array
                (
                    [0] => 09:00
                    [1] => 17:00
                )

            [2] => Array
                (
                    [0] => 09:00
                    [1] => 17:00
                )

            [3] => Array
                (
                    [0] => 09:00
                    [1] => 17:00
                )

            [4] => Array
                (
                    [0] => 09:00
                    [1] => 17:00
                )

            [5] => Array
                (
                    [0] => 09:00
                    [1] => 17:00
                )

            [6] => Array
                (
                    [0] => 09:00
                    [1] => 16:00
                )

            [0] => Array
                (
                    [0] =>
                    [1] =>
                )

        )

)


De rest lijkt mij redelijk voor de hand liggend en de omzetting naar een AJAX-variant is een technische abstractie, de aanpak blijft hetzelfde.

Dit is trouwens de tegenhanger van een eerder topic wat je hierover geopend had, inmiddels al weer uit 2018?

Op het moment dat je wat structuur in deze data aanbrengt wordt alles meestal stukken eenvoudiger.
Gewijzigd op 09/03/2020 15:49:35 door Thomas van den Heuvel
 
Jan R

Jan R

09/03/2020 07:10:08
Quote Anchor link
Bryan De Baar op 08/03/2020 20:46:36:
@jan r,


Heb ik ook geprobeerd, maar ook die werkt niet.
Ik wil de dag en de tijden apart zodat ik die in een query kan gebruiken om in de database op te slaan.


Ik heb het ook geprobeerd en bij mij werkt het wel:)
 
Jop B

Jop B

09/03/2020 13:30:44
Quote Anchor link
Bryan,

Voor jouw array hoef je maar één foreach te gebruiken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$output
= $_GET['hours'];
foreach($output as $items => $days){
    echo '<div>'.$items.'</div>';
    echo $days['start'];
    echo $days['end'];
}

?>

Dit is ook wat Jan R bedoeld. Waarschijnlijk werkte het bij jou niet omdat je een foreach in een foreach gebruikt.
Gewijzigd op 09/03/2020 13:31:17 door Jop B
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2020 15:50:59
Quote Anchor link
Ik denk dat het voornamelijk zijn doel is om alle informatie die bij elkaar hoort in een enkel record in een enkele stap van een foreach-loop te INSERTen in de database.

Vraag blijft misschien wel: waarom via AJAX en waarom via GET?
Gewijzigd op 09/03/2020 16:09:31 door Thomas van den Heuvel
 



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.