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

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)

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

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

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

<?
//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!

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>

Reageren