Goede morgen!

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.
Morguh,

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.

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

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
Bedankt voor de snelle reactie, ik ben vergeten te zeggen dat ik mssql gebruik :$
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.
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.


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 (?)
Hm ik kan dus van mysql_query -> mssql_query maken en van mysql_fetch_array -> mssql_fetch_array? En dan zou het moeten werken?

Ik gebruik php4 maar kan eventueel ook gebruik maken van php5.
@Patrick: MySQL en MSSQL zijn 2 totaal verschillende databases, de 2e heeft helemaal niets met MySQL te maken. Je zou ook Oracle of DB2 in dit rijtje kunnen zetten.

Al heeft Oracle nog wel iets met MySQL te maken, zij zijn de eigenaar van de innoDB-engine.
Ai, ik zie nu dat ik verkeerd gelezen heb. Dat klopt pgFrank. De kreten lijken veraderlijk op elkaar ;-)

Maar als het goed is, zou je alles alsnog kunnen veranderen naar mssql_*
Maar die query is toch niet zo ingewikkeld? Je moet hier een functie omheen bouwen die steeds blijft kijken of je er nog 1 omhoog kan. Een recursive functie heet dat geloof ik

let op! Ik heb je tabelnaam veranderd omdat ik dit logischer vind. Ook moet je nooit hoofdletters in je tabelnamen gebruiken.

<?php
    $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.
Als ik het volgende script uitvoer krijg ik 2 errors:

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

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!
Mm, m'n bericht is niet doorgekomen, website beetje traag.

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.

Reageren