van MYSQL query naar 'slimme' tabel in PHP
TABLE `Tbl_Evenementen` (
`EvenementID` int(11) NOT NULL auto_increment,
`Evenement` text NOT NULL,
`Begin` timestamp NOT NULL default CURRENT_TIMESTAMP,
`Eind` timestamp NOT NULL default '0000-00-00 00:00:00',
`HeleDag` tinyint(1) NOT NULL default '0',
`Herinneren` tinyint(1) NOT NULL default '0',
`Herinnering` timestamp NULL default '0000-00-00 00:00:00',
`Locatie` text NOT NULL,
`Max` smallint(6) default NULL COMMENT 'Maximaal aantal deelnemers',
`Aankondiging` varchar(100) default 'Aan' COMMENT 'Aankondiging pagina',
`Uitleg` varchar(100) default 'Uit' COMMENT 'Uitnodiging pagina',
`Deelnemers` varchar(100) default 'Deel' COMMENT 'Deelnemer overzicht',
`Opmerkingen` longtext,
`Krant` longtext COMMENT 'Krantenartikel',
PRIMARY KEY (`EvenementID`),
FULLTEXT KEY `Evenement` (`Evenement`,`Locatie`,`Opmerkingen`),
FULLTEXT KEY `Aankondiging` (`Aankondiging`,`Uitleg`,`Deelnemers`)
);
en wil een pagina maken die er uit ziet als:
Naam Deelnemers
-------------------------------|--------------
Clubkampioenschappen Deelnemers
Open dubbeltoernooi Deelnemers
Uitwisseling Neerpelt Deelnemers
waarbij beide kolommen een link is die een php pagina oproept, zoiets als;
<a href="index.php?pid=DeelClubkampioenschappen" >Deelnemers</a>
Nu wil ik deze pagina vanuit mijn sql tabel automatisch opbouwen.
Het is me gelukt om een tabel met waarden te genereren, maar niet de tabel met links.
Mijn routine begint met
$query='SELECT Begin, Evenement, Aankondiging, Deelnemers FROM Tbl_Evenementen WHERE eind>=CURRENT_TIMESTAMP() ORDER BY Begin ASC';
Waarbij;
Evenement de naam van de link is
Aankondiging en deelnemers de namen van de php pagina.
Mijn link zou er dus als volgt uit moeten zien:
<a href="index.php?pid=[Aankondiging] >[Evenement]</a>
waarbij [Aankondiging] de waarde vertegenwoordigt uit mijn tabel.
Kan iemand mij op weg helpen??
Veldbennamingen zijn onduidelijk ten aanzien van type/lengte/default waarde/comment.
Advies is om eens goed te gaan normaliseren.
Je gaat in ieder geval al de fout in bij:
- geen timestamps maar gewoon DATE/DATETIME
- geen default waarde van 0000-00-00 / 0000-00-00 00:00:00 op timestamps/data/datetime, want 0000-00-00 is geen geldige datum
- het veld krant, wel dat is handig alsof er niet meerdere artikelen kunnen zijn over 1 en hetzelfde evenement
M.a.w. zoals je het nu hebt opgezet zal je je altijd in allerlei ongewenste bochten moeten wringen om een bepaald resultaat uit de database te halen.
- Ik zal je tabel gaan normaliseren, deelnemers houd je niet bij als een string van 100 karakters, hiervoor maak je twee aparte tabellen (1 deelnemer, 2 koppeltabel).
Hoe krijg ik de diverse records uit in SQL tabel gepresenteerd in een tabel met links??
Wat heb je al? Alleen relevante code graag.
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
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
<?php
// bron: http://nl2.php.net/manual/en/mysql.examples-basic.php
// Performing SQL Query
$query='SELECT Begin, Evenement, Locatie, Max FROM Tbl_Evenementen WHERE eind>=CURRENT_TIMESTAMP() ORDER BY Begin ASC';
$result=mysql_query($query) or die('Query failed: ' . mysql_error());
// Printing results in HTML
$line = mysql_fetch_array($result, MYSQL_ASSOC);
echo "\t\t<th>Datum</th>\n";
foreach (array_keys($line) as $col_value) {
echo "\t\t<th>$col_value</th>\n";
} // foreach
echo "\t</tr>\n"; // Einde kolomnamen
do {
foreach ($line as $col_value) {
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2})", $col_value, $regs))
{ // verander datumformat naar dd-mm-yyyy
echo "\t\t<td>$regs[3]-$regs[2]-$regs[1]</td>\n";
// Aanvangstijd
echo "\t\t<td>$regs[4]:$regs[5] uur</td>\n";
} // if
else {
echo "\t\t<td>$col_value</td>\n";
}
} // foreach
echo "\t</tr>\n";
} // do
while ($line = mysql_fetch_array($result, MYSQL_ASSOC));
echo "</table>\n";
// Free resultset
mysql_free_result($result);
// Closing connection
mysql_close($link);
?>
// bron: http://nl2.php.net/manual/en/mysql.examples-basic.php
// Performing SQL Query
$query='SELECT Begin, Evenement, Locatie, Max FROM Tbl_Evenementen WHERE eind>=CURRENT_TIMESTAMP() ORDER BY Begin ASC';
$result=mysql_query($query) or die('Query failed: ' . mysql_error());
// Printing results in HTML
$line = mysql_fetch_array($result, MYSQL_ASSOC);
echo "\t\t<th>Datum</th>\n";
foreach (array_keys($line) as $col_value) {
echo "\t\t<th>$col_value</th>\n";
} // foreach
echo "\t</tr>\n"; // Einde kolomnamen
do {
foreach ($line as $col_value) {
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2})", $col_value, $regs))
{ // verander datumformat naar dd-mm-yyyy
echo "\t\t<td>$regs[3]-$regs[2]-$regs[1]</td>\n";
// Aanvangstijd
echo "\t\t<td>$regs[4]:$regs[5] uur</td>\n";
} // if
else {
echo "\t\t<td>$col_value</td>\n";
}
} // foreach
echo "\t</tr>\n";
} // do
while ($line = mysql_fetch_array($result, MYSQL_ASSOC));
echo "</table>\n";
// Free resultset
mysql_free_result($result);
// Closing connection
mysql_close($link);
?>
Maar even in het algemeen:
Verder gebruik je ereg(). Let op, van php.net:
Quote:
Warning
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
$query='SELECT Begin, Evenement, Aankondiging, Uitleg, Deelnemers, Locatie, Max FROM Tbl_Evenementen WHERE eind>=CURRENT_TIMESTAMP() ORDER BY Begin ASC';
Ik zal even uitleggen wat er in mijn tabel staat;
.Evenement Naam van het evenement,
.Begin Begindatum en tijd, (Bijv. 2011-12-10 09:30:00)
.Eind Einddatum en tijd, (Bijv. 2011-12-10 17:00:00)
.Aankondiging Aankondiging pagina, (Bijv. Aankondiging.php)
.Uitleg Uitnodiging pagina, (Bijv. Uitleg.php)
.Deelnemers Deelnemer overzicht, (Bijv. Deelnemers.php)
Nu wil ik vanuit mijn Tbl_Evenementen tabel een pagina hebben zoals je kunt zien op http://mttv72.nl/index.php?pid=evenementen.