Gegevensinput in 1 keer wegschrijven naar gelinkte tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Zuppo

zuppo

03/08/2006 17:19:00
Quote Anchor link
Hey php-end universum,
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>
 
PHP hulp

PHP hulp

17/11/2024 17:24:44
 
Jan Koehoorn

Jan Koehoorn

03/08/2006 18:17:00
Quote Anchor link
Hoi 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
 
Zuppo

zuppo

03/08/2006 18:43:00
Quote Anchor link
Mogelijkheid 1 is de optie waar ik voor ga. (Da's al moeilijk genoeg)
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
 
Zuppo

zuppo

04/08/2006 11:33:00
Quote Anchor link
Jan,

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>
 
Stefan van Iwaarden

Stefan van Iwaarden

04/08/2006 11:58:00
Quote Anchor link
als je dan een tabel met bedrijven hebt, kun je het volgende doen om een dropdown met de verschillende bedrijven te krijgen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>');
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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']."')
"
;
?>
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
 
Zuppo

zuppo

04/08/2006 12:28:00
Quote Anchor link
OK, Stefan. Wel bedankt voor je reactie. Ik denk dat ik zie wat je bedoelt. Dat lijkt me een heel bruikbare suggestie. (Ik probeer nog effe uit).

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

M Ypma

04/08/2006 12:32:00
Quote Anchor link
zuppo, dit kan je voorkomen door de bedrijven ook een id te geven.
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']
 
Zuppo

zuppo

04/08/2006 12:40:00
Quote Anchor link
OK. Michel, maar wat ik wil is dat de inhoud van het veld bedrijf_ID automatisch kan worden overgenomen uit de tabel bedrijven. Dus: dat ik niet 'manueel' het veld bedrijfsid moet invullen. Dat kan waarschijnlijk door uit de tabel bedrijven het id-veld mee te betrekken in de selectie?
</Z>
 
M Ypma

M Ypma

04/08/2006 12:45:00
Quote Anchor link
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:)
 
Stefan van Iwaarden

Stefan van Iwaarden

04/08/2006 12:54:00
Quote Anchor link
of als het bedrijf al bestaat kun je mijn script gebruiken aangezien de "value" van de dropdown het id van bedrijf is.
 
Zuppo

zuppo

04/08/2006 13:01:00
Quote Anchor link
Dat had ik inmiddels ook in het snuitje gekregen... Jullie zijn een schitterende club. Ongeloofelijk bedankt allemaal! Ik denk dat veel beginnende database-bouwers hier iets aan zullen hebben.

Zuppo
 
Zuppo

zuppo

06/08/2006 16:14:00
Quote Anchor link
'lo iedereen,

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


dataconnect.php
(wordt in de formulierpagina's gebruikt om de verbinding met de database te openen)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");
?>


Formulier1.php
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
<?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";
?>


formulier2.php
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
<?
//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:&nbsp;&nbsp;&nbsp;".$_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)
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
<?
//verbinding maken met database
include "dataconnect.php";
//instructieregel
echo "<br>Voeg medewerkers toe voor:&nbsp;&nbsp;&nbsp;".$_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
 
Zuppo

zuppo

07/08/2006 22:42:00
Quote Anchor link
OK. 'k snap het. Ben misschien wat impulsief omgesprongen met sommige hints (over m'n datamodel bv). 't Zit deels in m'n karakter. Maar ik was er heel erg op gebrand om te weten hoe ik de gegevensinvoer op formulierniveau gerealiseerd kan krijgen. Uit m'n enthousiasme dat er maar liefst 2 werkbare oplossingen werden aangereikt, heb ik er me toe laten verleiden om wat te willen teruggeven voor wat ik gekregen had. Voor wie al wat langer bezig is, komen die oplossingen misschien nogal vergezocht over. Ik ben er voorlopig nog een beetje fier op dat 't me toch lukt om te doen wat ik wou doen.
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>
 



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.