Aide pour les chaines de caracteres [Résolu]

Signaler
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008
-
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008
-
Bonjour à tous !


Je réalise actuellement un site dans des délais assez courts et je dois
donc trouver un moyen de gérer la base de données pour chaque article,
en y insérant tous les coloris, tailles et quantités disponibles ...


J'ai opté pour un formulaire de ce type :

- Coloris 1

- Taille 1 : Quantité 1

- Taille 2 : Quantité 2

- Coloris 2

- ...


Le tout inséré dans la base de données sous la forme /coloris;taille1:quantite1;taille2:quantite2;/coloris2;...


ce qui donne des chaines de caractères de ce type :

/noir-gris;3XS:10;XS:10;S:10;L:10;XL:9;/rouge-marine;XS:5;S:5;M:5;L:9;XL:5;/


Je pense que c'est la meilleure solution pour stocker efficacement un si grand nombre de données

(en effet, il y a beaucoup d'articles et chaque article a un nombre de
coloris, tailles et quantités différents ; la chaîne ainsi créée n'aura
donc jamais la même taille)


Le problème est que cette chaîne est quasi inutilisable pour moi. Par
exemple, je souhaiterais connaître la quantité totale d'un article ; ça
revient à additionner toutes les valeurs de la chaîne comprises entre
":" et ";" ...


Mais comment mettre ces valeurs de côté et les additionner, alors que la chaîne peut avoir une taille aléatoire ?


Merci d'avance pour vos réponses !

12 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

