koppeling bookmark aan tags (select probleem?)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ren

Ren

24/04/2008 21:04:00
Quote Anchor link
hallo ik hoop dat jullie mij kunnen helpen want ik zit met een probleem en een aanwijzing in de goede richting zou ik fijn vinden.

Ik ben een bookmarkingssite aan het maken en heb al best veel kennis van php en sql, maar ik kom altijd in de problemen met het koppelen van tabellen. In het volgende stukje code zie je een select staan en dit werkt niet goed.

De code staat in een iets grotere while lus die alle bookmarks onder elkaar laat zien. Dit stukje code moet er voor zorgen dat de bijbehorende tags hieronder komen te staan. Nu krijg ik alleen alle tags ipv de bijbehorende.
voorbeeld:
[bookmarklink]
[tag1][tag2][tag3][tag4][tag5]

Ik heb drie genormaliseerde tabellen en die gaan als volgt
[bookmarks]
bookmark_id
bookmark_url
bookmark_naam

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
tag_id
tag_naam

[bookmarks_tags] (koppeling)
bookmark_id
tag_id    


de id's van bookmarks en tags zijn uniek..


<?php
// zoekt alle tags op van de getoonde bookmark
$result2 = mysql_query("SELECT *  FROM bookmarks_tags bt, bookmarks b, tags t WHERE bt.tag_id = t.tag_id AND b.bookmark_id = bt.bookmark_id");
while ($row2 = mysql_fetch_array($result2)) {
echo "<a href=\"index.php?t={$row2['tag_id']}\">{$row2['tag_naam']}</a>";
}

?>



ik hoop dat jullie mij kunnen helpen
Gewijzigd op 01/01/1970 01:00:00 door Ren
 
PHP hulp

PHP hulp

23/12/2024 00:45:50
 
Joren de Wit

Joren de Wit

24/04/2008 23:00:00
Quote Anchor link
Uit je database zul je een overzicht moeten halen van alle bookmarks met bijbehorende tags. Dat zal ongeveer zo'n lijst worden:

bookmark1 - tag1
bookmark1 - tag2
bookmark1 - tag3
bookmark2 - tag1
bookmark3 - tag1
bookmark3 - tag2

De SQL query die je hiervoor gebruik is de volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
  b.bookmark_naam,
  t.tag_naam
FROM
  bookmarks b
LEFT JOIN
  bookmarks_tags bt
    ON bt.bookmark_id = b.bookmark_id
INNER JOIN
  tags t
    ON t.id = bt.tag_id
ORDER BY
  b.bookmark_naam ASC


Vervolgens ga je deze resultaten van deze query fetchen in een while loop. Daarbij houd je in een variabele bij wat de vorige bookmark was die je gehad hebt. Als die verschilt van je huidige bookmark, echo je de naam van de bookmark. Daarnaast echo je altijd de tags die bij de bookmarks horen...

Tenslotte nog iets over de naamgeving van je kolommen. Het is overbodig om in een 'bookmarks' tabel je kolommen ook nog eens te gaan prefixen met 'bookmark'. Het mag immers voor zich spreken dat het 'id' uit een 'bookmarks' tabel het id van een bookmark is...
 
Ren

Ren

24/04/2008 23:53:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
// geeft de bookmarks weer
$result = mysql_query("SELECT * FROM bookmarks");
    while ($row = mysql_fetch_array($result)) {
    echo "<h1><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h1>";
// zoekt alle tags op van de getoonde bookmark
$result1 = mysql_query("SELECT t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
while ($row1 = mysql_fetch_array($result1)) {
echo "<a href=\"index.php?t={$row1['tag_id']}\">{$row1['tag_naam']}</a>";
}}

?>

ten eerste bedankt voor je hulp.
ik heb het nu zo, maar nu worden nog steeds alle tags bij de bookmark toegevoegd omdat ik niet die variabele die jij had aangegeven er bij heb.

Moet ik dan bijvoorbeeld een $count = $count + 1; in de loop zetten? en voor de while lus $count =1;? ik weet niet hoe ik daarna het verschil kan uitrekenen en waar ik deze uitkomst in de select moet zetten om aan te geven om welke tags het gaat.

moet ik dan b.bookmark_id vervangen met $count?

(goed idee trouwens van die id in de kolommen daar had ik nog niet aangedacht. wordt het dan alleen niet verwarrend in de koppelingstabel?
Gewijzigd op 01/01/1970 01:00:00 door Ren
 
Joren de Wit

Joren de Wit

25/04/2008 00:10:00
Quote Anchor link
Een klein voorbeeldje van de opzet die je zou kunnen gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
37
<?php
$sQuery
= "
    SELECT
      b.bookmark_naam,
      t.tag_naam
    FROM
      bookmarks b
    LEFT JOIN
      bookmarks_tags bt
        ON bt.bookmark_id = b.bookmark_id
    INNER JOIN
      tags t
        ON t.id = bt.tag_id
    ORDER BY
      b.bookmark_naam ASC
"
;

if(!$rResult = mysql_query($sQuery))
{

    trigger_error(mysql_error().'<br>In query: '.$sQuery);
}

else
{
    $sPrevBookmark = '';
    
    while($aRow = mysql_fetch_assoc($rResult))
    {

        if($aRow['bookmark_naam'] != $sPrevBookmark)
        {

            echo '<br>'.$aRow['bookmark_naam'].'<br>';
            $sPrevBookmark = $aRow['bookmark_naam'];
        }

        
        echo $aRow['tag_naam'].'<br>';
    }
}

?>

Quote:
wordt het dan alleen niet verwarrend in de koppelingstabel?
Uiteraard gebruik je in de koppeltabel wel duidelijke namen. Daar is het namelijk niet direct duidelijk om welk id het zou gaan...
 
Ren

Ren

25/04/2008 00:33:00
Quote Anchor link
Het heeft allemaal gewerkt, heel erg bedankt. Mijn probleem is opgelost
 
Ren

Ren

26/04/2008 15:08:00
Quote Anchor link
ik ontdek net dat de select code als het bookmarks aan het ophalen is de bookmarks dubbel laat zien als het meerdere tags heeft. Hoe moet ik de select veranderen als ik dit wil bereiken?

ik heb al een inlogsysteem, zoekfunctie, admin en verscheidene bookmarkfilters gemaakt sinds gister, maar nu bijt me dit weer van achter in me rug.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php    // geeft de bookmarks weer + eigen tags
        $result = mysql_query("SELECT b.bookmark_naam, b.bookmark_url, t.tag_id, t.tag_naam FROM bookmarks b LEFT JOIN bookmarks_tags bt ON bt.bookmark_id = b.bookmark_id INNER JOIN tags t ON t.tag_id = bt.tag_id");
        $prevbookmark = "";
        while($row = mysql_fetch_assoc($result)) {
            if($row['bookmark_naam'] != $prevbookmark)
            {

                echo "<h2><a href=\"{$row['bookmark_url']}\">{$row['bookmark_naam']}</a></h2>tags: ";
                $prevbookmark = $row['bookmark_naam'];
            }

            echo "<span>";
            echo "<a href=\"index.php?t={$row['tag_id']}\">{$row['tag_naam']} </a>";
            echo "</span>";
        }
?>


ik hoop dat het niet teveel gevraagd is om even naar de code te kunnen kijken voor een oplossing van de dubbele bookmarks in het overzicht.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.