Aller au contenu

Ranger une banque d'images


Gribouille26

Sujets conseillés

J'ai retourné le problème dans tous les sens, et aucun ne me paraît plus évident... :unsure:

Sauf, peut-être ... de mettre id_cat dans le table image. Et donc de supprimer la table icone_cat pour laquelle je n'arrive pas à trouver la clef....

Ca ralentirai beaucoup les requètes?

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 52
  • Créé
  • Dernière réponse

Contributeurs actifs dans ce sujet

Contributeurs actifs dans ce sujet

Sauf, peut-être ... de mettre id_cat dans le table image. Et donc de supprimer la table icone_cat pour laquelle je n'arrive pas à trouver la clef....

Bien vu, c'est exactement la méthode à adopter. Logiquement :

A une icone correspond une et une seule catégorie. Donc, id_cat va dans la table image.

La table icone_cat ne te sert plus à rien.

En fait, elle pourrait servir si tu affectais une à plusieurs catégories par icone, et une à plusieurs icones par catégories. Sans ces 2 conditions, il n'y a pas besoin de table de jointure.

Pour info, s'il y en avait eu une, elle n'aurait pas de clé. Pourquoi ? Parce que les 2 clés (id_icone et id_cat) forment une clé à elles seules. Ainsi, le 'couple' id_icone 1 et id_cat 3 doit être unique. (quoique, mais.. c'est pour simplifier..)

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, je n'avais pas pensé à ça, mais l'idée de la base de données vient justement du fait qu'une icone peut se retrouver dans plusieurs catégories !!! :gueule:

Mince!!! :angry:

Mais comme les catégories seront des chiffres, Il n'y a pas de risque d'erreur en remplissant un éventuel champ id_cat dans le table icone... :D

Et si j'en met plusieurs (de catégories) et que je les sépare comme dans clef_icone (par des espaces), je peux y faire une recherche pour les sortir dans plusieurs catégories?

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Aucun problème, et les légers ralentissements que tu pourrais rencontrer commenceraient à partir d'un bon millier d'icones (et encore..)

Quel champ ?

Lien vers le commentaire
Partager sur d’autres sites

J'en ai déjà bien plus d'un milliers... et j'espère bientôt encore plus...

Alors, je vais peut-être garder les trois tables si ça va plus vite... :huh:

Pas besoin de définir de clef primaire dans la table cat_icone, donc !? Mais mySQl m'en réclame une...

J'ai deux choix: clef primaire et index. Je ne comprend pas ce qu'est "index". :blink:

C'est le champ id_cat que je voudrais rajouter à la table icone.

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Tu fais une table image, une table catégorie. Dans ces tables, tu mets un index et une cle primaire.

Puis tu fais une table de jointure, où tu mets l'id de l'image, et l'id de la catégorie. S'il insiste tant, mets lui un index, ce n'est pas génant.

Nico.

Lien vers le commentaire
Partager sur d’autres sites

Oups, j'avais pas vu ta réponse.... :blush:

Tu fais une table image, une table catégorie. Dans ces tables, tu mets un index et une cle primaire.

<{POST_SNAPBACK}>

Je comprend qu'un index sert à une recherche plus rapide, mais je ne sais à qui l'attribuer....

J'ai trouvé cette explication, mais c'est pas très clair sur la différence entre une clef primaire et un index.

Un index est un objet complémentaire (mais non indispensable) à la base de données permettant d'"indexer" certaines colonnes dans le but d'améliorer l'accès aux données par le SGBDR, au même titre qu'un index dans un livre ne vous est pas indispensable mais vous permet souvent d'économiser du temps lorsque vous recherchez une partie spécifique de ce dernier...

Toutefois la création d'index utilise de l'espace mémoire dans la base de données, et, étant donné qu'il est mis à jour à chaque modification de la table à laquelle il est rattaché, peut alourdir le temps de traitement du SGBDR lors de la saisie de données. Par conséquent il faut que la création d'index soit justifiée et que les colonnes sur lesquelles il porte soient judicieusement choisies (de telle façon à minimiser les doublons). De cette façon certains SGBDR créent automatiquement un index lorsqu'une clé primaire est définie.

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Pour l'exemple suivant :

id_personne, nom,age,sexe,adresse,ville

Bon, a priori, on mettra le id_personne en index. En effet, on considère qu'il sera en cle primaire, et comme le dit le second paragraphe de ton 'quote', les cle primaires sont (presque) automatiquement en 'index'.

Mais, imaginons que le programme requiert très souvent des recherches par ville, car c'est un element capital dans ce programme. On pourrait mettre 'ville' en index. La recherche sera ainsi accélérée. Il sera fait (grosso modo) une table spéciale 'id_personne','ville', qui permettra de trouver très rapidement la ville désirée.

Ceci dit, comme expliqué, il ne faut pas non plus tout mettre en index. Il ne faut pas mettre 'id_personne, nom,age,sexe,adresse,ville', l'ensemble des champs en index. Là, le problème serait inverse. Ca n'accelererait pas la recherche, ca pourrait meme la ralentir, ca il y aurait alors trop de champs (et notamment des champs inutiles), en index.

Bref, il faut savoir à quoi l'on destine son programme, pour choisir des index intéressants, sans pour autant en choisir trop.

Nico.

Lien vers le commentaire
Partager sur d’autres sites

Salut, je suis de retour... :lol:

J'ai créé la base de données. :hourra:

J'ai réussi à m'y connecter, à y faire des requètes simples, :hourra:

mais quand il s'agit qde retrouver une information en passant par la table de jointure, ça se complique.... :angry:

J'ai beau lire et relire les explications, je ne comprend pas trop la syntaxe.... :blush:

Je voudrais connaître, par exemple, l'url des icones qui font partit d'une catégorie donnée (la 1):

$requete = "SELECT url_icone, id_icone, id_cat FROM icone, categorie, icone_cat WHERE id_cat=1";

Mais la requète échoue... :huh:

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Ma base de données:

table1: icone

id_icone, clef_icone, url_icone

table2: categorie

id_cat, nom_cat

table3: icone_cat

id_cat, id_icone

(les champs écrits en violet sont les clefs primaires)

C'est bien ça que tu veux voir? :huh:

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Mais la requète échoue... :huh:

Tu as un message d'erreur ?

Sinon pour ta requete :

$requete = "SELECT url_icone 
                 FROM icone i , icone_cat ic
                 WHERE ic.id_cat=1 AND i.id_icone=ic.id_icone";

En gros : on va chercher dans les tables icone_cat et icone les enregistrements qui répondent à la regle : "la catégorie doit être egale à 1".

"i.id_icone=ic.id_icone" quant à lui fait le lien entre les deux tables.

N.B. : Tu as remarqué que tu peux nommer te tables dans les requetes. ex "i" pour la table icone et "ic" pour la table icone_cat.

Lien vers le commentaire
Partager sur d’autres sites

Salut, Titag. :D

Oui, j'ai un message puisque j'ai mit:

$result = mysql_query($requete) or die("Requete echouee");

pour savoir où ça ne marche pas. ;)

