php 2d array waarden naar mysql database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark van Dijk

Mark van Dijk

16/06/2011 13:26:36
Quote Anchor link
Goedemiddag,

Ik ben nieuw op dit forum en vrij nieuw op gebied van php en mysql. Dit is mijn eerste post!

Voor een economiespel (Kapi-Regnum) probeer ik spelers te helpen door een website op te zetten die de statistieken over tijd weergeeft in grafieken.

Ik heb met code vanaf diverse fora het voor elkaar gekregen dat ik nu via een html textarea form field een hele tabel (gekopieerd van de site) in een 2d array kan zetten. Ik moet de code nog aanpassen naar actuele velden maar de array ziet er ongeveer zo uit:

Array
(
[0] => Array
(
[product] => test
[verkocht] => test
[etc...
)

[1] => Array
(
[product] => test1
[verkocht] => test1
[etc...
)

)

Wat ik nu probeer te doen is het volgende:
Elk product heeft zijn eigen tabel in de database.
elke rij daarvan bevat de gegevens van dat product op een bepaalde datum.

Nu wil ik van elk product de waarden uit de array naar de verschillende tabellen kopieren. Ik heb al tig verschillende methoden gezien op vele fora en zie eigenlijk door het bos de bomen niet meer.

Vraag is of iemand mij op weg kan helpen met hoe ik dit zou moeten doen en hoe de structuur van de code er dan uit zou moeten zien?

alvast bedankt,
Ook namens vele spelers van Kapi Regnum :-)
 
PHP hulp

PHP hulp

28/03/2024 17:03:57
 
The Force

The Force

16/06/2011 14:00:54
Quote Anchor link
Je structuur van de database is om te beginnen al fout. Je zult nu voor elke product een SELECT query moeten doen als je er gegevens van op moet halen. En als je wil inserten dan moet je voor elk product een aparte query schrijven. Bovendien kan je zo het niet generiek maken. Je zou dan een nieuwe tabel aan moeten maken als je een extra product krijgt en op allerlei plekken je code aan moeten gaan passen.

Beter is om een tabel product aan te maken met alle producten en een tabel productgegevens aan te maken die voor de combinatie van een bepaald product en een datum productgegevens heeft. Dus dat je bijvoorbeeld een rij toevoegt voor product "test1" met datum "16/06/2011". Als je het goed wil doen maak je in de tabel "product" de productnaam de primary key en in de tabel "productgegevens" de combinatie van de productnaam en de datum de primary key maakt. Koppel met een foreign key de productnaam in de tabel "productgegevens" aan de productnaam in de tabel "product". Op die manier kan je in "productgegevens" dus niet een product toevoegen die niet in de "product" tabel staat.

Je kan dan met een loopje door de array gaan en dan in de tabel "productgegevens" elke keer een product toevoegen.

Als je "productgegevens" tabel er zo uit ziet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
productnaam (varchar(50), primary key) | datum (date, primary key) | verkocht | etc...


Dan kan je gewoon op de volgende manier de array doorlopen:

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
<?php
//Transactie hoeft niet maar zorgt ervoor dat als 1 van de queries mislukt ze allemaal ongedaan gemaakt worden.
mysql_query("START TRANSACTION");

//Alleen nodig met transactie.
$insertproblem = false;

//Loop door alle producten.
foreach($producten as $product) {
    $result = mysql_query("INSERT INTO productgegevens (productnaam, datum, verkocht) VALUES ('" . mysql_real_escape_string($product['productnaam'] . "', NOW(), '" . mysql_real_escape_string($product['verkocht'] . "');"
    
    if(!$result) {
        //Er is iets fout gegaan.
        //Geef de fout weer (niet doen in productie omgeving).

        echo "Er is iets fout gegaan. Waarschijnlijk bestaat je product niet. De foutmelding is " . mysql_error();        

        //Zorg dat er zostraks geen COMMIT gedaan wordt.
        $insertproblem = true;
        
        //Stop met de inserts.
        break;
    }
}


if($insertproblem) {
    //Er is een query fout gegaan. Rol alles terug.
    //Maak alle inserts ongedaan.

    mysql_query("ROLLBACK");
}
else {
    //Alles is goed gegaan.
    $mysql_query("COMMIT");
}

?>

En klaar is Mark!
 
Erik van de Locht

Erik van de Locht

16/06/2011 14:01:52
Quote Anchor link
Hoi Mark,

Mag ik ten eerst vragen, heb je zelf dat spel gemaakt of is het van iemand anders? (Ik heb er nog nooit van gehoord dus excuus als het wellicht een stomme vraag is). Deze vraag stel ik niet omdat ik je niet wil helpen of zo, maar als elk product een eigen tabel heeft dan is de opzet verre van flexibel en maak je het jezelf alleen maar moeilijker.

Meer logischer zou een opzet als dit zijn:
Tabel Product
- productID
- productnaam

Tabel ProductInstantie
- instantieID
- productID
- verkocht


Maargoed, in een poging je toch te helpen:
Als je met een foreach loop door de array heen loopt, krijg je voor elke keer dat je door de array heen loopt een 'object' als array. In die array staan de gegevens van het object.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
foreach ($producten as $product) {
  var_dump($product); // Zou zo iets moeten geven:
  /*
  array(
    'product' => 'test',
    'verkocht' => 'test'
  )
  met $product['product'] zul je dan ook 'test' krijgen.
  */

} ?>


In die foreach-lus zul je een check moeten doen welk soort product het is (want elk product ging in een andere tabel zei je?) en vervolgens in de goede tabel inserten met een query. Misschien snap je nu wel dat de opzet van de tabel verre van logisch is. Ook is het heel erg inefficient, want het zou betekenen dat je 100 query's moet uitvoeren als je 100 producten hebt. Als alles in 1 tabel komt, kun je meerdere inserts in 1 query gooien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO product (productnaam) VALUES ('product 1') ('product 2') ('product 3')


Edit: Ik zie dat The Force me net voor is.
Gewijzigd op 16/06/2011 14:05:30 door Erik van de Locht
 
Mark van Dijk

Mark van Dijk

16/06/2011 14:26:33
Quote Anchor link
The Force en Erik,

Super bedankt voor de snelle reactie. Ik heb het idee dat ik met aanpassen en interpreteren het wel ga redden nu. Ook bedankt voor je gedetaileerde script, The Force. Je hebt direct het invoegen van de huidige datum en foutafhandeling makkelijk voor me gemaakt, want dat waren nog zaken waarin ik me moest gaan verdiepen.

Erik, het spel is van iemand anders.

Ik ga later vandaag het verhaal aan het draaien proberen te krijgen, ik laat dan even weten of het gelukt is.

Nogmaals: Bedankt!
 
The Force

The Force

16/06/2011 14:40:34
Quote Anchor link
No worries!

@Erik. Je INSERT query is fout en het heeft echt geen voordeel om je database vol met id's te stoppen. Dat maakt je database minder beschrijvend, kost je extra queries en in een aantal gevallen ook extra joins. Daarnaast is het onnodige data en moet je extra constraints maken als je wil dat bijvoorbeeld de productnaam uniek is (wat me vrij logisch lijkt!). Kijk wat in een rij uniek moet zijn en maak dat de primary key. Alleen als je echt geen unieke identificatie hebt (wat vrij uitzonderlijk is) moet je gebruik maken van een id!
 
Mark van Dijk

Mark van Dijk

17/06/2011 18:50:12
Quote Anchor link
Hallo allemaal,

Ik ben inmiddels een stuk verder gekomen. Ik heb de array weten uit te breiden zodat alle kolommen er in passen. ziet er nu zo uit:

[4] => Array
(
[product] => Doek
[verkocht] => 1.045.448
[prijs] => 634,92
[nietnodig] => ¢?
[kwaliteit] => 33,27
)

[5] => Array
(
[product] => Dons
[verkocht] => beddengoed
[prijs] => 24.922
[nietnodig] => 1.538,46
[kwaliteit] => ¢?
)

Toch gaat er iets fout zoals je kunt zien en ik weet waarom. Ik deel de rijen nu op adhv spaties. Maar even over het hoofd gezien dat er ook waarden tussen zitten die spaties in zich hebben. het zijn echter altijd spaties tussen (mede)klinkers. is er een mogelijkheid om de spaties tussen tekst weg te halen, maar niet tussen de rest van de waarden?

Is er een mogelijkheid om de waarden zo te scheiden dat de productnamen niet van elkaar gescheiden worden, maar de waarden onderling wel?

(ga nu de database aanmaken, Hopelijk gaat het scriptje van The Force dan zijn werk doen. :-) )

Groet,
Mark.

Toevoeging op 17/06/2011 22:21:21:

Goed,

Inmiddels dacht ik klaar te zijn. Helaas...

Ik heb de database opgezet met de structuur en keys zoals The Force dat voorstelde.
Ik heb heel het script klaar en toch gaat er iets fout:
Parse error: syntax error, unexpected T_IF in /www/submitform.php on line 49

Ga nu proberen de code erin te zetten:
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
<?php
session_start();

$db = mysql_connect("localhost", "db", "pass") or die("Could not connect.");

if(!$db)

    die("no db");

if(!mysql_select_db("db",$db))

     die("No database selected.");

if (isset($_POST['text'])) {
// get rid of whitespace...also, since not all OS use \r
// but everyone has \n in it, let's get rid of the \r

$text = str_replace("\r", '', trim($_POST['text']));

// now that you have your raw text
// we need an array to store the data

$data = array();

// split line by line
$lines = explode("\n", $text);
foreach ($lines as $line) {
// split the data by a colon
$parts = explode(' ', $line);

// set all data into one two dimensional array
$data[] = array('product' => $parts[0], 'verkocht' => $parts[1], 'prijs' => $parts[2], 'nietnodig' => $parts[3], 'kwaliteit' => $parts[4]);
}


//echo '<pre>';
//print_r($data);
//echo '</pre>';
//exit;
//}

//Transactie hoeft niet maar zorgt ervoor dat als 1 van de queries mislukt ze allemaal ongedaan gemaakt worden.

mysql_query("START TRANSACTION");

//Alleen nodig met transactie.
$insertproblem = false;

//Loop door alle producten.
foreach($producten as $product) {
    $result = mysql_query("INSERT INTO kap_productgegevens (datum, product, verkocht, prijs, kwaliteit) VALUES (NOW(), '" . mysql_real_escape_string($product['product'] . "', '" . mysql_real_escape_string($product['verkocht'] . "', '" . mysql_real_escape_string($product['prijs'] . "', '" . mysql_real_escape_string($product['kwaliteit'] . "');"
    
    if(!$result) {
        //Er is iets fout gegaan.
        //Geef de fout weer (niet doen in productie omgeving).

        echo "Er is iets fout gegaan. Waarschijnlijk bestaat je product niet. De foutmelding is " . mysql_error();        

        //Zorg dat er zostraks geen COMMIT gedaan wordt.
        $insertproblem = true;
        
        //Stop met de inserts.
        break;
    }
}


if($insertproblem) {
    //Er is een query fout gegaan. Rol alles terug.
    //Maak alle inserts ongedaan.

    mysql_query("ROLLBACK");
}
else {
    //Alles is goed gegaan.
    $mysql_query("COMMIT");
}

mysql_close($db);
?>


<html>
<body>

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="submit" value="Submit" /><br>
<textarea cols="75" rows="61" name="text"></textarea><br />

</form>

</body>
</html>


Ik heb de code al een paar keer na gelopen en zover ik er verstand van heeft lijkt het te kloppen. Wat gaat er fout? zou iemand daar naar willen kijken?
Gewijzigd op 17/06/2011 22:25:41 door Mark van Dijk
 
Mark van Dijk

Mark van Dijk

19/06/2011 20:02:04
Quote Anchor link
Ik heb zelf nog wat gepuzzeld. ik heb nu alles voor elkaar behalve de foutcode:
Parse error: parse error, unexpected T_IF

Als iemand daar naar wil kijken ben ik eruit.
 
Gerhard l

gerhard l

19/06/2011 20:17:39
Quote Anchor link
lijn 47 ga je de mist in op het eind de ; valt binnen je accolades
 
Mark van Dijk

Mark van Dijk

19/06/2011 20:20:07
Quote Anchor link
Bedankt voor je reactie. heb de code aangepast.

krijg nu foutcode:
Parse error: syntax error, unexpected T_IF on line 36

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
<?php
if (isset($_POST['text'])) {
// get rid of whitespace...also, since not all OS use \r
// but everyone has \n in it, let's get rid of the \r

$text = str_replace("\r", '', trim($_POST['text']));

// now that you have your raw text
// we need an array to store the data

$data = array();

// split line by line
$lines = explode("\n", $text);
foreach ($lines as $line) {
// split the data by a colon
$parts = explode("\t", $line);

$valuta = explode(' ', $parts[2]);

// set all data into one two dimensional array
$data[] = array('product' => $parts[0], 'verkocht' => $parts[1], 'prijs' => $valuta[0], 'kwaliteit' => $parts[3]);

}

 //MySQL Database Connect
 include 'connect.php';

//Transactie hoeft niet maar zorgt ervoor dat als 1 van de queries mislukt ze allemaal ongedaan gemaakt worden.
mysql_query("START TRANSACTION");

//Alleen nodig met transactie.
$insertproblem = false;
 
//Loop door alle producten.
foreach($producten as $product) {
    $result = mysql_query("INSERT INTO kap_productgegevens (datum, product, verkocht, prijs, kwaliteit) VALUES (NOW(), '" . mysql_real_escape_string($product['product'] . "', '" . mysql_real_escape_string($product['verkocht'] . "', '" . mysql_real_escape_string($product['prijs'] . "', '" . mysql_real_escape_string($product['kwaliteit'] . "')")
  
if (!$result) {
//Er is iets fout gegaan.
//Geef de fout weer (niet doen in productie omgeving).

echo "Er is iets fout gegaan. Waarschijnlijk bestaat je product niet. De foutmelding is " . mysql_error();        

//Zorg dat er zostraks geen COMMIT gedaan wordt.
$insertproblem = true;
        
//Stop met de inserts.
break;
}



if($insertproblem) {
    //Er is een query fout gegaan. Rol alles terug.
    //Maak alle inserts ongedaan.

    mysql_query("ROLLBACK");
}
else {
    //Alles is goed gegaan.
    $mysql_query("COMMIT");
}

mysql_close($db);

//echo '<pre>';
//print_r($data);
//echo '</pre>';
//exit;

}

?>
Gewijzigd op 19/06/2011 20:20:38 door Mark van Dijk
 
Gerhard l

gerhard l

19/06/2011 20:23:52
Quote Anchor link
vervang die regel 34 door:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
 $result
= mysql_query("INSERT INTO kap_productgegevens (datum, product, verkocht, prijs, kwaliteit) VALUES (NOW(), '" . mysql_real_escape_string($product['product']). "', '" . mysql_real_escape_string($product['verkocht'] ). "', '" . mysql_real_escape_string($product['prijs']) . "', '" . mysql_real_escape_string($product['kwaliteit']) . "'");
?>


Maar ik weet niet wat jij op sommige plekken ooit wil doen..
Gewijzigd op 19/06/2011 20:25:22 door gerhard l
 
Mark van Dijk

Mark van Dijk

19/06/2011 20:28:55
Quote Anchor link
Super, het script loopt nu door tot line 79. Krijg daar nu een foutmelding:

Parse error: syntax error, unexpected $end on line 79

Lijkt erop dat ik iets vergeten ben?

Toevoeging op 19/06/2011 20:58:24:

Problem solved. :-)

Alleen staan er na het draaien van het script geen gegevens in de tabel.

Toevoeging op 19/06/2011 21:14:50:

Gerhard l op 19/06/2011 20:23:52:

Maar ik weet niet wat jij op sommige plekken ooit wil doen..


Een tabel, gekopieerd van een internet pagina met 1 druk op de knop inserten in een database via een html formulier.

Ik krijg nu dus geen foutmeldingen, maar er staat ook niets in de database. :-(

Toevoeging op 20/06/2011 11:58:30:

Hallo allemaal,

Het script werkt en ik heb em nog wat uitgebreidt. Problem solved!
Iedereen super bedankt voor alle hulp!

Het uiteindelijke script wil ik nog even delen:
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
<?php
//maak connectie met de database
session_start();

$db = mysql_connect("localhost", "user", "pass") or die("Could not connect.");

if(!$db)

    die("no db");

if(!mysql_select_db("db",$db))

     die("No database selected.");


if (isset($_POST['text'])) {
// get rid of whitespace...also, since not all OS use \r
// but everyone has \n in it, let's get rid of the \r

$text = str_replace("\r", '', trim($_POST['text']));

// maak een array aan
$data = array();

// splits regel voor regel
$lines = explode("\n", $text);
foreach ($lines as $line) {
// splits de regel bij de Tab
$parts = explode("\t", $line);

//splits het bedrag van het valuta teken
$valuta = explode(' ', $parts[2]);

//haal het duizendtal scheidingsteken uit de aantallen
$verkocht = str_replace('.', '', $parts[1]);

//haal het duizendtal scheidingsteken uit de prijzen
$prijskomma = str_replace('.', '', $valuta[0]);
// verander de komma's voor de decimalen in punten bij de prijzen
$prijs = str_replace(',', '.', $prijskomma);
// verander de komma's voor de decimalen in punten bij de kwaliteit
$kwaliteit = str_replace(',', '.', $parts[3]);

// zet alle data in een 2demensionale array
$data[] = array('product' => $parts[0], 'verkocht' => $verkocht, 'prijs' => $prijs, 'kwaliteit' => $kwaliteit);

}

// haal de //'s weg om de array te zien te krijgen op je pagina. Upload naar database werkt dan niet
//echo '<pre>';
//print_r($data);
//echo '</pre>';
//exit;

//Transactie hoeft niet maar zorgt ervoor dat als 1 van de queries mislukt ze allemaal ongedaan gemaakt worden.

mysql_query("START TRANSACTION");

//Alleen nodig met transactie.
$insertproblem = false;
 
//Loop door alle producten.
foreach($data as $product) {
    $result = mysql_query("INSERT INTO kap_productgegevens (datum, product, verkocht, prijs, kwaliteit) VALUES (NOW(), '" . mysql_real_escape_string($product['product']). "', '" . mysql_real_escape_string($product['verkocht'] ). "', '" . mysql_real_escape_string($product['prijs']) . "', '" . mysql_real_escape_string($product['kwaliteit']) . "')");
  
if (!$result) {
//Er is iets fout gegaan.
//Geef de fout weer (niet doen in productie omgeving).

echo "Er is vandaag al geupload!";    

//Zorg dat er zostraks geen COMMIT gedaan wordt.
$insertproblem = true;
        
//Stop met de inserts.
break;
}



if($insertproblem) {
    //Er is een query fout gegaan. Rol alles terug.
    //Maak alle inserts ongedaan.

    mysql_query("ROLLBACK");
}
else {
    //Alles is goed gegaan.
    mysql_query("COMMIT");
}

}

//sluit de connectie met de database
mysql_close($db);
}

?>


<html>
<head>
</head>
<body>

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<input type="submit" value="Submit" /><br>
<textarea cols="65" rows="61" name="text"></textarea><br />

</form>

</body>
</html>
Gewijzigd op 20/06/2011 12:00:17 door Mark van Dijk
 



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.