insert meerdere rijen in een keer lukt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Fabian webstars

Fabian webstars

21/08/2015 16:02:35
Quote Anchor link
Hallo,
Ik ben bezig met een overhoringsprogramma. ik ben al best ver, maar ik loop tegen een probleem aan.
Ik probeer meer dan 1 rij een een keer in mijn tabel te inserten, maar alleen de laatste rij wordt ge'insert.
Ik heb al dingen geprobeerd en het lukte een paar keer, maar opeens lukte het niet..
weet iemand hoe ik meerdere rijen kan inserten?
dit is het stukje 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
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {

$woord1 = mysqli_real_escape_string($con, $_POST['woord1']);
$woord2 = mysqli_real_escape_string($con, $_POST['woord2']);



if($sql = "
INSERT INTO overhoring (userid, woord1, woord2, kennis)
VALUES ('"
.$_SESSION['userid']."', '".$woord1."', '".$woord2."', 'nee')
"
) {
$result = mysqli_query($con, $sql);
$gelukt = '<br />gelukt';
echo $gelukt;
}

else {
    echo 'mislukt';
}
}

?>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("#btn1").click(function(){
    $("p").append('<br /><div class="form-group col-md-3"> <input class="form-control" name="woord1" required></div><div class="form-group col-md-3"><input class="form-control" name="woord2" required></div><br /><br />');
    });    
    
    $("#btn2").click(function(){
    $("p").append('<br /><div class="form-group col-md-3"> <input class="form-control" name="woord1" required></div><div class="form-group col-md-3"><input class="form-control" name="woord2" required></div><br /><br />');
    });

});
</script>

</head>
<body>
<div class="header"></div>
<div class="container">


<button id="btn1" class="btn btn-default">woorden toevoegen</button>

<form method="post">

<br /><br />
<div class="form-group col-md-3"> <input class="form-control" name="woord1" required> </div> <div class="form-group col-md-3"><input class="form-control" name="woord2" required></div>
<br /><br />
<p>    </p>
<input type="submit" class="btn btn-default" value="klaar"/>

</form>

groetjes fabian http://web-stars.nl/
 
PHP hulp

PHP hulp

22/11/2024 11:02:54
 
- Ariën  -
Beheerder

- Ariën -

21/08/2015 16:06:43
Quote Anchor link
Je moet wel kijken of je $result gelukt is, niet je string met je SQL-query.
Verder moet je de blokhaken [] achter woord1 en woord2gebruiken in je HTML-code. Dan wordt alles uit dezelfde groep door PHP als een array behandeld.

Deze kan je dan doorlopen met foreach()
Gewijzigd op 21/08/2015 16:09:44 door - Ariën -
 
Fabian webstars

Fabian webstars

21/08/2015 16:31:09
Quote Anchor link
bedankt! :) Hoe werkt dat met een foreach
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 16:31:09
Quote Anchor link
Of je bouwt je SQL-string op en INSERT dan ook echt in 1x (meerdere kolommen):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
INSERT INTO table (col_x, col_y, col_z)
VALUES
(x_1, y_1, z_1),
...
(x_n, y_n, z_n);
 
- Ariën  -
Beheerder

- Ariën -

21/08/2015 16:35:47
Quote Anchor link
Fabian webstars op 21/08/2015 16:31:09:
bedankt! :) Hoe werkt dat met een foreach

In dat geval kan je je $_POST['woord1']-array gewoon uitlezen, en alle waarden opslaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($_POST['woord1'] as $woord1) {
    echo $woord1."<br />";
}

?>
 
Fabian webstars

Fabian webstars

21/08/2015 16:38:30
Quote Anchor link
@thomas, sorry maar ik snap niet wat je daar mee bedoeld ((x_1, y_1, z_1),
...
(x_n, y_n, z_n); )

