ik ben bezig online ledenregister en gebruik dit script om te zoeken:
<?php
mysql_select_db("ledenregister2") or die(mysql_error());

$aantal = mysql_num_rows(mysql_query("SELECT * FROM leden")) or die(mysql_error());

if (!$_POST['zoek']){
?/>
<form name="zoeken" action="" method="post">
<table cellspacing="0" width="680px" align="center" border="0">
<tr><td align="center" colspan="2"><input size="60" type="text" name="zoek" maxlength="60"> </td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="submit" value="Zoeken"></td></tr>
</table>
</form>
<?php
}
else{
if(strlen($_POST['zoek']) < 4) {
echo "De zoekterm moet minimaal 4 tekens lang zijn.";
}
else
{
$keyword = mysql_real_escape_string($_POST['zoek']);
$query = "SELECT *, DATE_FORMAT(geb_datum, '%d-%m-%Y') AS geb_datum2 FROM leden
WHERE MATCH (voornaam, achternaam)
AGAINST ('$keyword' IN BOOLEAN MODE)
ORDER BY volgorde, type ASC";
$resultaat = mysql_query($query);
if (mysql_num_rows($resultaat) >= 1)
{
echo "De volgende resultaten zijn gevonden:";

while ($row = mysql_fetch_array($resultaat))
{

?/>
<table border="1">
<tr>
<td width="250px"><?php echo($row['voornaam']." ".$row['voorvoeg']." ".$row['achternaam']) ?/></td>
<td width="100px"><?php echo($row['geb_datum2']) ?/></td>
<td width="20px"><?php echo(($row['status'] == 1) ? 'D' : (($row['status'] == 2) ? 'B' : "")) ?/></td>
<td width="200px" rowspan="3"><?php echo ($row['adres']."<br>
".$row['postcode']." ".$row['woonplaats']."<br>
".$row['telefoon']) ?/></td>
<td width="20px" style="text-align:right" rowspan="3"><?php echo($row['wijk']) ?/></td>
</tr>
<tr><td><?php echo($row['email']) ?/></td></tr>
</table>
<?php
}
}
else{
echo "<br>Er is niets gevonden op jou zoekterm";
}
}
}
?>
( ?/> = ?> maar als ik dat gebruik maakt ie dr niet 1 codevak van )

maar als ik nu zoek op bijv een achternaam van een famillie krijg ik alle leden van die familie in een aparte tabel..
vb:

<table>
HOOFDBEWONER
</table>
<table>
eventuele PARTNER
</table>
<table>
eventuele kinderen
</table>
<table>
eventuele kinderen
</table>

in mij mysql tabel heb ik een kolom "volgorde" in deze kolom hebben alle families een unieke code dus alle leden van een familie hebben dezelfde code

ook heb ik de kolom:
TYPE = type van persoon (0= hoofdbewoner, 1= partner, 2= kind)


hoe ik nu wil dat mijn resulaten worden weergegeven 1 tabel met daarin alle leden van die familie:
http://img215.imageshack.us/img215/5904/layoutsr0.png
de bovenste is de hoofdbewoner. (type 0)
daaronder de eventuele (dus deze hoeft niet aanwezig te zijn) partner (type 1)
en daaronder de eventuele (ook deze hoeven niet aanwezig te zijn) kinderen (type 2)


ook als maar 1 lid van een bepaalde familie in de zoekresultaten voorkomt moet de hele familie worden weergegeven..

kan dit? zoja hoe doe ik dit..
ben nog niet echt heel goed met php/mysql dus uitgebreide uitleg word gewardeerd...
Blanche schreef op 06.02.2008 21:53
Aangezien 'volgorde' de unieke waarde is krijg je in die tabel een PK op die kolom. Verder lijkt me dat in de andere tabel het lidnummer de unieke waarde is, dus dan komt daar de PK op te zitten. Tenslotte gok ik dat 'gezinsnummer' de kolom is die naar de 'volgorde' kolom uit de andere tabel verwijst. In dat geval zou dat dus de FK worden.

volgorde is geen unieke waarde dit was een fout van mij..
in de tabel adressen is de unieke waarde 'nummer'.
in tabel leden is 'lidnummer' de unieke waarde.

gezinsnummer verwijst naar nummer, maar hoe stel ik die FK in?

Blanche schreef op 06.02.2008 21:53

Verder zul je nog enkele indexen aan willen maken op bepaalde kolommen, maar dat hangt een beetje van de queries af die je voornamelijk gaat gebruiken.

dit kan later altijd nog gedaan worden wanneer dat nodig is.
in tabel leden is 'gezinsnummer' de unieke waarde.
Het lijkt me niet dat dat kan. Er zijn immers toch meerdere gezinsleden met hetzelfde gezinsnummer?

Persoonlijk kies ik er altijd voor om in (bijna) elke tabel een kolom 'id' met auto_increment op te nemen die ik de PK maak. Op die manier heb je altijd een unieke waarde om records mee aan te duiden.

Elk gezinslid zal bijvoorbeeld een unieke waarde moeten hebben, ongeacht tot welk gezin ze behoren. Hoewel dat in theorie ook een combinatie van bijvoorbeeld gezinsnummer, naam en geboortedatum kan zijn, is het vaak makkelijker om gewoon een uniek id te gebruiken.
gezinsnummer moest zijn lidnummer..

en ik zal (nu niet, maar morgen) dan wel een kolom 'id' aanmaken bij beide tabellen

en hoe stel ik dan die FK in?
ok.. wat ik nu gedaan heb:

in beide tabellen een kolom ID ( int(11) ) aangemaakt met auto_increment

ik heb adressen.nummer en leden.gezinsnummer beide een index gegeven en toen naar elkaar gelinkt
moet er ook nog wat bij ON DELETE en ON UPDATE komen?
Dat is wel aan te raden, maak een keuze tussen RESTRICT en CASCADE. Alleen wanneer je heel zeker weet dat het geen kwaad kan, kun je CASCADE gebruiken.

Mocht je de boel niet helemaal lekker koppelen en dan met CASCADE aan de slag gaan, kun je door het verwijderen van 1 record de hele database in 1x leeggooien... Het zal niet snel gebeuren, maar het kan.
ok maar dat is niet heel erg belangrijk volgens mij.. en kan natuurlijk altijd nog aangepast

hoe ga ik nu te werk nu ik 2 goede tabellen heb?
(ze zijn nu goed toch?)


Blanche schreef op 06.02.2008 21:53
Dat is het grote nadeel van MySQL, het is het een of het ander. En dan zou ik toch echt voor de InnoDB engine gaan aangezien die relaties een stuk belangrijker zijn!
wat ik me bedacht dat ik natuurlijk nog een tabel aan kan maken die MyISAM is en die dan gebruiken voor fulltext search en dan door middel van het gezinsnummer o.i.d. de resultaten uit de andere tabellen laden...
FULLTEXT SEARCH heb je maar zelden nodig, ik heb er nog nooit mee gewerkt. Wel eens wat mee liggen rommelen om het te leren kennen (TSeach2), maar daar houdt het mee op.

MyISAM is rotzooi, ga daar je vingers niet aan branden. Probeer eerst een goed systeem te bouwen met innoDB, daar kun je ook wel een FULLTEXT SEARCH voor maken, mocht je daar zin in hebben. Maar vergeet het bestaan van MyISAM, dat is het toppunt van onbetrouwbaarheid en een bewijs van onkunde.
oke

zijn mijn tabellen goed nu?
en hoe moet ik nu verder, hoe moet ik mijn huidge script aanpassen zodat het met de 2 tabellen werkt
heb het nu zo werkend.. het geeft het nu weer zoals ik het wil hebben
dit is met mn oude tabel (alles in 1 tabel)

weet niet of het nu nog verstandig is om het toch nog over te zetten naar 2 tabellen?
of kan ik het zo laten...

<?php if (!$_POST['zoek']){
?/>
<form name="zoeken" action="" method="post">
<table cellspacing="0" width="680px" align="center" border="0">
<tr><td align="center" colspan="2"><input size="60" type="text" name="zoek" maxlength="60"> </td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="submit" value="Zoeken"></td></tr>
</table>
</form>
<?php
}
else{
if(strlen($_POST['zoek']) < 4) {
echo "De zoekterm moet minimaal 4 tekens lang zijn.";
}
else
{
$keyword = mysql_real_escape_string($_POST['zoek']);
$query = "SELECT * FROM leden
WHERE MATCH (voornaam, achternaam)
AGAINST ('".$keyword."' IN BOOLEAN MODE)
GROUP BY gezinsnaam, volgorde
ORDER BY gezinsnaam, volgorde, type ASC";
$resultaat = mysql_query($query);
if (mysql_num_rows($resultaat) >= 1)
{
echo "De volgende resultaten zijn gevonden:";

while ($row = mysql_fetch_array($resultaat))
{
$query20 = "SELECT *, DATE_FORMAT(geb_datum, '%d-%m-%Y') AS geb_datum2 FROM leden
WHERE volgorde = '".$row['volgorde']."'
AND gezinsnaam = '".$row['gezinsnaam']."'
AND type = '0'
ORDER BY type";
$resultaat20 = mysql_query($query20);
while ($row20 = mysql_fetch_array($resultaat20))
{
$row20mail = $row20['email'];
?/>
<table cellspacing="0" class="resultaten">
<tr>
<td width="250px"><?php echo($row20['achternaam']." ".$row20['voornaam']." ".$row20['voorvoeg']) ?/></td>
<td width="100px"><?php echo($row20['geb_datum2']) ?/></td>
<td width="20px"><?php echo(($row20['status'] == 1) ? 'D' : (($row20['status'] == 2) ? 'B' : "")) ?/></td>
<td width="200px" rowspan="3"><?php echo ($row20['adres']."<br>
".$row20['postcode']." ".$row20['woonplaats']."<br>
".$row20['telefoon']) ?/></td>
<td width="20px" style="text-align:right; vertical-align:middle" rowspan="3"><?php echo($row20['wijk']) ?/></td>
</tr>

<?php }
$query21 = "SELECT *, DATE_FORMAT(geb_datum, '%d-%m-%Y') AS geb_datum2 FROM leden
WHERE volgorde = '".$row['volgorde']."'
AND gezinsnaam = '".$row['gezinsnaam']."'
AND type = '1'
ORDER BY type";
$resultaat21 = mysql_query($query21);
while ($row21 = mysql_fetch_array($resultaat21))
{ ?/>

<tr>
<td width="250px"><?php echo($row21['achternaam']." ".$row21['voornaam']." ".$row21['voorvoeg']) ?/></td>
<td width="100px"><?php echo($row21['geb_datum2']) ?/></td>
<td width="20px"><?php echo(($row21['status'] == 1) ? 'D' : (($row21['status'] == 2) ? 'B' : "")) ?/></td>
</tr>

<?php }
$query22 = "SELECT *, DATE_FORMAT(geb_datum, '%d-%m-%Y') AS geb_datum2 FROM leden
WHERE volgorde = '".$row['volgorde']."'
AND gezinsnaam = '".$row['gezinsnaam']."'
AND type = '2'
ORDER BY type";
$resultaat22 = mysql_query($query22);
while ($row22 = mysql_fetch_array($resultaat22))
{ ?/>

<tr>
<td width="250px"><?php echo("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$row22['voornaam']) ?/></td>
<td width="100px"><?php echo($row22['geb_datum2']) ?/></td>
<td width="20px"><?php echo(($row22['status'] == 1) ? 'D' : (($row22['status'] == 2) ? 'B' : "")) ?/></td>
</tr>

<?php } ?/>

<tr><td><?php echo($row20mail) ?/></td></tr>
</table>
<?php

}
}
else{
echo "<br>Er is niets gevonden op jou zoekterm";
}
}
}
?>

Reageren