Breadcrumbs subrubrieken query
Ik ben alweer druk aan het programmeren, maar ben nu tegen een probleem aan gelopen waar ik niet meer uit kom. Ik zal even de situatie zo duidelijk mogelijk proberen uit te leggen.
Ik ben bezig met een advertentie website. De database bevat een tabel 'Rubriek'. Die tabel ziet er als volgt uit:
rubrieknummer rubrieknaam rubriek volgnr
1 huis&inrichting NULL 1
2 kasten 1 1
3 klokken 1 2
4 tafels 1 3
5 Electronica NULL 2
6 Televisies 5 1
7 Audio 5 2
8 Computers 5 3
9 Video 5 4
10 Sport NULL 3
11 Voetbal 10 1
12 Tennis 10 2
13 Volleybal 10 3
Korte uitleg:
- rubrieknummer is een automatisch nummerings veld en is de primary key van de tabel.
- rubrieknaam spreekt voor zich, dat is de naam van de rubriek.
- rubriek is een optionele kolom, wanneer de betreffende rubriek een subrubriek is van een andere rubriek vul je hier het 'rubrieknummer' in van die rubriek die boven deze rubriek valt.
- volgnr is de kolom waarmee de volgorde van sorteren wordt bepaald.
Wat ik nu dus wil zijn automatische breadcrumbs. Als ik bijvoorbeeld op de pagina rubriek.php?rid=6 ben, wil ik het volgende te zien krijgen: ELECTRONICA -> TELEVISIES.
Kan iemand mij helpen een query te maken waarmee ik telkens kan kijken een rubriek een subrubriek is van een andere rubriek, en zo ja de rubrieknaam + rubrieknummer van deze hogere rubriek tonen?
Alvast bedankt!
Tim
* Ik krijg het niet voor elkaar om het voorbeeld overzichtje netjes te tonen, het is blijkbaar niet toegestaan meerdere spaties te gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Tim E
Dit zou je eventueel met recursie kunnen oplossen. Wat betreft de spaties, gebruik het element <pre> als je spaties e.d. echt wilt laten zien.
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
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
<?php
// Maak verbinding met de database
// todo $dbc
// Recursieve functie die door de rubriek-tabel loopt
function printTree($r, $offset = 0) {
while($rubriek = mysqli_fetch_array($r)) {
// Print rubriek gegevens
list($nr, $naam, $parent) = $r;
echo "<li style=\"margin-left: " . $offset . "px;\"><a href=\"link_naar_rubriek_$nr\">$naam</a></li>";
// Print subrubrieken
$sub_r = mysqli_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC", $dbc);
printTree($sub_r, $offset + 5);
}
}
// Print rubriek
$r = mysqli_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == NULL ORDER BY volgnr ASC", $dbc);
echo "<ul>";
printTree($r);
echo "</ul>";
// Sluit de verbinding met de database
// todo $dbc
?>
// Maak verbinding met de database
// todo $dbc
// Recursieve functie die door de rubriek-tabel loopt
function printTree($r, $offset = 0) {
while($rubriek = mysqli_fetch_array($r)) {
// Print rubriek gegevens
list($nr, $naam, $parent) = $r;
echo "<li style=\"margin-left: " . $offset . "px;\"><a href=\"link_naar_rubriek_$nr\">$naam</a></li>";
// Print subrubrieken
$sub_r = mysqli_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC", $dbc);
printTree($sub_r, $offset + 5);
}
}
// Print rubriek
$r = mysqli_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == NULL ORDER BY volgnr ASC", $dbc);
echo "<ul>";
printTree($r);
echo "</ul>";
// Sluit de verbinding met de database
// todo $dbc
?>
Ik heb het niet getest, maar iets in die richting zou moeten werken ;-)
Ik gebruikte trouwens in het voorbeeld een UL met LI's margin voor de gewenste inspring-effecten - dat vind ik wat meer gepast.
Edit: typefout in code
Edit: functie argumenten volgorde
Gewijzigd op 01/01/1970 01:00:00 door Patrick Niezen
Bedankt voor de snelle reactie, ik ben vergeten te zeggen dat ik mssql gebruik :$
Edit: dat mysqli misschien efficienter is ofzo ;-) naja ik weet het niet - ik moet mij daar nog even in verdiepen maar ik dacht laat ik d'r meteen mee aan de slag gaan in de toekomst.
Gewijzigd op 01/01/1970 01:00:00 door Patrick Niezen
Patrick Niezen schreef op 05.03.2008 10:31:
Geeft niet, ging ik van uit. mysqli_query werkt op mysql ;-) de i staat voor 'improved'. Ik gebruik het sinds kort, maar de voordelen heb ik er nog niet uit kunnen halen... naja komt (hopelijk) wel. Je zou evengoed mysql_query of mysql_fetch_array kunnen gebruiken.
Edit: dat mysqli misschien efficienter is ofzo ;-) naja ik weet het niet - ik moet mij daar nog even in verdiepen maar ik dacht laat ik d'r meteen mee aan de slag gaan in de toekomst.
Edit: dat mysqli misschien efficienter is ofzo ;-) naja ik weet het niet - ik moet mij daar nog even in verdiepen maar ik dacht laat ik d'r meteen mee aan de slag gaan in de toekomst.
mysql word niet meer ondersteund in php6, dan zul je over moeten op mysqli
edit: nou twijfel ik er toch een beetje aan of dat zo is (?)
Gewijzigd op 01/01/1970 01:00:00 door Terence Hersbach
Ik gebruik php4 maar kan eventueel ook gebruik maken van php5.
Gewijzigd op 01/01/1970 01:00:00 door Tim E
Al heeft Oracle nog wel iets met MySQL te maken, zij zijn de eigenaar van de innoDB-engine.
Maar als het goed is, zou je alles alsnog kunnen veranderen naar mssql_*
let op! Ik heb je tabelnaam veranderd omdat ik dit logischer vind. Ook moet je nooit hoofdletters in je tabelnamen gebruiken.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$sql = "SELECT
*
FROM
rubrieken
WHERE
rubriek = '".$input."'
";
$res = mysql_query($sql);
?>
$sql = "SELECT
*
FROM
rubrieken
WHERE
rubriek = '".$input."'
";
$res = mysql_query($sql);
?>
Google dus even op recursive functies. Ook op het forum hier is daar nogal wat van te vinden.
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
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
<?php
// Maak verbinding met de database
$server = "**";
$gebruiker = "**";
$wachtwoord = "**";
$db = "testdatabase";
$dbc = mssql_connect($server,$gebruiker,$wachtwoord)
or die ("Kon geen verbinding maken met de server");
mssql_select_db($db,$dbc)
or die ("Kon de database niet selecteren");
// Recursieve functie die door de rubriek-tabel loopt
function printTree($r, $offset = 0) {
while($rubriek = mssql_fetch_array($r)) {
// Print rubriek gegevens
list($nr, $naam, $parent) = $r;
echo "<li style=\"margin-left: " . $offset . "px;\"><a href=\"link_naar_rubriek_$nr\">$naam</a></li>";
// Print subrubrieken
$sub_r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC");
printTree($sub_r, $offset + 5);
}
}
// Print rubriek
$r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC");
echo "<ul>";
printTree($r);
echo "</ul>";
?>
// Maak verbinding met de database
$server = "**";
$gebruiker = "**";
$wachtwoord = "**";
$db = "testdatabase";
$dbc = mssql_connect($server,$gebruiker,$wachtwoord)
or die ("Kon geen verbinding maken met de server");
mssql_select_db($db,$dbc)
or die ("Kon de database niet selecteren");
// Recursieve functie die door de rubriek-tabel loopt
function printTree($r, $offset = 0) {
while($rubriek = mssql_fetch_array($r)) {
// Print rubriek gegevens
list($nr, $naam, $parent) = $r;
echo "<li style=\"margin-left: " . $offset . "px;\"><a href=\"link_naar_rubriek_$nr\">$naam</a></li>";
// Print subrubrieken
$sub_r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC");
printTree($sub_r, $offset + 5);
}
}
// Print rubriek
$r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC");
echo "<ul>";
printTree($r);
echo "</ul>";
?>
Ik krijg de volgende errors:
Warning: mssql_query(): supplied argument is not a valid MS SQL-Link resource in testjee.php on line 37
Warning: mssql_fetch_array(): supplied argument is not a valid MS SQL-result resource in testjee.php on line 25
@Crispijn wat betreft hoofdletters, ik zit momenteel op hbo hier hebben ze me aangeleerd bij tabelnamen hoofdletters te gebruiken en zie dat ze het in het boek 'Relationele Databases en SQL' ook doen. Maargoed dat zijn eigen keuzes. Ik zal even googlen ondertussen naar recursieve functies, bedankt voor de tip!
Alsnog:
Header van de functie mssql_query is:
mssql_query(string $query[, resource $link_identifier[, int $batch_size]])
Eerst de query, dan de (optioneel) database-link.
Mijn eerdere voorbeeld had deze fout ook, my bad :-) maar had je zelf ook kunnen vinden.
hmm ik ben nog geen expert :p zou je misschien een concreet voorbeeld kunnen geven :$?
De volgorde van de variabelen die je in een functie stopt (de zogenaamde parameters) is van belang.
De functie verwacht in de eerste parameter een query in de vorm van een String. De tweede en derde parameter zijn optioneel, dat betekend dat deze niet mee hoeven gegeven te worden, maar ik kan je aanraden om de databaselink wel mee te geven i.v.m. eventuele wijzigingen/toevoegingen in de applicatie die te maken hebben met meerdere databases. Wanneer je namelijk geen link identifier mee geeft neemt hij gewoon de laatst gebruikte link identifier.
In het voorbeeld wat jij gecopy paste hebt van mij, stond de fout dat eerst de link werdt gegeven en daarna de query. Dit moet andersom zijn (het voorbeeld eerder in de post is aangepast, dus je zou weer kunnen copy/pasten).
Dus:
Code (php)
1
2
3
2
3
<?php
$r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC");
?>
$r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC");
?>
Moet zijn:
Code (php)
1
2
3
2
3
<?php
$r = mssql_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC", $dbc);
?>
$r = mssql_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek IS NULL ORDER BY volgnr ASC", $dbc);
?>
Edit: typefout (moet leren mijn bericht eerst te lezen ipv meteen te committen :P)
Gewijzigd op 01/01/1970 01:00:00 door Patrick Niezen
Code (php)
1
2
3
2
3
<?php
$sub_r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC");
?>
$sub_r = mssql_query($dbc, "SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC");
?>
naar:
Code (php)
1
2
3
2
3
<?php
$sub_r = mssql_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC", $dbc);
?>
$sub_r = mssql_query("SELECT rubrieknummer, rubrieknaam, rubriek FROM Rubriek WHERE rubriek == $nr ORDER BY volgnr ASC", $dbc);
?>
Gewijzigd op 01/01/1970 01:00:00 door Tim E
waar wordt $rubriek trouwens gedefineerd?