Aller au contenu

Gestion de tags 2nd partie


jer666

Messages recommandés

Bonjour,

pour offrir un mode de navigation optimal pour mes utilisateurs, je desirerais creer une nuage de tags.

Pour cela, j'ai creer un script pour récupérer les tags

<input size="60" type="text" name="tag" tabindex="80"  />
 <p> Merci d'entrer 3 ou 4 termes <b>séparés par des virgules("coma") ","</b></p>
 <?php

 $post = $_POST['tag']; //liste des tags
 $tag = explode(",", $post); // séparation des tags
 $nbrtag = count ($tag); // comptage des tags

 $enregtag = 0; 

 if ($post)
 {
 while ($enregtag <= $nbrtag & !empty($tag[$enregtag])) //tant qu'il reste des tags non enregistrés
 {
 $newtag = $tag[$enregtag];
 mysql_query("INSERT INTO tags VALUES('', '$newtag', '$id')") or die (mysql_error()); //$id etant l'id de l'article enregistré en meme temps que les tags
 $enregtag++; // on incremente de 1 le nombre de tag enregistré
 }
 }//fin du if
 elseif ($invisible)// si on enregistre l'article sans les tags
 {echo'<p style="color:#ff0000">merci de mettre une paire tags!!</p>';}

 ?>

mais cela n'enregistre pas les tags pour une raison qui me depasse un peu ... je repasse le script dans tout les sens, je ne vois pas ou ca cloche :(

pourriez vous m'aider? des fois un regards exterieur... :chinois:

bon ben c'etait bien une petite betise ;) j'avais pas mis la requette sql au bon endroit :transpi::transpi:

Lien vers le commentaire
Partager sur d’autres sites

bon la recupération des tags est ok. ca enregistre bien dans la bdd.

j'ai trouvé un script pour faire le tags clouds. et ca marche pas trop mal.

par contre, j'ai un pti probleme concernant la creation de la page presentant les articles concernés par le tag.

par exemple pour le tag windows, recupéré tout les articles ayant ce tag enregistré.

Ma bdd est construite comme cela

id => id de l'enregistrement

tag => ben le tags enregistré

id_article => l'idée de 'larticle concerné

pour chaque article j'enregistre sur différents champs les tags associés

exemple article id 1 nommé windows vs linux

mes tags sont windows,linux,combat

les enregistrement sont donc

1 windows 1

2 linux 1

3 combat 1

si par la suite j'enregister un article nommé windows vista ayant pour id 2

avec les tags windows,vista

j'aurais

4 windows 2

5 vista 2

.......

pour afficher les articles associés a un tag je recupére le tag dans l'url

par exemple

http://www.monsite.com/index.php?tag=vista

voici le script utilisé:

if (isset($_GET['tag'])) $tags = strval($_GET['tag']); //recupération du tag dans l'url
echo $tags; // test de la valeur recupéré, cette valeur est bonne

$V = mysql_query('SELECT article FROM tags WHERE tag=$tags AND Activation=2 ORDER BY id DESC')or die (mysql_error());
while ($v = mysql_fetch_array($V))
{
$idv = $v['article'];
echo 'idv => '.$idv;
} // fin de la boucle tags

je me suis arretté la car j'ai une erreur, et je ne trouve pas la raison.

l'erreur

Vista Unknown column '$tags' in 'where clause'

d'aprés mes recherches c'est du au fait que la réponse de la requette sql est présenté sous forme de tableaux. Mais je ne vois pas le probleme :) il devrait me presenter tout les id d'articles relatifs a ce tag non?

si j'arrive a finir ce script, je le mettrais a disposition sur ce thread, car j'ai beaucoup chercher sur le ent, et jamais trouvé u script complet, toujours les nuages.... ;)

merci par avance de toute l'aide que vous pourriez m'apporter :)

Lien vers le commentaire
Partager sur d’autres sites

par exemple

http://www.monsite.com/index.php?tag=vista

voici le script utilisé:

[...]
$V = mysql_query('SELECT article FROM tags WHERE tag=$tags AND Activation=2 ORDER BY id DESC')or die (mysql_error());
[...]