N.B. : Tu as remarqué que tu peux nommer te tables dans les requetes. ex "i" pour la table icone et "ic" pour la table icone_cat.

<{POST_SNAPBACK}>

Il suffit de marquer leur nouveau nom à côté de l'ancien dans le FROM pour les renommer? :huh:

Merci, Titag. J'ai à peu près compris, et ça marche très bien, en tout cas.

Et plus compliqué encore!!! Trouver l'url des icones qui correspondent à la catégorie "machin".

$requete = "SELECT url_icone
                FROM icone i , icone_cat ic, categorie c
                WHERE c.nom_cat=machin";

Mais comment faire le lien entre les trois tables? :blink:

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

En fait, pour faire un lien entre 2 tables, il suffit de.. faire un lien :D

AND ic.id_cat=c.id_cat

Donc, pour lier plusieurs tables, il suffit de multiplier ces conditions.

Ca donnerait :

$requete = "SELECT url_icone
               FROM icone i , icone_cat ic, categorie c
               WHERE c.nom_cat='machin'
               AND ic.id_cat=c.idcat
               AND ic.id_icone=i.id_icone
";

Nico.

Lien vers le commentaire
Partager sur d’autres sites

J'ai jonglé un peu et j'arrive à refaire d'autre requètes sur 1, 2, 3 tables.

Pour voir si j'ai bien compris:

la syntaxe d'une requète: SELECT champ FROM table WHERE condition :?:

puis, pour lier des tables: AND table.champ=autretable.memechamp (1 AND si deux tables, 2 AND si 3tables....) :?:

J'ai trouvé cette technique pour afficher les résultats: :D

echo "<table>\n";
while($line = mysql_fetch_assoc($result)) {
  echo "\t<tr>\n";
  foreach($line as $col_value) {
      echo "\t\t<td>$col_value</td>\n";   }
  echo "\t</tr>\n";  }
echo "</table>\n";

Mon problème est, maintenant, pour afficher les images à la place de leur url stochées dans la base de données.

J'ai bien compris qu'il faut reconstruire le début de l'url de l'icone...

<img src=&quot;http://www.monsite.com/images/".$image.">

J'ai essayé d'introduire ça dans la deuxième ligne, en mettant $result à la place de $image, mais sans succès... :unsure:

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Il faut que tu fasses :

echo "<img src=\"http://www.monsite.com/images/".$image."\">";

Sinon pour les requètes tu as compris le principe :)

Lien vers le commentaire
Partager sur d’autres sites

Re,

Je suis allé un peu vite dans ma réponse.

Admettons que ta requete te retourne des résultats avec trois valeurs, par exemple, nom_image, cat et id_image.

Pour afficher les résultat tu peux faire :

$result = mysql_query($req);

if ($result) {

 while ($ligne = mysql_fetch_object($result)) {

   echo "<img src=\"www.monsite.com/images/".$ligne->nom_image."\">";
}

Par exemple.

Ici tu "pointe" le nom du champ obtenu de la base en faisant $ligne->le_nom_du_champ.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...
Admettons que ta requete te retourne des résultats avec trois valeurs, par exemple, nom_image, cat et id_image.

Pour afficher les résultat tu peux faire :

$result = mysql_query($req);
if ($result) {
 while ($ligne = mysql_fetch_object($result)) {
   echo "<img src=\"www.monsite.com/images/".$ligne->nom_image."\">";
}

Par exemple.

Ici tu "pointe" le nom du champ obtenu de la base en faisant $ligne->le_nom_du_champ.

<{POST_SNAPBACK}>

Salut,

Ma requète ne retournera que l'image.

Je n'arrive pas à afficher les résultats sous forme d'image.

Je les ai sous forme d'URL, mais je n'arrive pas à les avoir en image... :nono:

J'ai apparement un $ en trop sur la ligne 30, mais la ligne 30 de mon éditeur de code fait apparaitre </body> !!

Une idée ?

Gribouille

Lien vers le commentaire
Partager sur d’autres sites

Oui, :P

En général lorsque tu as un "parse error" (car c'est ca n'est-ce pas ?), c'est que tu as oublié un ; ou un " quelque part...

Tu peux nous montrer ton code ?

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant

×
×
  • Créer...