ik werk nog te veel met basis om die dingen te begrijpen :(

@aar ik zal het proberen en mn code aanpassen.
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 16:53:28
Quote Anchor link
Ik bedoelde daarmee te zeggen dat je meerder VALUES-blokken in één keer kunt inserten.

Als je de volgende invoervelden hebt (zoals Aar aangeeft, met array-haken):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<input type="text" name="woord1[]" /><input type="text" name="woord2[]" />
<input type="text" name="woord1[]" /><input type="text" name="woord2[]" />
<input type="text" name="woord1[]" /><input type="text" name="woord2[]" />


Dan heb je dus effectief drie woord1-woord2 paren.

Je kunt dan twee dingen doen:
1. Voor elke rij een INSERT-query bouwen, dit is waarschijnlijk wat Aar bedoelde

dus zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
// er vanuit gaande dat er evenveel woord1[] als woord2[] velden zijn
foreach ($_POST['woord1'] as $nummer => $woord1) {
    $woord2 = $_POST['woord2'][$nummer];
    // je INSERT query voor de huidige rij
}
?>



of
2. Je bouwt je INSERT statement op, en voert 1 query uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$sql
= 'INSERT INTO (x,y,z) VALUES ';
$values = array();
foreach ($_POST['woord1'] as $nummer => $woord1) {
    $woord2 = $_POST['woord2'][$nummer];
    // $woord1, $woord2, en wat je verder nog in een rij wil stoppen
    $values[] =  "(...,'".$woord1."','".$woord2."',...)";
}

$sql .= implode(',', $values);
// en hier voer je in 1x je query uit
?>


Maar misschien is het beter in jouw geval om de simpele aanpak te kiezen.

Vergeet ook niet je DATA in je query te ontdoen van een mogelijk speciale betekenis in SQL met behulp van een escape-functie.
 
Fabian webstars

Fabian webstars

21/08/2015 17:17:31
Quote Anchor link
waarom de x y z als ik vragen mag
 
- Ariën  -
Beheerder

- Ariën -

21/08/2015 17:21:36
Quote Anchor link
Mogelijk sprake van luiheid of andere verwachtte kennis die de topicstarter wel zou hebben, en een placeholder gebruikt. Aan jouw om het af te maken.

Het had ook a,b,c kunnen zijn of z,y,x...
Gewijzigd op 21/08/2015 17:29:39 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 17:22:12
Quote Anchor link
Om het voorbeeld simpel te houden... Ik ga de code niet helemaal voor je uitschrijven, dan kan ik hier de hele dag wel aan de gang gaan.

EDIT: luiheid? lol.

Ik denk niet dat we de copy-paste mentaliteit op deze manier verder moeten voeden. Of mag ik geen beroep doen op het intellect van de vragensteller?
Gewijzigd op 21/08/2015 17:24:07 door Thomas van den Heuvel
 
Fabian webstars

Fabian webstars

21/08/2015 17:24:38
Quote Anchor link
allang blij met jullie hulp

het lukt trouwens nog steeds niet echt xD maar ik ga blijven proberen en nog wat op internet zoeken! als het dan nog steeds niet lukt. post ik wel waar ik tegen aan loop

Toevoeging op 21/08/2015 17:30:21:

thomas geen zorgen, der is niks met mijn intelligentie. Jammer van je vooroordeel.
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 17:31:15
Quote Anchor link
Eerst moet je begrijpen wat er gebeurt.

Het ontbreken van de arrayhaken in de veldnamen is de reden dat je dus meerdere keren in een formulier dezelfde veldnaam hebt, wat dus resulteert in het overschrijven van andere data... De array-haken zorgen ervoor dat je dezelfde veldnaam kunt hergebruiken voor meerdere velden met dezelfde naam...

Introduceer eens wat velden met van die array-haken.

Dump vervolgens eens $_POST naar je scherm, dan zie je wat er gebeurt.

Dat kun je dan als uitgangspunt nemen om een of meerdere queries te gaan gebruiken.

Het voornaamste probleem in 80 van de 100 vraagstukken die hier voorbij komen is dat mensen niet weten hoe ze overzicht voor zichzelf kunnen creëren, vervolgens niet weten wat er gebeurt, en vervolgens niet weten wat ze moeten doen (en vaak als je hun een oplossing geeft is dit na afloop nog steeds hetzelfde).
 
- Ariën  -
Beheerder

- Ariën -

21/08/2015 17:31:41
Quote Anchor link
@Thomas: Ja, op die manier kan het ook. Niet alle kort geschreven code valt immers onder luiheid ;-)
@Fabian: Let er wel op dat je de query nog uitvoert. Dat doet Thomas niet in de code, maar legt hij wel uit in comment.
 