C'est pas facile de développer un site marchand quand on n'a aucune base d'analyse...
Tu devrais commencer par t'intéresser à des méthodes d'analyses comme Merise (désolé si j'en parle souvent).
Cela dit, si t'as pas beaucoup de temps devant toi... Si c'est professionnel, demande un CIF.

Vite fait... Il faut plusieurs tables.
Une pour les articles. Chaque article ayant un identifiant unique.
Une pour les coloris, une autre pour les tailles, etc
Dans chaque table (coloris, taille, etc) il faut un enregistrement par couple article/taille, article/coloris, etc.
Cela te permet de savoir pour chaque article dans quelle taille il est dispo, dans quelle couleur, etc.

J'ai pas le temps de faire un MCD, là, mais sincèrement, documente toi sur les méthodes d'analyse, ça te sera très utile.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Hello,

je suis d'accord avec Neige.
Ceci dit, exemples pour traiter tes chaînes :
<?php
$sChaine = '/noir-gris;3XS:10;XS:10;S:10;L:10;XL:9;/rouge-marine;XS:5;S:5;M:5;L:9;XL:5;/';
// Total articles
preg_match_all('`:([\d]+);`', $sChaine, $aRes);
if(!empty($aRes[1])) {
    print_r($aRes[1]);
    echo $iSum = array_sum($aRes[1]), "\n";
}
// Total rouge-marine
$iPosArticle = strpos($sChaine, 'rouge-marine');
$iPosStop = strpos($sChaine, '/', $iPosArticle);
$sNewChaine = substr($sChaine, $iPosArticle, $iPosStop);
preg_match_all('`:([\d]+);`', $sNewChaine, $aRes);
if(!empty($aRes[1])) {
    print_r($aRes[1]);
    echo $iSum = array_sum($aRes[1]), "\n";
}
// Total noir-gris
$iPosArticle = strpos($sChaine, 'noir-gris');
$iPosStop = strpos($sChaine, '/', $iPosArticle);
$sNewChaine = substr($sChaine, $iPosArticle, $iPosStop);
preg_match_all('`:([\d]+);`', $sNewChaine, $aRes);
if(!empty($aRes[1])) {
    print_r($aRes[1]);
    echo $iSum = array_sum($aRes[1]), "\n";
}
?>
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008

J'avais effecrtivement pensé à une table à part pour simplifier, mais j'ai cru possible la simplification dans une seule chaîne. En fait, ça complique plus qu'autre chose ...

Je ne comprends pas ta méthode Neige : si chaque coloris et taille sont sur des tables différentes, comment savoir si telle taille correspond à tel coloris ?

J'opterais plutôt pour un mélange des deux méthodes :

- une table contenant toutes les informations sur l'article : nom, description, prix, référence ...
- une autre table contenant 4 champs : référence, coloris, tailles et quantités. Ainsi, ca nous donnerait :
=> REF12465 / vert / S,XL,L / 2,5,18
=> REF12465 / vert / M,XL,L,XXL / 2,5,18,12
=> REF24678 / rouge / XL,L / 25,18
 ...

Il suffirait de ressortir sous forme d'un Array les tailles et quantités correspondantes à chaque couleur ; ainsi tout sera contenu dans une table.

Je ne garantis pas que ma méthode soit plus simple ou efficace, à vous de me dire quoi ^^

Merci d'avance !
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Vouloir absolument tout mettre dans une seule table est une erreur, vraiment. Tu auras plus d'enregistrements conséquents. Pour les fringues, c'est relativement simple : comme le dit neige, une table articles, une table taille, une table coloris.
Et moi je verrais plutôt une table de jointure article/coloris/taille (avec juste les ID donc).
Mais le tout est de savoir si tu n'as QUE des fringues...parce que si ce n'est pas le cas, il faut changer de tactique légèrement (et pour savoir laquelle adopter, il faut connaître l'exhaustivité des caractéristiques possible de tes autres types d'article).
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008

Il y a de tout : vetements, equipements, ballons ...

Vu la diversité, j'ai donc laissé une totale liberté à la personne qui gère le magasin pour remplir les infos sur les articles : la personne choisit elle-même le nombre de coloris, le nom de ces coloris, puis le nombre de tailles, le nom de ces tailles (XXL, Taille 4, 24 cm de diamètre pour un ballon par exemple ...), et enfin la quantité correspondante à cette taille. La personne peut aussi, en cas d'article unique ou simple, juste entre une simple quantité (sans taille ni colori donc).

Il faut donc trouver un système de table pouvant tout regrouper et cela simplement. Peut etre l'idée des ID est la bonne, pourrais-tu développer un peu plus, je ne comprends pas où tu veux en venir.

Merci encore !
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Table articles
art_id
art_libelle
...

Table tailles:
taille_id
taille_libelle

Table coloris:
color_id
color_libelle

Et ce que propose Neige :
Table art_tailles:
art_id
taille_id

Table art_coloris
art_id
color_id

La mienne :
table art_props
art_id
color_id
taille_id

Mais la solution de Neige a l'avantage de ne pas obliger un article a avoir une taille ET un coloris, et c'est très facilement gérable grâce à des jointures de type LEFT JOIN.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Pardon j'ai envoyé trop vite et je n'ai pas fini ma table.
Ma solution a quand même un avantage : cela te permet de gérer la quantité plus facilement :
table art_props
art_props_id
art_id
color_id
taille_id
art_quantite

Parce que dans articles tu auras par exemple
1, tee-shirt Marque X
2, polo Marque Y
etc...
ce sont des articles génériques. Et tu ne donc pas gérer leur quantité ici.
Avec la solution de Neige, gérer la quantité est difficile, parce qu'il FAUT qu'un article soit unique, pour ça.
Du coup tu peux simplifier, (c'est ce que je ferais sans doute):
table articles :
art_id
art_libelle
art_quantite
taille_id
color_id
...

et les tables tailles et coloris restent les mêmes, mais tu n'as plus de jointure. Ce qui est le plus logique, chaque article ayant une seule taille et un seul coloris.
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008

Merci pour ces réponses.

Ce qui est bon à savoir, c'est que non seulement les tailles et coloris n'ont pas besoin d'être mis dans une table à part avec un ID (en effet, les articles ne seront pas classés par coloris ou taille) ; et qu'en plus cette méthode pourrait être non adaptée, puisque vu le nombre d'articles différents, il y aura énormement de tailles et coloris différents.

Je pense que deux tables suffisent :

- table articles avec reference, nom, description, prix ...
- table qui rassemble coloris, tailles et quantités avec reference, coloris, taille et quantité

Ca permettrait de modifier les quantités sans entrer dans la table des propriétés et vice-verca ; et le lien est fait entre les deux grâce à la référence du produit.

Qu'en pensez-vous ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Ce qui t'oblige à répéter des chaînes de caractères de multiples fois (nom du coloris, nom de la raille, etc), au lieu d'utiliser des ID, bien plus légers.
Ce n'est pas une bonne solution d'après moi.
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008

Je sais ; mais toute personne cliquant sur un article verra un tableau avec les tailles, coloris et quantités en entrées ... Je n'imagine même pas le nombre de requêtes SQL nécessaires pour aller chercher toutes ces infos (tel ID = tel nom de coloris ...)

Il vaut mieux une base de données plus lourde mais beaucoup moins de requêtes, non ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Tu ne fais pas plus de requêtes? C'est pas parce que tu as 3 ou 4 tables que tu fais plus de requêtes que si tu en as deux.

SELECT art_libelle, taille_libelle, color_libelle, art_quantite
FROM articles art
INNER JOIN art_props props ON props.art_id = art.art_id
LEFT JOIN tailles taille ON taille.taille_id = art.taille_id
LEFT JOIN coloris color ON color.color_id = art.color_id
WHERE art.art_id = 1
Messages postés
13
Date d'inscription
mercredi 13 avril 2005
Statut
Membre
Dernière intervention
22 mai 2008

Merci pour le code, je me pencherai sur la question demain et ça devrait deja etre beaucoup plus simple que mes chaines de caracteres ^^