Aide pour les chaines de caracteres

Résolu
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008 - 22 mai 2008 à 18:27
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008 - 22 mai 2008 à 23:48
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

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
22 mai 2008 à 18:52
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...
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 19:14
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";
}
?>
0
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008
22 mai 2008 à 19:39
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 !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 20:03
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008
22 mai 2008 à 20:09
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 !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 22:51
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 22:56
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.
0
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008
22 mai 2008 à 23:06
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 ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 23:20
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.
0
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008
22 mai 2008 à 23:27
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 ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 mai 2008 à 23:38
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
0
ngnikos Messages postés 13 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 22 mai 2008
22 mai 2008 à 23:48
Merci pour le code, je me pencherai sur la question demain et ça devrait deja etre beaucoup plus simple que mes chaines de caracteres ^^
0
Rejoignez-nous