Fabian webstars

Fabian webstars

21/08/2015 17:37:16
Quote Anchor link
met de array-haken: <input class="form-control" name="woord1[]" required> </div> <div class="form-group col-md-3"><input class="form-control" name="woord2[]" required></div>

ik doe mn best om zo veel mogelijk te leren naast de drukte. ik probeer op oplossingen door te bouwen zodat het gaat werken. ik ben met mijn website met veel dingen bezig. ontzettend veel dingen lukken prima en als het niet lukt en ik voor mijn gevoel er voldoende tijd in heb gestopt met probeersels ga ik naar dit forum. ik kom dus naar dit forum omdat ik geen kennis van bijvoorbeeld arrays heb. ik zal zeker leren wat arrays zijn. alleen heb ik een werkend voorbeeld ofzo nodig om er van te leren. wat volgens mij helemaal niet zoooo raar is
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 17:41:36
Quote Anchor link
Vergelijk:
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
<!DOCTYPE html>
<html>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="text" name="test" value="holy" /><br />
<input type="text" name="test" value="crap" /><br />
<input type="text" name="test" value="son!" /><br />
<button type="submit">gaan</button>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo '<pre>'.print_r($_POST, true).'</pre>';
}

?>

</body>
</html>

Levert na verzenden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Array
(
    [test] => son!
)


Met:

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
<!DOCTYPE html>
<html>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="text" name="test[]" value="holy" /><br />
<input type="text" name="test[]" value="crap" /><br />
<input type="text" name="test[]" value="son!" /><br />
<button type="submit">gaan</button>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo '<pre>'.print_r($_POST, true).'</pre>';
}

?>

</body>
</html>

Levert na verzenden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
Array
(
    [test] => Array
        (
            [0] => holy
            [1] => crap
            [2] => son!
        )
)

Veel duidelijker dan dit gaat het niet worden vrees ik.
 
Fabian webstars

Fabian webstars

21/08/2015 17:53:09
Quote Anchor link
ja ik snap m!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php ($_POST['woord1'] as $nummer => $woord1) {
    $woord2 = $_POST['woord2'][$nummer]; ?>
waarom verschillen deze 2 zo erg

Toevoeging op 21/08/2015 19:08:49:

ik zie iets belangrijks over het hoofd :(
ik heb mn best gedaan :)
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
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
$sql = '
INSERT INTO overhoring (x,y,z)
VALUES ($values)
'
;

$values = array();
foreach ($_POST['woord1'] as $nummer => $woord1) {

    $values[] = "('".$woord1."',)";
}


$sql .= implode(',', $values);

if($sql==true) {
$result = mysqli_query($con, $sql);
echo 'gelukt <br />';
}
}

?>


Toevoeging op 21/08/2015 20:00:45:

ik ging dit proberen, maar het werkt nog steeds niet
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
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
$insData = array(
    'woord1' => $_POST['woord1'],
    'woord2' => $_POST['woord2'],
);

    
$columns = implode(", ",array_keys($insData));
$escaped_values = array_map('mysqli_real_escape_string', array_values($insData));
$values  = implode(", ", $escaped_values);
$sql = "INSERT INTO `overhoring`($columns) VALUES ($values)";

}

?>


<button id="btn1" class="btn btn-default">woorden toevoegen</button>

<form method="post">

<br /><br />
<div class="form-group col-md-3">
<input class="form-control" name="woord1[]" required> </div>
<br /><br />
<p>    </p>
<input type="submit" class="btn btn-default" value="klaar"/>

