Gegevensinput in 1 keer wegschrijven naar gelinkte tabellen
Ik wil een database maken, waarin de gegevens van een organisatie gelinkt zijn aan de contactgegevens van de medewerkers.
Om het simpel te houden spreken we af: ik heb een tabel 'organisatie' die - het veld ID_organ en het veld naam_organ bevat. De tabel 'medewerkers' bevat ID_medewerker, naam_medewerker, telefoon_medewerker en mail_medewerker.
Het invoeren van de gegevens in beide tabellen zou ik graag vanuit 1 formulier kunnen doen. Nu heb ik al heel wat gelezen op deze site over joins tussen tabellen, maar de gegeven voorbeelden gaan altijd over het uitlezen van gegevens. Daarmee kom ik er niet, denk ik. t Zal bijvoorbeeld nodig zijn om in de tabel medewerkers een extra veld te voorzien waar je de gegevens naartoe schrijft die de koppeling tussen de tabellen moeten helpen maken. Of zie ik dat verkeerd? Graag een duwtje in de goeie richting! 't Lijkt me een goeie investering, want ik kan me voorstellen dat een heleboel Mysql/Php gebruikers met dit probleem worstelen.
Greets!
</zuppo>
je moet even nadenken over je datamodel.
Mogelijkheid 1
Een bedrijf kan meer dan 1 werknemer hebben.
Een werknemer werkt maar bij 1 bedrijf.
In dat geval zou je bij het invullen van de werknemergegevens een selectie moeten kunnen maken uit bedrijven die al in de database zitten. Je moet dan een veld bedrijf_id toevoegen aan je tabel 'medewerkers'.
Mogelijkheid 2
Een bedrijf kan meer dan 1 werknemer hebben.
Een werknemer kan bij meer dan 1 bedrijf werken.
Dat wordt een stuk ingewikkelder, want dat heet een veel-op-veel relatie en die mogen niet in databases. Voordat ik je daar tips over kan geven wil ik graag eerst weten welke mogelijkheid op jouw probleem van toepassing is.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Maar ik vroeg me af of het mogelijk is om vanuit het formulier waar je de bedrijfsgegevens op invult meteen ook werknemers en hun contactgegevens toe te voegen. Of kan dat gewoon niet?
Gewijzigd op 01/01/1970 01:00:00 door zuppo
Proficiat met je 7000+ post. Misschien wordt het verhaal over wat ik wil wat te lang om in detail uit te leggen. Ik denk dat ik ook al verder kan raken met wat jij suggereerde: een bedrijf selecteren bij het invullen van de werknemersgegeven.
</Zuppo>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//bedrijven ophalen uit db
$query = "SELECT id,naam FROM bedrijven";
$result = mysql_query($query) or die (mysql_error());
//bedrijven weergeven in een dropdown.
echo('<select name="bedrijf">');
while ($row = mysql_fetch_array($result)) //onderstaande code voor ieder record uitvoeren.
{
echo('<option value="'.$row['id'].'">'.$row['naam'].'</option>');
}
echo('</select>');
?>
//bedrijven ophalen uit db
$query = "SELECT id,naam FROM bedrijven";
$result = mysql_query($query) or die (mysql_error());
//bedrijven weergeven in een dropdown.
echo('<select name="bedrijf">');
while ($row = mysql_fetch_array($result)) //onderstaande code voor ieder record uitvoeren.
{
echo('<option value="'.$row['id'].'">'.$row['naam'].'</option>');
}
echo('</select>');
?>
dit zet je in een form samen met wat andere velden, en daarna kun je een insert query gebruiken om alles weg te schrijven.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$query = "INSERT INTO werknemers (
veld1,
veld2,
veld3,
veld4)
VALUES
('".$_POST['veld1']."',
'".$_POST['veld2']."',
'".$_POST['veld3']."',
'".$_POST['veld4']."')
";
?>
$query = "INSERT INTO werknemers (
veld1,
veld2,
veld3,
veld4)
VALUES
('".$_POST['veld1']."',
'".$_POST['veld2']."',
'".$_POST['veld3']."',
'".$_POST['veld4']."')
";
?>
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
Als ik het goed begrijp is het de bedoeling om de
inhoud van het veld 'bedrijf' dat je uit de tabel 'bedrijven' geselecteerd hebt toe te voegen aan één van de rijen in de tabel met werknemersgegevens?
Als ik nu later een overzicht wil maken van de bedrijven en per bedrijf alle werknemers, zit ik dan niet in de problemen als 2 bedrijven dezelfde naam blijken te hebben?
</Z>
zoals Jan Koehoorn al zei... gebruik het id van het bedrijf bij de werknemers als bedrijf_id. en select dan de werknemers where bedrijf_id = $row['id']
</Z>
wanneer je een bedrijf toevoegt en vervolgens de werkenemrs kun je in de tussentijd mysql_insert_id() gebruiken om te weten wat het id is van het laatste bedrijf:)
of als het bedrijf al bestaat kun je mijn script gebruiken aangezien de "value" van de dropdown het id van bedrijf is.
Zuppo
Ik ben even aan het werk gegaan met de info uit de vorige posts.
Ik heb een database die 'test' heet en de tabellen 'organisatie' en 'medewerkers' bevat.
De tabel organisatie heeft als kolommen: 'id' en 'naam'
De tabel medewerkers heeft als kolommen: 'ID_medew', 'ID_org', 'medew_naam' en 'telefoon'(met dit laatste veld gebeurt verder niks)
De oplossing van Jan en Stefan bewaar ik voor het selecteren van een sector waar de organisatie in thuishoort in de tabel organisatie. Daarvoor zal ik dan een afzonderlijke tabel 'sector' maken. (Da's voor later)
De oplossing van michel heb ik gebruikt om de gegevensinvoer in de tabel organisatie en medewekers te kunnen doen op zo'n manier dat je er daarna met een join de gegevens terug kan uithalen.
Hieronder zet ik het resultaat even op een rijtje.
Er blijven nog enkele wensen:
- de naam van de organisatie waarvoor nieuwe medewerkers worden ingegeven, verdwijnt vanaf het moment dat de tweede optie van het laatste invulformulier geactiveerd wordt.
- mijn grootste verzuchting blijft: de invoer van zowel organisaties als medewerkers vanuit 1 pagina te kunnen doen. Kan dat met een inline frame of zo?
- in de toekomst wil ik ook aan elke organisatie enkele (niet altijd evenveel) kenmerken toekennen die uit een vaste lijst van een 20-tal items worden geselecteerd. Zijn er suggesties voor hoe je dat aanpakt?
Verder zijn er zeker verbeterpunten en kunnen er dingen strakker, compacter, ...
Graag jullie input.
</zuppo>
1. De tabellen maken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE organisatie (
id int(4) NOT NULL auto_increment,
naam varchar(125) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE medewerkers (
ID_medew int(4) NOT NULL auto_increment,
ID_org int(4) NOT NULL default '0',
medew_naam varchar(120) NOT NULL default '',
telefoon varchar(15) NOT NULL default '',
PRIMARY KEY (ID_medew)
) TYPE=MyISAM;
id int(4) NOT NULL auto_increment,
naam varchar(125) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE medewerkers (
ID_medew int(4) NOT NULL auto_increment,
ID_org int(4) NOT NULL default '0',
medew_naam varchar(120) NOT NULL default '',
telefoon varchar(15) NOT NULL default '',
PRIMARY KEY (ID_medew)
) TYPE=MyISAM;
dataconnect.php
(wordt in de formulierpagina's gebruikt om de verbinding met de database te openen)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$DB_HOST = 'localhost';
$DB_USER = '';
$DB_PASS = '';
$DB_NAME = 'test';
mysql_connect($DB_HOST, $DB_USER, $DB_PASS) or die ("Unable to select database");
mysql_select_db($DB_NAME) or die ("Unable to select database");
?>
$DB_HOST = 'localhost';
$DB_USER = '';
$DB_PASS = '';
$DB_NAME = 'test';
mysql_connect($DB_HOST, $DB_USER, $DB_PASS) or die ("Unable to select database");
mysql_select_db($DB_NAME) or die ("Unable to select database");
?>
Formulier1.php
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
//verbinding maken met de database
include "dataconnect.php";
//instructieregel
echo "<br>Voeg een organisatie toe<br><hr>";
//invulformulier dat toelaat een nieuwe organisatie
//op te nemen in de tabel organisaties
//en het id-veld doorgeeft aan het formulier
//waar je de eerste medewerker op invult
#start invulformulier nieuwe organisatie
echo "<form action=\"formulier2.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
#het ID-veld is auto-increment. De waarde wordt automatisch toegevoegd
//en meegegeven in een hidden field
echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"ID\">";
#veld naam organisatie
echo "<tr>";
echo "<td width=\"125\">Naam organisatie</td><td width=\"75\"><input type=text size=\"70\" name=naam></td>";
echo "</tr>";
echo "</table>\n";
#submit knop + einde formulier1
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
?>
//verbinding maken met de database
include "dataconnect.php";
//instructieregel
echo "<br>Voeg een organisatie toe<br><hr>";
//invulformulier dat toelaat een nieuwe organisatie
//op te nemen in de tabel organisaties
//en het id-veld doorgeeft aan het formulier
//waar je de eerste medewerker op invult
#start invulformulier nieuwe organisatie
echo "<form action=\"formulier2.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
#het ID-veld is auto-increment. De waarde wordt automatisch toegevoegd
//en meegegeven in een hidden field
echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"ID\">";
#veld naam organisatie
echo "<tr>";
echo "<td width=\"125\">Naam organisatie</td><td width=\"75\"><input type=text size=\"70\" name=naam></td>";
echo "</tr>";
echo "</table>\n";
#submit knop + einde formulier1
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
?>
formulier2.php
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
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
<?
//verbinding maken met database
include "dataconnect.php";
//voeg een record toe aan de tabel organisatie
//met de in het eerste formulier opgegeven waarden
$query="INSERT INTO organisatie (id, naam ) VALUES ('".$_POST['id']."','".$_POST['naam']."')";
mysql_query($query)or die(mysql_error());
#toon het id-nummer van de ingevoerde organisatiefiche ter controle
#en steek het id-nummer in een variabele
printf ("Het laatst aan organisaties toegevoegde record heeft id %d\n", mysql_insert_id());
$id= mysql_insert_id();
//instructieregel
echo "<br>";
echo "Voeg medewerkers toe voor: ".$_POST['naam'];
$nm=$_POST['naam'];
echo"<hr>";
//start het invulformulier voor de eerste medewerker
echo "<form action=\"formulier3.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
echo ('<INPUT TYPE="hidden" NAME="ID_org" VALUE="'.$id.'">');
echo ('<INPUT TYPE="hidden" NAME="naam_org" VALUE="'.$nm.'">');
# inputbox naam medewerker1
echo "<tr>";
echo "<td width=\"125\" valign=top>Naam medewerker</td><td width=\"75\"><input type=text size=\"70\" name=medewerker></td>";
echo "</tr>";
echo "</table>\n";
# submit knop + einde formulier2
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
?>
//verbinding maken met database
include "dataconnect.php";
//voeg een record toe aan de tabel organisatie
//met de in het eerste formulier opgegeven waarden
$query="INSERT INTO organisatie (id, naam ) VALUES ('".$_POST['id']."','".$_POST['naam']."')";
mysql_query($query)or die(mysql_error());
#toon het id-nummer van de ingevoerde organisatiefiche ter controle
#en steek het id-nummer in een variabele
printf ("Het laatst aan organisaties toegevoegde record heeft id %d\n", mysql_insert_id());
$id= mysql_insert_id();
//instructieregel
echo "<br>";
echo "Voeg medewerkers toe voor: ".$_POST['naam'];
$nm=$_POST['naam'];
echo"<hr>";
//start het invulformulier voor de eerste medewerker
echo "<form action=\"formulier3.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
echo ('<INPUT TYPE="hidden" NAME="ID_org" VALUE="'.$id.'">');
echo ('<INPUT TYPE="hidden" NAME="naam_org" VALUE="'.$nm.'">');
# inputbox naam medewerker1
echo "<tr>";
echo "<td width=\"125\" valign=top>Naam medewerker</td><td width=\"75\"><input type=text size=\"70\" name=medewerker></td>";
echo "</tr>";
echo "</table>\n";
# submit knop + einde formulier2
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
?>
formulier3.php
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
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
<?
//verbinding maken met database
include "dataconnect.php";
//instructieregel
echo "<br>Voeg medewerkers toe voor: ".$_POST['naam_org']."<br><hr>";
//start het invulformulier voor volgende medewerkers
echo "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
echo ('<INPUT TYPE="hidden" NAME="ID_org" VALUE="'.$_POST['ID_org'].'">');
//inputbox naam medewerker 2 en volgende
echo "<tr>";
echo "<td width=\"125\" valign=top>Naam medewerker</td><td width=\"75\"><input type=text size=\"70\" name=medewerker2></td>";
echo "</tr>";
echo "</table>\n";
//submit knop
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
//onderscheid maken tussen een post van vorig en van huidig formulier
//we beginnen bij een post uit vorig vorig formulier
if ($_POST['medewerker']){
$query="INSERT INTO medewerkers (ID_org, medew_naam ) VALUES ('".$_POST['ID_org']."','".$_POST['medewerker']."')";
mysql_query($query)or die(mysql_error());
}
//verwerk een eerste en volgende posts uit dit formulier
if ($_POST['medewerker2']) {
$query="INSERT INTO medewerkers (ID_org, medew_naam ) VALUES ('".$_POST['ID_org']."','".$_POST['medewerker2']."')";
mysql_query($query)or die(mysql_error());
}
print "<br>";
printf ("Laatst aan medewerkers toegevoegde record heeft id %d\n", mysql_insert_id());
echo "<br>";
//left-join query van organisatie (elk record) naar medewerkers (corresponderende)
//de query wordt beperkt tot de records in de tabel medewerkers die beantwoorden
//aan het veld ID_org in deze tabel
$orgid=$_POST['ID_org'];
$query = "SELECT organisatie.id,organisatie.naam, medewerkers.medew_naam FROM organisatie LEFT JOIN medewerkers ON organisatie.id = medewerkers.ID_org WHERE medewerkers.ID_org=$orgid";
$result = mysql_query($query) or die(mysql_error());
// toon (id) naam van de organisatie en de records van elke
//corresponderende rij in medewerkers
while($row = mysql_fetch_array($result)) {
echo "<br>(".$row['id'].") ";
echo $row['naam']. " ---------------- ". $row['medew_naam'];
}
?>
//verbinding maken met database
include "dataconnect.php";
//instructieregel
echo "<br>Voeg medewerkers toe voor: ".$_POST['naam_org']."<br><hr>";
//start het invulformulier voor volgende medewerkers
echo "<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">\n";
echo "<table width= \"700\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" bgcolor=\"#ccccee\">\n";
echo ('<INPUT TYPE="hidden" NAME="ID_org" VALUE="'.$_POST['ID_org'].'">');
//inputbox naam medewerker 2 en volgende
echo "<tr>";
echo "<td width=\"125\" valign=top>Naam medewerker</td><td width=\"75\"><input type=text size=\"70\" name=medewerker2></td>";
echo "</tr>";
echo "</table>\n";
//submit knop
echo "<input type=submit value=\"Voeg toe\">\n";
echo "</form>\n";
//onderscheid maken tussen een post van vorig en van huidig formulier
//we beginnen bij een post uit vorig vorig formulier
if ($_POST['medewerker']){
$query="INSERT INTO medewerkers (ID_org, medew_naam ) VALUES ('".$_POST['ID_org']."','".$_POST['medewerker']."')";
mysql_query($query)or die(mysql_error());
}
//verwerk een eerste en volgende posts uit dit formulier
if ($_POST['medewerker2']) {
$query="INSERT INTO medewerkers (ID_org, medew_naam ) VALUES ('".$_POST['ID_org']."','".$_POST['medewerker2']."')";
mysql_query($query)or die(mysql_error());
}
print "<br>";
printf ("Laatst aan medewerkers toegevoegde record heeft id %d\n", mysql_insert_id());
echo "<br>";
//left-join query van organisatie (elk record) naar medewerkers (corresponderende)
//de query wordt beperkt tot de records in de tabel medewerkers die beantwoorden
//aan het veld ID_org in deze tabel
$orgid=$_POST['ID_org'];
$query = "SELECT organisatie.id,organisatie.naam, medewerkers.medew_naam FROM organisatie LEFT JOIN medewerkers ON organisatie.id = medewerkers.ID_org WHERE medewerkers.ID_org=$orgid";
$result = mysql_query($query) or die(mysql_error());
// toon (id) naam van de organisatie en de records van elke
//corresponderende rij in medewerkers
while($row = mysql_fetch_array($result)) {
echo "<br>(".$row['id'].") ";
echo $row['naam']. " ---------------- ". $row['medew_naam'];
}
?>
Voilà c'est tout!
Gewijzigd op 01/01/1970 01:00:00 door zuppo
Ondertussen heb ik de tut over database-normalisatie gevonden en doorgenomen. Daar zitten heel wat nuttige hints in over de organisatie van een database. Ik leid er ondermeer uit af dat ik van het ID_org en medew_naam veld in de medewerkerstabel best een gedeeld sleutelveld kan maken. Op die manier kan je bv. vermijden dat per vergissing 2 keer dezelfde medewerker wordt ingegeven voor 1 organisatie. Nog eens: bedankt voor de hints en tips iedereen en ... long may you run!
</Zuppo>