2 reeksen van 5 naast elkaar invoeren als records Mysql/PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Johan West

Johan West

09/06/2015 14:26:24
Quote Anchor link
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


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
            $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


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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
foreach ( ($name_A as $newvar2) && ($name_B as $newvar3) )


werkt overigens niet maar zoiets mbv andere instructies.
Gewijzigd op 09/06/2015 14:28:16 door Johan West
 
PHP hulp

PHP hulp

29/03/2024 09:08:37
 
Ivo P

Ivo P

09/06/2015 14:57:23
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
foreach ($name_A as $key => $dummy) {

   echo $name_A[$key]  . ' x  '. $name_B[$key];

}


?>
 
Johan West

Johan West

10/06/2015 10:29:11
Quote Anchor link
Ivo P op 09/06/2015 14:57:23:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
foreach ($name_A as $key => $dummy) {

   echo $name_A[$key]  . ' x  '. $name_B[$key];

}


?>


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?
 
Ivo P

Ivo P

10/06/2015 10:40:15
Quote Anchor link
nee,

$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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
foreach ($name_A as $key => $value) {

   echo $value  . ' x  '. $name_B[$key];

}


?>


maar dan is minder duidelijk dat $key te gebruiken is om een element in beide array's aan te wijzen
 
Jacco Engel

Jacco Engel

10/06/2015 11:28:10
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$newvar2 = implode (", " , $name_A);
$newvar3 = implode (", " , $name_B);
            
            
foreach ($name_A as $newvar2) {


Vermoed dat het probleem zit in het feit dat je in je foreach $newvar2 overschrijft
 
Johan West

Johan West

10/06/2015 14:49:21
Quote Anchor link
Jacco Engel op 10/06/2015 11:28:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$newvar2 = implode (", " , $name_A);
$newvar3 = implode (", " , $name_B);
            
            
foreach ($name_A as $newvar2) {


Vermoed dat het probleem zit in het feit dat je in je foreach $newvar2 overschrijft




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>


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
 
Obelix Idefix

Obelix Idefix

10/06/2015 15:27:58
Quote Anchor link
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

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;

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.
 
Johan West

Johan West

11/06/2015 14:26:38
Quote Anchor link
Ik zie dat ik een foutje maak in mijn uitleg.

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



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
 
Ivo P

Ivo P

11/06/2015 18:41:38
Quote Anchor link
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
<?php
foreach ($name_A as $key => $dummy) {

   echo $name_A[$key]  . ' x  '. $name_B[$key];
   $sql = "INSERT INTO tabel
           (koloma, kolomB)
           values
           ('"
. mysqli_real_escape_string($conn, $$name_A[$key]) ."',
            '"
. mysqli_real_escape_string($conn, $$name_B[$key]) ."')";


}


?>
 
Thomas van den Heuvel

Thomas van den Heuvel

11/06/2015 20:29:41
Quote Anchor link
Wil je toevallig de rijen afdrukken als kolommen? De vraagstelling is mij compleet onduidelijk.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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.

?
 
Johan West

Johan West

17/06/2015 10:49:08
Quote Anchor link
I wil het volgende als output.

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----------


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
 
Ivo P

Ivo P

17/06/2015 11:07:23
Quote Anchor link
met foreach dus waarbij je $key => $value gebruikt.

Wat lukt er niet?
 
Ward van der Put
Moderator

Ward van der Put

17/06/2015 11:20:38
Quote Anchor link
Je kunt van de links een associatieve array maken, met $linkoms als de sleutel en $linkadd als de bijbehorende waarde.
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
<?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);
?>

Daarmee krijg je (uitgeschreven) deze query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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')

In de foreach moet je de waarden nog escapen met een functie of methode van de connectie (PDO, MySQLi of iets anders).
 
Johan West

Johan West

17/06/2015 11:20:43
Quote Anchor link
Wat is $value dan?

Als ik de database kolom primary key heb gemaakt is dit dan uniek voor de tabel of voor de gehele database?
 
Ivo P

Ivo P

17/06/2015 11:34:04
Quote Anchor link
die primary key is uniek voor de tabel.
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
 
Johan West

Johan West

17/06/2015 16:01:57
Quote Anchor link
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
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"; }
        
    
    
}


?>


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.
 
Ivo P

Ivo P

17/06/2015 16:07:22
Quote Anchor link
ik mis geloof ik compleet waarom er nu data uit een tabel gevist wordt om invoer uit een form te inserten...
 
Johan West

Johan West

17/06/2015 17:40:57
Quote Anchor link
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?
 
Obelix Idefix

Obelix Idefix

17/06/2015 17:59:24
Quote Anchor link
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?
 
Ivo P

Ivo P

17/06/2015 18:01:04
Quote Anchor link
wat ik al eerder aangaf:

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
<?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";
            }

}

?>


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
 
Johan West

Johan West

18/06/2015 00:02:00
Quote Anchor link
Ik heb de code zojuist getest en het werkte. Ik heb nog regel 57 tot 61 verwijderd en de laatste accolade. :)

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = "INSERT INTO tabel_naam (linkoms, linkadd) VALUES (
  '". $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?
 



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.