</form>


Toevoeging op 21/08/2015 20:01:54:

hij pakte de valeus niet volgens mij
 
Thomas van den Heuvel

Thomas van den Heuvel

21/08/2015 20:13:37
Quote Anchor link
Sorry maar hier (EDIT je vorige, ongewijzigde bericht) klopt weinig van. Ik stel voor dat je bij het begin begint, dat wil zeggen, verdiep je (op zijn minst) in de volgende basisonderwerpen van PHP:
- typen variabelen
- controle structuren

En dat je dit dan uitbreid naar communicatie met je MySQL-database. Daarbij zou je je ook wat in moeten lezen in de MySQL-syntax.

Tot slot combineer je dit alles tot een HTML-pagina die nog extra dynamish is door gebruikmaking van jQuery.

Het probleem is denk ik een beetje dat je een heleboel disciplines combineert in één script maar een aantal basisprincipes van elk van deze disciplines niet eigen bent. Het wordt dan verdomd lastig om uit te leggen hoe (waarom) bepaalde dingen (niet) werken zonder alles helemaal voor te kauwen.

Ik denk ook niet dat er een snelle manier is om dit te leren behalve door veel lezen en veel oefenen. Er zijn weinig shortcuts wat dat betreft.

Ik probeer dingen altijd zo simpel mogelijk uit te leggen, maar kan deze (simpelweg) niet simpeler maken dan dat ze zijn. Er is een bepaalde minimale hoeveelheid basiskennis nodig om "mee te kunnen redeneren". Ik merk in dit geval dat hier geen sprake van lijkt te zijn. Zodoende kan ik je helaas niet helpen, maar bovenstaande links zouden je een eind op weg moeten helpen.

Als je een boek in het midden begint te lezen zul je weinig begrijpen van het verhaal, begin dus bij het begin.

En als ik je (nog) een tip mag geven: debug ALLES. Dump dingen naar je scherm, je console, een log. Maak visueel wat er met je DATA gebeurt.

Als je alleen maar een query uitvoert zonder foutafhandeling en deze query werkt niet, hoe weet je dan wat er aan de hand is? Als je $sql nu eerst eens op je scherm afdrukt?

Als je je formulier verstuurt, en de helft van je data lijkt maar aan te komen / doorgevoerd te worden, dan druk je die formulierinhoud toch naar je scherm af? Dan zie je precies wat er gebeurt.

Het is niet eens dat de materie nu zo ingewikkeld is, het is hoe je er mee omgaat wat bepaalt hoe makkelijk je het voor jezelf maakt.
Gewijzigd op 21/08/2015 20:14:30 door Thomas van den Heuvel
 
Eddy E

Eddy E

22/08/2015 10:02:09
Quote Anchor link
Met de [] achter de name="iets[]" krijg je in $_POST['iets'] een array.
Die kan veel bevatten, bijvoorbeeld:

$_POST['iets'][0] = eerste woord
$_POST['iets'][1] = tweede woord
$_POST['iets'][2] = derde woord
$_POST['iets'][3] = vierde woord
$_POST['iets'][4] = etc

Die [0] of [3] hoef je niet te typen. Door name="iets[]" te gebruiken worden die vanzelf toegevoegd.
Dus in je form kan je wel 20 keer name="iets[]" gebruiken. Velden die leeg zijn worden niet verzonden (doe je dus niets mee).
Wil je automatisch alles wat WEL ingetypt is, opslaan, dan ga je dus $_POST['iets'] doorlopen.
En dat doe je met foreach($_POST['iets'] AS $woord. In $woord zit dus "eerste woord", daarna "tweede woord" etc etc.

Probeer maar:

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
<?php
error_reporting(0);

foreach($_POST['iets'] AS $woord)
 {

 echo 'Het woord is: '.$woord.'<br>';
 }


?>

<form method="post" action="">
 <input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>
<input type="text" name="iets[]"><br>

<input type="submit" value="Verzend">
</form>


Probeer maar 1 woord, of 5 in te vullen.
 



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.