2 reeksen van 5 naast elkaar invoeren als records Mysql/PHP
Ik wil nu 2 x 5 is 10 variabelen invoeren in de database.
Deze zitten in 2 rijen/reeksen en ze moeten tegelijk in de database.
Dit moet het utieindelijke resultaat worden
---------(tabel R1) ------ (Tabel R2)
record1 ------A----------------F
record2 ------B----------------G
record3 ------C----------------H
record4 ------D----------------I
record5 ------E----------------J
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
$name_A = $_POST['name_A'];
$name_B = $_POST['name_B'];
$newvar2 = implode (", " , $name_A);
$newvar3 = implode (", " , $name_B);
foreach ($name_A as $newvar2) {
$sql = "INSERT INTO table_name (name_A, name_B) VALUES ('$newvar2' , '$newvar3') ";
if ($conn->query($sql) === TRUE)
{ // to be continued
$name_B = $_POST['name_B'];
$newvar2 = implode (", " , $name_A);
$newvar3 = implode (", " , $name_B);
foreach ($name_A as $newvar2) {
$sql = "INSERT INTO table_name (name_A, name_B) VALUES ('$newvar2' , '$newvar3') ";
if ($conn->query($sql) === TRUE)
{ // to be continued
Het probleem is dat foreach wel de eerste tabel goed en netje onder elkaar in MYSQl zet, maar de 2e als een gehel reeks invoert.
Is er een manier om meerdere variabelen te verwerken met foreach?
bijv.
werkt overigens niet maar zoiets mbv andere instructies.
Gewijzigd op 09/06/2015 14:28:16 door Johan West
Ivo P op 09/06/2015 14:57:23:
hoe moet ik dit zien? Ik probeer te begrijpen hoe foreach deze array verwerkt.
is het als volgt:
als $name_A het sleutelnummer 0 is dan wordt $dummy uitgelezen
Is dat de juiste interpretatie?
$a[0] = 10;
$a[1] = 20;
$a[4] = 'aa';
foreach($a as $key => $value)
De eerste ronde zal $key de waarde 0 hebben en $value 10
daarna wordt $key 1 en $value 20.
bij de derde ronde heb ik $key = 4 en $value = 'aa'
merk op dat in dit geval de waarde 3 voor $key niet optreedt.
---
in jouw geval zal $key gewoon oplopen van 0 tot iets.
De waarde doe ik niets mee, vandaar dat ik $dummy gebruikt heb.
Je kunt ook doen:
Code (php)
maar dan is minder duidelijk dat $key te gebruiken is om een element in beide array's aan te wijzen
Code (php)
1
2
3
4
5
2
3
4
5
$newvar2 = implode (", " , $name_A);
$newvar3 = implode (", " , $name_B);
foreach ($name_A as $newvar2) {
$newvar3 = implode (", " , $name_B);
foreach ($name_A as $newvar2) {
Vermoed dat het probleem zit in het feit dat je in je foreach $newvar2 overschrijft
Jacco Engel op 10/06/2015 11:28:10:
De console output ziet er als volgt uit op dit moment:
Quote:
mysql>
mysql>
mysql>
mysql>
mysql> SELECT * FROM wine;
+------------+----------------------------------------------------------------------------------+
| linkoms | linkadd |
+------------+----------------------------------------------------------------------------------+
| wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| white wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| red wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| blue wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| beerwine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
+------------+----------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql> SELECT * FROM wine;
+------------+----------------------------------------------------------------------------------+
| linkoms | linkadd |
+------------+----------------------------------------------------------------------------------+
| wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| white wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| red wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| blue wine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
| beerwine | www.wine.com, www.whitewine.com, www.redwine.com, www.bluewine.com, www.beerwine |
+------------+----------------------------------------------------------------------------------+
5 rows in set (0.00 sec)
mysql>
mysql>
Ik wil dat de kolom linkadd het bijbehorende adres heeft.
Kan je foreach en implode tegelijk gebruiken? Als je zegt dat het op deze wijze wordt overschreven dan zoek ik een methode om de losse variabelen afzonderlijk in te lezen.
Als ik foreach niet zou gebruiken hoe moet ik dan de string aflopen?
Gewijzigd op 10/06/2015 14:51:04 door Johan West
Johan West op 09/06/2015 14:26:24:
Ik wil het vorige oefen script waarbij er 5 tabellen werden aangemaakt uitbreiden een aanpassen.
Ik wil nu 2 x 5 is 10 variabelen invoeren in de database.
Deze zitten in 2 rijen/reeksen en ze moeten tegelijk in de database.
Dit moet het utieindelijke resultaat worden
---------(tabel R1) ------ (Tabel R2)
record1 ------A----------------F
record2 ------B----------------G
record3 ------C----------------H
record4 ------D----------------I
record5 ------E----------------J
Ik wil nu 2 x 5 is 10 variabelen invoeren in de database.
Deze zitten in 2 rijen/reeksen en ze moeten tegelijk in de database.
Dit moet het utieindelijke resultaat worden
---------(tabel R1) ------ (Tabel R2)
record1 ------A----------------F
record2 ------B----------------G
record3 ------C----------------H
record4 ------D----------------I
record5 ------E----------------J
Waar komt de info A t/m J vandaan? Formulier?
Je hebt her over vorige oefenscript met 5 tabellen. Ik zie er nu 2.
Wat is de reden om het over 2 tabellen te verdelen?
Is er een bepaalde relatie tussen A/F, B/G, etc? Hoe borg je dat dan tussen beide tabellen?
Johan West op 10/06/2015 14:49:21:
De console output ziet er als volgt uit op dit moment:
mysql> SELECT * FROM wine;
mysql> SELECT * FROM wine;
In je openingspost heb je het over toevoegen. De query is een select (=opvragen). Wat is nu de bedoeling? Daarnaast heb je het in je openingspost over twee tabellen (R1 en R2) terwijl je maar 1 tabel hebt bij de select-query.
tabellen moet hier kolommen zijn.
Quote:
---------(kolom R1) ------ (kolom R2)----id
record1 ------A----------------F---------------1
record2 ------B----------------G---------------2
record3 ------C----------------H --------------3
record4 ------D----------------I---------------4
record5 ------E----------------J---------------5
---------(kolom R1) ------ (kolom R2)----id
record1 ------A----------------F---------------1
record2 ------B----------------G---------------2
record3 ------C----------------H --------------3
record4 ------D----------------I---------------4
record5 ------E----------------J---------------5
Inmiddels heb ik er een autoincrement primary key kolom bij aangemaakt. Ik vermoed dat dit voordelen kan opleveren op termijn.
Het script is bedoeld om via de browser een input formulier in te vullen (toevoegen); dus daar komen de gegevens vandaan.
Via de console doe ik checks wat het resultaat is. Bijv met SELECT * FROM , de output is ter info van mezelf tijdens het programmeren.
Gewijzigd op 11/06/2015 14:33:53 door Johan West
Als je nu eens concreet omschrijft wat je uiteindelijk wilt, op grond van wat je hebt?
Wil je uiteindelijk je data zo afdrukken?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
| wine | white wine | etc.
+-------------------+-------------------+-----
| www.wine.com | www.wine.com | etc.
| www.whitewine.com | www.whitewine.com | etc.
| www.redwine.com | www.redwine.com | etc.
| www.bluewine.com | www.bluewine.com | etc.
| www.beerwine.com | www.beerwine.com | etc.
+-------------------+-------------------+-----
| www.wine.com | www.wine.com | etc.
| www.whitewine.com | www.whitewine.com | etc.
| www.redwine.com | www.redwine.com | etc.
| www.bluewine.com | www.bluewine.com | etc.
| www.beerwine.com | www.beerwine.com | etc.
?
Quote:
linkoms ----------------linkadd ----------------------- link_id_nr--
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
wine ------------------www.wine.com -----------------------1----------
white wine ------------www.whitewine.com --------------2----------
red wine --------------www.redwine.com-------------------3----------
blue wine -------------www.bluewine.com----------------4----------
beer wine -------------www.beerwine.com----------------5----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
wine ------------------www.wine.com -----------------------1----------
white wine ------------www.whitewine.com --------------2----------
red wine --------------www.redwine.com-------------------3----------
blue wine -------------www.bluewine.com----------------4----------
beer wine -------------www.beerwine.com----------------5----------
Omdat de eerste array wel goed wordt weggeschreven in de database en de tweede niet, moet de foreach loop worden uitgebreid want ik weet niet hoe beide arrays tegelijk naast elkaar moeten komen te staan.
Ik heb een primary key autoincrement kolom gemaakt, mogelijk weten mensen hier hoe mbv deze primary key en foreach de beide varaibelen $linkoms, $linkadd in de kolom kunnen worden weggeschreven?
Gewijzigd op 17/06/2015 10:50:37 door Johan West
Wat lukt er niet?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$links = array(
'wine' => 'www.wine.com',
'white wine' => 'www.whitewine.com',
'red wine' => 'www.redwine.com',
'blue wine' => 'www.bluewine.com',
'beer wine' => 'www.beerwine.com',
);
$sql = 'INSERT INTO tabelnaam (linkoms, linkadd) VALUES ';
foreach ($links as $linkoms => $linkadd) {
$values[] = "('{$linkoms}', '{$linkadd}')";
}
$sql .= implode(',', $values);
?>
$links = array(
'wine' => 'www.wine.com',
'white wine' => 'www.whitewine.com',
'red wine' => 'www.redwine.com',
'blue wine' => 'www.bluewine.com',
'beer wine' => 'www.beerwine.com',
);
$sql = 'INSERT INTO tabelnaam (linkoms, linkadd) VALUES ';
foreach ($links as $linkoms => $linkadd) {
$values[] = "('{$linkoms}', '{$linkadd}')";
}
$sql .= implode(',', $values);
?>
Daarmee krijg je (uitgeschreven) deze query:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
INSERT INTO
tabelnaam (linkoms, linkadd)
VALUES
('wine', 'www.wine.com'),
('white wine', 'www.whitewine.com'),
('red wine', 'www.redwine.com'),
('blue wine', 'www.bluewine.com'),
('beer wine', 'www.beerwine.com')
tabelnaam (linkoms, linkadd)
VALUES
('wine', 'www.wine.com'),
('white wine', 'www.whitewine.com'),
('red wine', 'www.redwine.com'),
('blue wine', 'www.bluewine.com'),
('beer wine', 'www.beerwine.com')
In de foreach moet je de waarden nog escapen met een functie of methode van de connectie (PDO, MySQLi of iets anders).
Als ik de database kolom primary key heb gemaakt is dit dan uniek voor de tabel of voor de gehele database?
Die zal wel automatisch toegevoegd worden, dus daar niet druk over maken.
http://php.net/manual/en/control-structures.foreach.php
Zie ook het voorbeeld dat ik al veel eerder gaf met $dummy
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>invoeren tekst</title>
<link rel="prefetch" href="http://">
<link rel=" stylesheet" type="text/css" href="stijlblad1.css" media="screen" />
</head>
<body>
<form action="BestandsNaam.php" method="post" accept-charset="UTF-8"><?php
for ($i=0; $i < 5; $i++) {
?><p>
<label for="linkoms_<?php echo $i ?>">
Link Naam <?php echo ($i + 1) ?>
</label>
<br>
<input type="text" name="linkoms[]"
id="linkoms_<?php echo $i ?>"
value="" /> <br>
<label for="linkadd_<?php echo $i ?>">
Link Adres <?php echo ($i + 1) ?>
</label><br>
<input type="text" name="linkadd[]"
id="linkadd_<?php echo $i ?>"
value="" />
</p><?php
}
?><p>
<button type="submit">Opslaan</button>
</p>
</form>
</body>
</html>
<?php
$servername = "localhost";
$username = "jouwnaam";
$password = "jouwpasswoord";
$dbname = "jouwdatabase";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
If (isset($_POST['linkoms']) && (is_array($_POST['linkoms'])) && ($linkoms = " ") && ($newvar2 = " ") && isset($_POST['linkadd'])
&& (is_array($_POST['linkadd'])) && ($linkadd = " ") && ($newvar3 = " ") && ($two_arrays = " ") && ($var_com = " ") && ($linknummer = ' ' )) {
$linkoms = $_POST['linkoms'];
$linkadd = $_POST['linkadd'];
$newvar2 = implode (", " , $linkoms);
$newvar3 = implode (", " , $linkadd);
$sql = "SELECT linknummer FROM tabel_name";
$result = $conn->query($sql);
if ($result->num_rows > 0) { //
// output gegevens van iedere rij haalt de column linknummer uit de tabel
while($rij = $result->fetch_assoc()) {
echo "linknummer :" . $rij["linknummer"] . "<br>";
foreach ($linknummer as $key => $newvar2){
$sql2 = "INSERT INTO tabel_name (linkoms) VALUES ('$newvar2') "; //
if ($conn->query($sql2) === TRUE)
{ echo $newvar2 ;
} else {
echo "Fout: " . " <br>" . $conn->error;
}
echo "<br>" . " zijn toegevoegd aan de database";
}
$conn->close();
}
// hier kan de 2e INSERT query voor linkadd / $newvar3
}
$conn->close();
}
else { echo "fout: de omschrijving 'linkoms' niet aanwezig of is geen array"; }
}
?>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>invoeren tekst</title>
<link rel="prefetch" href="http://">
<link rel=" stylesheet" type="text/css" href="stijlblad1.css" media="screen" />
</head>
<body>
<form action="BestandsNaam.php" method="post" accept-charset="UTF-8"><?php
for ($i=0; $i < 5; $i++) {
?><p>
<label for="linkoms_<?php echo $i ?>">
Link Naam <?php echo ($i + 1) ?>
</label>
<br>
<input type="text" name="linkoms[]"
id="linkoms_<?php echo $i ?>"
value="" /> <br>
<label for="linkadd_<?php echo $i ?>">
Link Adres <?php echo ($i + 1) ?>
</label><br>
<input type="text" name="linkadd[]"
id="linkadd_<?php echo $i ?>"
value="" />
</p><?php
}
?><p>
<button type="submit">Opslaan</button>
</p>
</form>
</body>
</html>
<?php
$servername = "localhost";
$username = "jouwnaam";
$password = "jouwpasswoord";
$dbname = "jouwdatabase";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
If (isset($_POST['linkoms']) && (is_array($_POST['linkoms'])) && ($linkoms = " ") && ($newvar2 = " ") && isset($_POST['linkadd'])
&& (is_array($_POST['linkadd'])) && ($linkadd = " ") && ($newvar3 = " ") && ($two_arrays = " ") && ($var_com = " ") && ($linknummer = ' ' )) {
$linkoms = $_POST['linkoms'];
$linkadd = $_POST['linkadd'];
$newvar2 = implode (", " , $linkoms);
$newvar3 = implode (", " , $linkadd);
$sql = "SELECT linknummer FROM tabel_name";
$result = $conn->query($sql);
if ($result->num_rows > 0) { //
// output gegevens van iedere rij haalt de column linknummer uit de tabel
while($rij = $result->fetch_assoc()) {
echo "linknummer :" . $rij["linknummer"] . "<br>";
foreach ($linknummer as $key => $newvar2){
$sql2 = "INSERT INTO tabel_name (linkoms) VALUES ('$newvar2') "; //
if ($conn->query($sql2) === TRUE)
{ echo $newvar2 ;
} else {
echo "Fout: " . " <br>" . $conn->error;
}
echo "<br>" . " zijn toegevoegd aan de database";
}
$conn->close();
}
// hier kan de 2e INSERT query voor linkadd / $newvar3
}
$conn->close();
}
else { echo "fout: de omschrijving 'linkoms' niet aanwezig of is geen array"; }
}
?>
Bovenstaand script loopt nu weer vast. De array die ik met implode in afzonderlijke elementen heb verdeeld kan op de 1 of andere manier niet gelezen worden.
ik mis geloof ik compleet waarom er nu data uit een tabel gevist wordt om invoer uit een form te inserten...
Ivo P op 17/06/2015 16:07:22:
ik mis geloof ik compleet waarom er nu data uit een tabel gevist wordt om invoer uit een form te inserten...
Het lukt me niet om de linkoms en linkadd in 2 database kolommen op gelijke rijen te krijgen, mogelijk als het wel lukt met een primary key dan kun je deze gebruiken. Vandaar deze uit de tabel vissen.
Niet doen?
Wat is dan een optie?
Johan West op 17/06/2015 17:40:57:
Het lukt me niet om de linkoms en linkadd in 2 database kolommen op gelijke rijen te krijgen,
Kan de insert niet in 1 query?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// zelf controle op bestaan van $_POST['linkoms'] em $_POST['linkadd'] doen
foreach($_POST['linkoms'] as $key => $dummy) {
$sql = "INSERT INTO tabel_naam (linkoms, linkadd) VALUES (
'". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
'". $conn->real_escape_string($_POST['linkadd'][$key]) ."'
)";
if ($conn->query($sql) === TRUE)
{ echo $sql .'<br>';
} else {
echo "Fout: " . " <br>" . $conn->error;
}
echo "<br>" . " zijn toegevoegd aan de database";
}
}
?>
// zelf controle op bestaan van $_POST['linkoms'] em $_POST['linkadd'] doen
foreach($_POST['linkoms'] as $key => $dummy) {
$sql = "INSERT INTO tabel_naam (linkoms, linkadd) VALUES (
'". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
'". $conn->real_escape_string($_POST['linkadd'][$key]) ."'
)";
if ($conn->query($sql) === TRUE)
{ echo $sql .'<br>';
} else {
echo "Fout: " . " <br>" . $conn->error;
}
echo "<br>" . " zijn toegevoegd aan de database";
}
}
?>
NB:
niet in je foreach-lus de verbinding sluiten
NB: misschien is een prepared statement ook wel handig hier.
Gewijzigd op 17/06/2015 18:02:31 door Ivo P
Toevoeging op 18/06/2015 09:17:46:
Ik zou graag nog wat uitleg ontvangen.
Er zitten instructies in die ik niet geheel begrijp.
Code (php)
1
2
2
$sql = "INSERT INTO tabel_naam (linkoms, linkadd) VALUES (
'". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
'". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
hoe moet ik zoiets als -> zien? Betekent dat 'worden'?
Bij het wegschrijven van gegevens wordt regelmatig gebruik gemaakt van
$conn->query(sql) of $conn->close of $conn->connect_error
Maar php gebruikt soms ook bijv. $result->fetch_assoc.
Wat doet een programmeertaal op zo'n moment?