Rijen tellen uit een script en verwerken met SQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tim Klein

Tim Klein

13/05/2018 17:54:10
Quote Anchor link
Goeden middag collegadevelopers,

Voor mijn systeem m.b.t. urenregistratie ben ik een variabel aantal rijen aan het creëren. Nu wil ik deze rijen (in variërend aantal) dus wegschrijven in een SQL-database m.b.v. een post-form.

Om de rijen te creeëren gebruik ik de volgende code (script gevonden elders op internet):
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
<form method="post">
    <table id="myTable">
        <tr>
            <td><input type="text" name="links"></td>
            <td><input type="text" name="keywords"></td>
            <td><input type="text" name="violationtype"></td>
        </tr>
    </table>
    <input type="button" class="button" value="Add another line" onclick="addField();">
    <script>
        function addField (argument) {
            var myTable = document.getElementById("myTable");
            var currentIndex = myTable.rows.length;
            var currentRow = myTable.insertRow(-1);

            var linksBox = document.createElement("input");
            linksBox.setAttribute("name", "links" + currentIndex);

            var keywordsBox = document.createElement("input");
            keywordsBox.setAttribute("name", "keywords" + currentIndex);

            var violationsBox = document.createElement("input");
            violationsBox.setAttribute("name", "violationtype" + currentIndex);

            var addRowBox = document.createElement("input");
            addRowBox.setAttribute("type", "button");
            addRowBox.setAttribute("value", "Add another line");
            addRowBox.setAttribute("onclick", "addField();");
            addRowBox.setAttribute("class", "button");

            var currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(linksBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(keywordsBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(violationsBox);
        }
    </script>
</form>


Zou iemand mij kunnen helpen met het maken van het PHP-stukje? alvast bedankt!

Tim
 
PHP hulp

PHP hulp

05/11/2024 22:22:10
 
- Ariën  -
Beheerder

- Ariën -

13/05/2018 18:23:00
Quote Anchor link
Waar loop je precies op vast? Er is genoeg te vinden op internet over het opslaan van data in MySQL.
 
Tim Klein

Tim Klein

13/05/2018 18:24:56
Quote Anchor link
Hoi Ariën! Ik had inderdaad iets duidelijker moeten zijn. Nu weet ik hoe ik een, twee of drie gegevens weg kan schrijven m.b.v. een SQL naar een database. Echter, ik zou niet weten hoe ik dit moet doen bij een variabel aantal rijen!

Voor mijn resultaat van de rijen toevoegen, zie http://wrbloods.000webhostapp.com/addrows.php.

Tim
 
- Ariën  -
Beheerder

- Ariën -

13/05/2018 18:32:30
Quote Anchor link
Ikzelf raad aan om de velden als array te genereren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<tr>
    <td><input name="item[3]['name']"></td>
    <td><input name="item[3]['timeIn']"></td>
    <td><input name="item[3]['timeOut']"></td>
</tr>

Dan is het na afloop een kwestie van het doorlopen van een array met foreach.
print_r() zal een goede hulp hierbij zijn.
Gewijzigd op 13/05/2018 18:42:52 door - Ariën -
 
Tim Klein

Tim Klein

13/05/2018 18:34:45
Quote Anchor link
Hoi Ariën! Helaas heb ik nog niet veel kaas gegeten van arrays, en ik zou ook niet weten hoe ik dit toe kan passen in mijn code. Zou jij mij hierbij willen helpen? Alvast bedankt voor je (vorige), snelle antwoorden!

Tim
 
- Ariën  -
Beheerder

- Ariën -

13/05/2018 18:45:30
Quote Anchor link
Zorg er eens eens voor dat je de HTML-code opbouw volgens deze manier, waarbij de '3' natuurlijk steeds het variabele oplopende nummer is.

Dan moet je vervolgens $_POST['item'] (heb mijn vorige post even bijgewerkt) gebruiken in je foreach, waarmee je steeds elke rij doorloopt.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/05/2018 19:09:56
Quote Anchor link
sidenote: Waarom niet gewoon item[]... zodat je ook rijen kunt toevoegen/weghalen. Het forceren van een volgnummer bij het toevoegen van rijen lijkt mij niet echt nodig?

Het wordt een ander verhaal als je reeds opgeslagen items wilt aanpassen (voordat je deze vergrendelt, wat mij ook wel handig lijkt als de uren gefactureerd worden / definitief worden gemaakt) - dan zet je tussen de rechte haken het id van het logboek-record zodat je weet wat er vervolgens bijgewerkt dient te worden.

Enne, "nog niet veel kaas gegeten van arrays", dan wordt dat hoog tijd als je je al met geavanceerdere zaken als databases/dynamische formulieren bezighoudt.
 
Tim Klein

Tim Klein

13/05/2018 19:27:47
Quote Anchor link
Hoi allemaal; bedankt voor jullie snelle reacties!

Ik ben bang dat ik het probleem niet helemaal goed heb uitgelegd :(
Ik ben bezig om de aanwezigheidsadministratie bij te houden. Ik voer daarom één keer de datum in, waarna ik bij iedere rij uit mijn tabel de gegevens in één keer weg wij schrijven in een SQL-tabel. Iedere rij in mijn tabel wordt dus ook een unieke rij/record in de SQL tabel, voorzien van de gebruikersnaam, datum en de aankomst/vertrektijd.

Omdat het aantal mensen niet altijd het zelfde is (soms 1, op een drukke dag 35), lijkt het mij handig om een aantal rijen toe te kunnen voegen in mijn tabel, voor iedere aanwezige 1 dus.

Nu weet ik dat ik dit kan doen met een "foreach" als ik me niet vergis, waarin ik bij iedere tabelrij een nieuwe SQL uitvoer (wanneer ik op een "save" button druk. Dit lijkt voor mij het makkelijkst.

Nu loop ik vast bij de brug van het "toevoegen van rijen" naar het creëren van een SQL voor iedere rij. Nu kan ik zoals Ariën hiervoor al aangaf een array gebruiken, maar ik snap niet helemaal wat hij bedoelt. Welke tutorial/voorbeeld kan ik hier het best voor gebruiken?

Nogmaals, hartelijk dank voor jullie reacties.

Tim
 
- Ariën  -
Beheerder

- Ariën -

13/05/2018 19:39:29
Quote Anchor link
Laten we stapje voor stapje werken, zodat je de kennis gaat begrijpen in plaats van dat je teveel hooi op je vork neemt, en door de array's de bomen niet meer ziet.

Zorg er eerst voor dat je jouw Javascript hebt aangepast zodat de browser de HTML verwerkt tot dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<tr>
    <td><input name="item[]['name']"></td>
    <td><input name="item[]['timeIn']"></td>
    <td><input name="item[]['timeOut']"></td>
</tr>


@Thomas: Thnx! Dat werkt inderdaad makkelijker.

Zorg er dan voor dat je dit gebruikt, na de controle of je formulier ge-POST'ed is.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<pre>".print_r($_POST['item'],true)."</pre>";
?>

Vervolgens zie je een 'boom' van een gestructureerde array met daarin alles wat je verstuurd hebt. Dit heet een multi-dimensionale array.
Gewijzigd op 13/05/2018 19:42:04 door - Ariën -
 
Tim Klein

Tim Klein

13/05/2018 19:55:50
Quote Anchor link
Oké, ik denk dat ik dit nu heb toegepast. Afgaande op jullie beide verhalen, heb ik mijn code aangepast. Dit resulteert in de volgende 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
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
<form method="post">
    <table id="myTable">
        <tr>
            <td><input name="item[]['name']"></td>
            <td><input name="item[]['timeIn']"></td>
            <td><input name="item[]['timeOut']"></td>
        </tr>
    </table>
    <input type="button" class="button" value="Add another line" onclick="addField();">
    <script>
        function addField (argument) {
            var myTable = document.getElementById("myTable");
            var currentIndex = myTable.rows.length;
            var currentRow = myTable.insertRow(-1);

            var linksBox = document.createElement("input");
            linksBox.setAttribute("name", "item[]['name']");

            var keywordsBox = document.createElement("input");
            keywordsBox.setAttribute("name", "item[]['timeIn']");

            var violationsBox = document.createElement("input");
            violationsBox.setAttribute("name", "item[]['timeOut']");

            var addRowBox = document.createElement("input");
            addRowBox.setAttribute("type", "button");
            addRowBox.setAttribute("value", "Add another line");
            addRowBox.setAttribute("onclick", "addField();");
            addRowBox.setAttribute("class", "button");

            var currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(linksBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(keywordsBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(violationsBox);
        }
        
    </script>
</form>


Voor het resultaat hiervan, zie http://wrbloods.000webhostapp.com/addrows.php

Hoe ga ik nu verder?

@Arien, hartstikke bedankt voor het stap-voor-stap begeleiden!

Tim
Gewijzigd op 13/05/2018 20:01:08 door Tim Klein
 
- Ariën  -
Beheerder

- Ariën -

13/05/2018 20:49:54
Quote Anchor link
Dankje :-)
Zorg er eerst maar voor dat je het formulier kan versturen via POST met en submit-knop.
Gewijzigd op 13/05/2018 20:57:17 door - Ariën -
 
Adoptive Solution

Adoptive Solution

13/05/2018 21:19:03
Quote Anchor link
Hoe nu verder?

4,5 jaar geleden wilde je ook iets op de server zetten. Is het toen gelukt?

https://www.phphulp.nl/php/forum/topic/registratie-werkt-niet/93413/#669451
 
Jan te Pas

Jan te Pas

14/05/2018 08:47:33
Quote Anchor link
Volgens mij moet je eerst nadenken over jouw model en opbouw. Je hebt een invoer. Een opslag en een raadpleeg fase.

Het invoeren, welke waarden wil jij vastleggen, wie geef je toegang. Welke controles wil je gebruiken om de invoer te controleren. Zit er een login voor. Kunnen, mogen gebruikers gegevens dubbel invullen? Daar moet je over nadenken
.
Het verwerken, opslag, hier worden de data naar de database geschreven. Hier worden de gegevens uit het invoerscherm in de database gezet.

Het raadplegen kan door een kalender of week te kiezen, en dan vervolgens een selectie uit de database te presenteren, uiteraard oplopend.

Je moet dus eerst nadenken, wat heb ik straks nodig. En of er nu 40 of 100 medewerkers iets ingevoerd hebben, dat maakt voor de database niet uit. Die slaat dat keurig op. Maak eens een stroomschema, wat jij per fase wilt doen, wat aan invoer, wat aan uitvoer.

Succes
 
Tim Klein

Tim Klein

14/05/2018 09:50:55
Quote Anchor link
Goede morgen! Ik jullie tips tot mij genomen en ben eruit gekomen!

Ik heb de volgende 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
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
<form method="post">
    <input type="submit" name="Submit">
    <table id="myTable">
        <tr>
            <td><input name="name[]"></td>
            <td><input name="timeIn[]" class="time"></td>
            <td><input name="timeOut[]" class="time"></td>
        </tr>
    </table>
    <input type="button" class="button" value="Add another line" onclick="addField();">
    <script>
        function addField (argument) {
            var myTable = document.getElementById("myTable");
            var currentIndex = myTable.rows.length;
            var currentRow = myTable.insertRow(-1);

            var linksBox = document.createElement("input");
            linksBox.setAttribute("name", "name[]");

            var keywordsBox = document.createElement("input");
            keywordsBox.setAttribute("name", "timeIn[]",);
            keywordsBox.setAttribute("class", "time",);

            var violationsBox = document.createElement("input");
            violationsBox.setAttribute("name", "timeOut[]");
            violationsBox.setAttribute("class", "time");

            var addRowBox = document.createElement("input");
            addRowBox.setAttribute("type", "button");
            addRowBox.setAttribute("value", "Add another line");
            addRowBox.setAttribute("onclick", "addField();");
            addRowBox.setAttribute("class", "button");

            var currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(linksBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(keywordsBox);

            currentCell = currentRow.insertCell(-1);
            currentCell.appendChild(violationsBox);
            
            var time = document.getElementsByClassName('time'); //Get all elements with class "time"
for (var i = 0; i < time.length; i++) { //Loop trough elements
    time[i].addEventListener('keyup', function (e) {; //Add event listener to every element
        var reg = /[0-9]/;
        if (this.value.length == 2 && reg.test(this.value)) this.value = this.value + ":"; //Add colon if string length > 2 and string is a number
        if (this.value.length > 5) this.value = this.value.substr(0, this.value.length - 1); //Delete the last digit if string length > 5
    });
};
        }
    </script>
    <?php
    if(isset($_POST['Submit'])){
        $name = $_POST['name'];
        $timeIn = $_POST['timeIn'];
        $timeOut = $_POST['timeOut'];
        
        foreach( $name as $key => $n ) {
            if(!empty($name[$key]) && !empty($timeIn[$key]) && !empty($timeOut[$key])){
                mysqli_query($con, "INSERT INTO `AddRows`(`Name`, `timeIn`, `timeOut`) VALUES ('$name[$key]','$timeIn[$key]','$timeOut[$key]')");
            }
        }
    }

    ?>

</form>


Hiermee schrijf ik he succesvol naar de database! Ik weet niet of dit de netste oplossing is, maar het werkt :)

Groetjes
Tim
 



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.