insert meerdere rijen in een keer lukt niet
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)
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
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>
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/
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 -
bedankt! :) Hoe werkt dat met een foreach
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:
...
(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.
Als je de volgende invoervelden hebt (zoals Aar aangeeft, met array-haken):
Code (php)
1
2
3
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[]" />
<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)
1
2
3
4
5
6
7
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
}
?>
// 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)
1
2
3
4
5
6
7
8
9
10
11
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
?>
$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.
waarom de x y z als ik vragen mag
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
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.
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).
@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.
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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>
<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:
Met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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>
<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:
Veel duidelijker dan dit gaat het niet worden vrees ik.
Code (php)
1
2
2
<?php ($_POST['woord1'] as $nummer => $woord1) {
$woord2 = $_POST['woord2'][$nummer]; ?>
$woord2 = $_POST['woord2'][$nummer]; ?>
Toevoeging op 21/08/2015 19:08:49:
ik zie iets belangrijks over het hoofd :(
ik heb mn best gedaan :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 />';
}
}
?>
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)
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
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>
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
- 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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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>
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.