array komt niet aan bij de database
Ik heb een script opgesteld waarmee ik een portfolio item in de database kan plaatsen. Nu komt het formulier wel aan, maar de array gegevens worden niet verstuurd. In de database komt in die kolom ook te staan 'array'. Hoe kan ik dat goed doen?
Dit zijn de scripts die ik momenteel heb.
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
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Mijn eerste php formulier!</title>
</head>
<body>
<form action="verstuur_portfolio.php" method="post">
<p>
<label for="titel">Titel:</label>
<input type="text" name="titel" id="titel" size="50" />
</p>
<p>
<label for="opdrachtgever">Opdrachtgever:</label>
<input type="text" name="opdrachtgever" id="opdrachtgever" />
</p>
<p>
<label for="website">Website:</label>
<input type="text" name="website" id="website" />
</p>
<p>
<label for="jaar">Jaar:</label>
<input type="text" name="jaar" id="jaar" />
</p>
<p>
<input type="checkbox" name="technieken[]" value="pro.cms" />Pro.CMS <br />
<input type="checkbox" name="technieken[]" value="seo" />SEO <br />
<input type="checkbox" name="technieken[]" value="webshop" />Webshop <br />
<input type="checkbox" name="technieken[]" value="clickstream" />Clickstream <br />
<input type="checkbox" name="technieken[]" value="usability" />Usability <br />
</p>
<p>
<input type="checkbox" name="categorie[]" value="websites" />websites <br />
<input type="checkbox" name="categorie[]" value="vindbaarheid" />Vindbaarheid <br />
<input type="checkbox" name="categorie[]" value="hosting" />Hosting <br />
<input type="checkbox" name="categorie[]" value="webshop" />Webshop <br />
<input type="checkbox" name="categorie[]" value="clickstream" />Clicksteam <br />
<input type="checkbox" name="categorie[]" value="usability" />Usability <br />
<input type="checkbox" name="categorie[]" value="huisstijlontwerp" />Huisstijlontwerp <br />
<input type="checkbox" name="categorie[]" value="visitekaarjtes" />Visitekaartjes <br />
<input type="checkbox" name="categorie[]" value="brochures" />Brochures <br />
<input type="checkbox" name="categorie[]" value="briefpapier" />Briefpapier <br />
</p>
<p>
<label for="omschrijving">Omschrijving:</label>
<textarea name="omschrijving" rows="4" cols="50"></textarea>
</p>
<p>
<input type="submit" value="Verzenden"/>
</p>
</form>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Mijn eerste php formulier!</title>
</head>
<body>
<form action="verstuur_portfolio.php" method="post">
<p>
<label for="titel">Titel:</label>
<input type="text" name="titel" id="titel" size="50" />
</p>
<p>
<label for="opdrachtgever">Opdrachtgever:</label>
<input type="text" name="opdrachtgever" id="opdrachtgever" />
</p>
<p>
<label for="website">Website:</label>
<input type="text" name="website" id="website" />
</p>
<p>
<label for="jaar">Jaar:</label>
<input type="text" name="jaar" id="jaar" />
</p>
<p>
<input type="checkbox" name="technieken[]" value="pro.cms" />Pro.CMS <br />
<input type="checkbox" name="technieken[]" value="seo" />SEO <br />
<input type="checkbox" name="technieken[]" value="webshop" />Webshop <br />
<input type="checkbox" name="technieken[]" value="clickstream" />Clickstream <br />
<input type="checkbox" name="technieken[]" value="usability" />Usability <br />
</p>
<p>
<input type="checkbox" name="categorie[]" value="websites" />websites <br />
<input type="checkbox" name="categorie[]" value="vindbaarheid" />Vindbaarheid <br />
<input type="checkbox" name="categorie[]" value="hosting" />Hosting <br />
<input type="checkbox" name="categorie[]" value="webshop" />Webshop <br />
<input type="checkbox" name="categorie[]" value="clickstream" />Clicksteam <br />
<input type="checkbox" name="categorie[]" value="usability" />Usability <br />
<input type="checkbox" name="categorie[]" value="huisstijlontwerp" />Huisstijlontwerp <br />
<input type="checkbox" name="categorie[]" value="visitekaarjtes" />Visitekaartjes <br />
<input type="checkbox" name="categorie[]" value="brochures" />Brochures <br />
<input type="checkbox" name="categorie[]" value="briefpapier" />Briefpapier <br />
</p>
<p>
<label for="omschrijving">Omschrijving:</label>
<textarea name="omschrijving" rows="4" cols="50"></textarea>
</p>
<p>
<input type="submit" value="Verzenden"/>
</p>
</form>
</body>
</html>
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
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
<?php
include 'db_connect.php';
/**
* @author Jurgen
* @copyright 2008
* @company Prodes
*/
/** Controleerd of een formulier gepost is */
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
/** Array declaren voor opslag van fouten en data*/
$aErrors = array();
$aData = array();
/** Velden die in het formulier aanwezig moeten zin */
$aFormulierVelden = array('titel', 'opdrachtgever', 'website', 'jaar', 'technieken', 'categorie', 'omschrijving');
/** alle formuliervelden doorlopen */
foreach($aFormulierVelden as $sVeld)
{
/** Controleren of er een waarde voor het formulierveld bestaat */
if(isset($_POST[$sVeld]))
{
/** Spaties aan begin en eind weghalen */
$sValue = trim($_POST[$sVeld]);
/** controleren of een variabele/veld gevuld is */
if(empty($sValue))
{
/** foutmelding toevoegen */
$aErrors[] = 'Je bent vergeten om je '.$sVeld.' in te vullen';
}
/** Ingevulde waarden aan data array toevoegen */
$aData[$sVeld] = $sValue;
}
else
{
$aErrors[] = 'Het veld '.$sVeld.' kon niet verstuurd worden.';
}
}
/** Controleren of er geen founten zijn opgetreden */
if(empty($aErrors))
{
$sql = "
INSERT INTO portfolio (
titel,
opdrachtgever,
website,
jaar,
technieken,
categorie,
omschrijving
)
VALUES (
'".$aData['titel']."',
'".$aData['opdrachtgever']."',
'".$aData['website']."',
'".$aData['jaar']."',
'".$aData['technieken']."',
'".$aData['categorie']."',
'".$aData['omschrijving']."'
)
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error(). '<br />In query:' .$sql);
}
else
{
$id = mysql_insert_id();
}
}
else
{
/** Fouten opgetreden: weergeven en terug naar het formulier */
header('Refresh: 3; url=portfolio_toevoegen.php');
foreach($aErrors as $sError)
{
echo '<p style="color:red">'.$sError.'</p>';
}
}
}
else
{
/** Verwerk.php mag nog niet bezocht worden, terug naar het formulier */
header('Location: portfolio_toevoegen.php');
}
?>
include 'db_connect.php';
/**
* @author Jurgen
* @copyright 2008
* @company Prodes
*/
/** Controleerd of een formulier gepost is */
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
/** Array declaren voor opslag van fouten en data*/
$aErrors = array();
$aData = array();
/** Velden die in het formulier aanwezig moeten zin */
$aFormulierVelden = array('titel', 'opdrachtgever', 'website', 'jaar', 'technieken', 'categorie', 'omschrijving');
/** alle formuliervelden doorlopen */
foreach($aFormulierVelden as $sVeld)
{
/** Controleren of er een waarde voor het formulierveld bestaat */
if(isset($_POST[$sVeld]))
{
/** Spaties aan begin en eind weghalen */
$sValue = trim($_POST[$sVeld]);
/** controleren of een variabele/veld gevuld is */
if(empty($sValue))
{
/** foutmelding toevoegen */
$aErrors[] = 'Je bent vergeten om je '.$sVeld.' in te vullen';
}
/** Ingevulde waarden aan data array toevoegen */
$aData[$sVeld] = $sValue;
}
else
{
$aErrors[] = 'Het veld '.$sVeld.' kon niet verstuurd worden.';
}
}
/** Controleren of er geen founten zijn opgetreden */
if(empty($aErrors))
{
$sql = "
INSERT INTO portfolio (
titel,
opdrachtgever,
website,
jaar,
technieken,
categorie,
omschrijving
)
VALUES (
'".$aData['titel']."',
'".$aData['opdrachtgever']."',
'".$aData['website']."',
'".$aData['jaar']."',
'".$aData['technieken']."',
'".$aData['categorie']."',
'".$aData['omschrijving']."'
)
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error(). '<br />In query:' .$sql);
}
else
{
$id = mysql_insert_id();
}
}
else
{
/** Fouten opgetreden: weergeven en terug naar het formulier */
header('Refresh: 3; url=portfolio_toevoegen.php');
foreach($aErrors as $sError)
{
echo '<p style="color:red">'.$sError.'</p>';
}
}
}
else
{
/** Verwerk.php mag nog niet bezocht worden, terug naar het formulier */
header('Location: portfolio_toevoegen.php');
}
?>
LET OP: technieken en categorie kunnen meerdere types zijn.
In welke kolom komt Array te staan?
Quote:
De array's technieken en categorie zul je met een aparte foreach-lus moeten uitlezen, dat sla je nu in zijn geheel over.In de database komt in die kolom ook te staan 'array'. Hoe kan ik dat goed doen?
Daarnaast zul je deze gegevens in een aparte (koppel-) tabel moeten opslaan, dit wil je echt niet in dezelfde tabel hebben als de andere gegevens. Je zult dus meerdere INSERT-queries moeten uitvoeren, voor iedere categorie en voor iedere techniek een aparte query.
@Gerben Jacobs: In de kolom technieken & categorie
Jurgen B schreef op 10.03.2008 12:47:
Die kolommen kun je verwijderen, dat scheelt weer.@Gerben Jacobs: In de kolom technieken & categorie
Zoals reeds gezegd, schrijf de data weg in een aparte (koppel-) tabel.
Ik heb al wel een tabel categorie en die kan ik ook wel koppelen doormiddel van een foreign key, maar ik heb net mn tutorial klaar en weet dus nog niet hoe ik 2 foreign keys aan een tabel kan hangen. Ik krijg dan namelijk een foutmelding en ik zou ook echt (nog) niet weten hoe ik data naar meerdere tabellen moet sturen! En hoe de uitkomst van een array te versturen naar een database is me ook nog een raadsel om heel eerlijk te zijn :$
Quote:
een foutmelding
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
*
FROM
glazen_bol
WHERE
username = 'Jurgen B'
AND
subject = 'foreign key'
AND
foutmelding = 'een foutmelding'
*
FROM
glazen_bol
WHERE
username = 'Jurgen B'
AND
subject = 'foreign key'
AND
foutmelding = 'een foutmelding'
...
Niet voor de insert into. Ik zou zeggen:
$sql = "
INSERT INTO (
p.titel,
p.opdrachtgever,
p.website,
p.jaar,
t.technieken,
c.categorie,
p.omschrijving
FROM
portfolio AS p
INNER JOIN
categorie AS c
ON c.id = p.categorie_id
INNER JOIN
techniek AS t
ON t.id = p.techniek_id
)
VALUES (
'".$aData['p.titel']."',
'".$aData['p.opdrachtgever']."',
'".$aData['p.website']."',
'".$aData['p.jaar']."',
'".$aData['t.technieken']."',
'".$aData['c.categorie']."',
'".$aData['p.omschrijving']."'
)
";
Klopt dat?
Gewijzigd op 01/01/1970 01:00:00 door Jurgen B
dus $aData['title'] ip $aData['p.title'] ?
Daarnaast zul je de array's in $aData['technieken'] en $aData['categorie'] nog apart moeten uitlezen met bv. een foreach, dat doe je hier helemaal nergens. Er klopt echt maar weinig van je huidige opzet.
Je hebt 3 tabellen: portfolio, categorie en techniek. Dat duidt op een meer-op-meer relaties, 1 portfolio kan meerdere technieken bevatten en meerdere technieken kunnen bij meerdere portfolios horen. Idem voor de categorieen. Daar missen dus 2 tabellen, je hebt dan 2 koppeltabellen nodig:
portfolio_categorie en portfolio_techniek. En dat zijn de tabellen waarin je de gekozen categorieen en gekozen technieken in weg moet schrijven. Aparte tabellen, dus ook aparte queries!
Om een idee te geven:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
INSERT INTO portfolio() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_techniek() VALUES();
INSERT INTO portfolio_techniek() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_categorie() VALUES();
INSERT INTO portfolio_techniek() VALUES();
INSERT INTO portfolio_techniek() VALUES();
Nu maak je 1 portfolio aan met 3 categorieen en 2 technieken. De details mag je verder zelf even uitvogelen, maar je hebt nog wel wat meer SQL nodig om e.e.a. veilig uit te kunnen voeren. Het gebruik van een transaction ligt ook voor de hand, er kan namelijk een hoop fout gaan. Maar om dan direct met een corrupte database opgescheept te zitten, dat is ook weer wat overdreven, een transaction beschermt je daartegen.
Heeft iemand een uitleg over hoe de uitkomst van een array naar de database verstuurd kan worden?