je me suis arretté la car j'ai une erreur, et je ne trouve pas la raison.

l'erreur

Vista Unknown column '$tags' in 'where clause'

L'erreur est tout simplement dans la requête SQL (comme te le dit le message d'erreur)!

Tu as écrit:

'SELECT article FROM tags WHERE tag=$tags AND Activation=2 ORDER BY id DESC'

au lieu de:

"SELECT article FROM tags WHERE tag='$tags' AND Activation='2' ORDER BY id DESC"

Petite explication (pour ceux qui n'auraient pas tout compris): en oubliant les simple-quotes autour de $tags, tu dis à ta requête que tu cherches non pas une valeur dans le champ tag mais la colonne dont le nom est égal à $tags, d'où le message d'erreur...

PS: pour que le tout fonctionne correctement, j'ai du aussi remplacé les simple-quotes par des doubles car sinon, ça aurait merdé: l'interpréteur aurait sans doute cru qu'il avait atteint la fin de la requête SQL. Et pour éviter aussi des erreurs (même si ça doit sans doute passer correctement avec des entiers), j'ai aussi rajouté des simple-quotes autour de la valeur chiffrée.

Lien vers le commentaire
Partager sur d’autres sites

yes!!! merci ca marche trés bien!

merci merci merci!!!

Bon une petite question suplémentaire avant de donner le script complet et fonctionnel :)

dans ma requette, je cherche donc le tags désiré. par exemple vista.

dans cette requette, je vais etre obligé de refaire une requette pour chercher les info de l'article du type

$V = mysql_query("SELECT article FROM tags WHERE tag='$tags' ORDER BY id DESC")or die (mysql_error());
while ($v = mysql_fetch_array($V))
{
$idv = $v['article'];
$a = mysql_query("SELECT * FROM article WHERE id='$idv' ORDER BY id DESC")or die (mysql_error());
while ($art = mysql_fetch_array($a))
{
$id = $art['ID'];
$titre = $art['Titre'];
$genre = $art['Genre'];
$description = $art['Description'];


<div class="titre">
<a href="'.$url.'">'.$titre.'</a>
</div>
<div class="desc">
'.$description.'
</div>
}

mais dans ces resumé, j'aimerais bien mettre aussi les tags associé a chaque résumé lol

donc ca va me faire une requette dans une requette dans une requette :D

a raison de 20 articles par page, et de 10 000 visiteurs par jours, ca va donner une base de donnée saturé par les requettes pour les pages de tags :D

vous en pensez quoi?

Lien vers le commentaire
Partager sur d’autres sites

J'en pense qu'en effet, 3 requêtes imbriquées comme ça (dont les 2 dernières vont être appelées en boucle) ça va vite saturer ton serveur, si tu as 10.000 visiteurs/jour! Même en ayant recours à un cache, ça n'est pas une bonne idée de faire ainsi.

Ce que je te recommande, c'est de faire le tout en une seul requête: plus complexe à écrire mais plus rapide à exécuter!

Ça donnerait alors quelque chose comme ceci (je suis pas tout à fait sûr de moi quand même, car j'ai rien pour tester/vérifier):

"SELECT article.*

FROM tags, article

WHERE tags.tag='$tags'

AND tags.article=article.ID

ORDER BY tags.id DESC,

article.id DESC";

Là, je n'ai fait que retranscrire en une seule requête les 2 déjà existantes. Le résultat devrait être (si je me suis pas merdé) ce que te donne la 2° boucle, classé selon les id de la table tags, puis de la table article.

Un conseil: évite les '*' dans les requêtes! Certes, c'est bien pratique, mais ça alourdit grandement le temps d'exécution d'une requête car MySQL doit d'abord récupérer la structure de la table concernée pour connaitre les noms des champs (en gros, MySQL fait le remplacement '*' -> 'tous les champs' à chaque fois que tu appelles cette requête SQL). Privilégie au maximum de citer les champs un par un. C'est chiant à taper, mais tu y gagneras en exécution

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...