Page 1 sur 1

Insertion occurence Chaine de characteres dans base de données

Posté : 12 avr. 2017, 12:08
par hugo_064
Bonjour à tous,

En recherche depuis plusieurs jours, je me tourne vers vous et vos compétences d'expert.

Voilà mon problème.
Je cherche à insérer les occurrences d'une chaine de caractère dans une table.

La 1ère occurrence sur la ligne 1, la 2ème occurrence sur la ligne 2, et ainsi de suite.
Sachant que l'insertion doit se faire en fonction des "ref" et par ligne.

Exemple concret:
J'ai ma table avec les infos suivante

id | Ref | cotation
.... ..... ........
11 4586 20_5
12 4586 3_8

13 8756
14 8756 10_3
15 8756

16 7423 12_3
17 7423 4_2
.... ..... ........


Et j'ai ma chaine de caractère qui m'est fournit comme cela :
ref => 8756
cotation => 1_4,10_5,3_16

la 1ere occurrence "1_4" doit aller sur la ligne 13 et remplir le champ vide cotation,
la 2ème occurrence "10_5" doit aller sur la ligne 14 et modifier le champ cotation,
la 3ème occurrence "3_16" doit aller sur la ligne 15 et remplir le champ vide cotation.

Et évidement les ID de la table change en permanence,
je ne peux donc pas m'appuyer sur le champ ID mais uniquement sur le champ "ref".

J'ai essayé plusieurs formule avec foreach, for, while, et autre.

J'arrive à envoyer toute la chaine dans le champ cotation mais elle se répète sur toutes les lignes,
J'arrive à envoyer la 1ère occurrence dans le champ cotation mais elle se répète sur toutes les lignes,
J'arrive à envoyer la dernière occurrence dans le champ cotation mais elle se répète sur toutes les lignes.

Je n'arrive pas à dispatcher la 1ère occurrence sur la ligne 1, la 2ème sur la ligne 2 et ainsi de suite.

Avec votre expertise, avez vous une orientation pour m'aider à faire cela.

Je vous remercie tous d'avance.

Hugo_064
(php 5.6 / mysql 5)

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 12 avr. 2017, 12:46
par moogli
salut,

si les id de ne sont pas important tu peux supprimer les lignes existante (vu que tu va écraser les restes) et insérer de nouveau ligne directement à partir de tes données.

Le petit problème c'est que ta table a surement d'autre champs que ces trois la ?
si c'est le cas c'est plus compliqué. Il faut trouver un discriminant efficace. tu n'as pas le choix car tu ne pas deviner qu'elle cotation va avec qu'elle ligne.

je ne comprend pas pourquoi id change. Vu son nom c'est une clef primaire elle ne doit donc, par essence, être immuable (sinon c'est le bordel ;) ).

si tu voulais dire que l'id change mais seulement pour les références y a moyen de s'en sortir.
boucle sur le chose qui te fournit les nouvelles données (tableau php ?)
pour chaque référence
- selectionner les lignes (complètes ou pas suivant le discriminant) qui correspondent à la référence dans la table
pour chaque ligne
mettre à jour la colonne cotation
/pour chaque ligne
/pour chaque référence

si tu n'as que
ref => 8756
cotation => 1_4,10_5,3_16

tu ne t'en sortiras pas tu ne peux pas savoir a quoi correspondent les cotations.
d'où viennent ces données (c'est toi qui gère ? tu peux intervenir dessus ? c'est basé sur les mêmes données ?) ?

au pire tu fat au p'tit bonheur la chance. tu prends la première cotation et tu colles sa dans la première ligne de la base de données qui se présente (fait quand même attention a ce que le nombre de ligne en base ne soit pas supérieur au nombre de cotation fournie).


pour moi il te manque quelque chose pour bosser correctement. la tu va dans le mur c'est certain.
Si les données sont issue de ton système alors il te faut l'id.
si ce n'est pas le cas il faut d'autre informations afin d'avoir un discriminant unique pour chaque ligne.

pour moi une référence devrait être unique (imagine un catalogue de supermarché qui pour la ref "0x42" prose un playmobile ou un jouet pour "adulte" c'est pas vraiment la même chose :) ).
dans ce cas il est possible que tu ais plusieurs exemplaire de la référence qui auront dans des cotations différentes.
Et la c'est ta table qui est mal construite tu devrais avoir une table a coté qui contient les cotations des références
deux colonnes : id_reférence, cotation
les deux colonnes forme la clef primaire. si une cotation peux avoir deux références différentes alors ajoute une colonne en auto incrément (type serial).
ainsi tu pourras supprimer les cotations de cette table et y insérer les nouvelles ;) (plus simple et facile que de chercher la mise à jour dans ce cas).

tous repose sur ce que tu as exactement comme chose à gérer, depuis tout a l'heure j'imagine une bibliothèque avec des références de documents (livres, cd ...) et ont des cotations correspondant à des étagères dans des allées (par exemple). Dans ce cas mon raisonnement est bon mais je peux totalement me tromper :mrgreen:

@+

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 12 avr. 2017, 17:57
par hugo_064
Re,

Merci moogli pour avoir pris le temps de te pencher sur mon problème.

En mettant mon idée bien à plat,
je me suis penché sur l'imbrication d'une sous-requête dans une requête et j'ai finit par y arriver.

Pour ceux que cela intéresse, voici le code à réadapter en fonction de votre code :

$ref = 8756;
$cotations = '1_4,10_5,3_16';
$cotations = explode(",", $cotations);

$selectRef = $pdo->prepare('SELECT id FROM tatable WHERE Ref = ? ORDER BY id');
$updateCotation = $pdo->prepare('UPDATE tatable SET cotation = ? WHERE id = ?');

$selectRef->execute(array($ref));

foreach ($cotations as $cotation_value) {
if ($row = $selectRef->fetch(PDO::FETCH_ASSOC)) {
$updateCotation->execute(array($cotation_value, $row['id']));
}
}

A plus tout le monde.
Hugo_064

Re: [RESOLU] Insertion occurence Chaine de characteres dans base de données

Posté : 13 avr. 2017, 13:58
par moogli
de rien, tu as donc choisis la version pifométrique ;)


@+

Re: [RESOLU] Insertion occurence Chaine de characteres dans base de données

Posté : 13 avr. 2017, 14:21
par hugo_064
Bonjour,

:D et oui la version pifométrique a quand même du bon par moment.

Par contre j'ai toujours un soucis avec ma chaine pour l'exploiter.

Si la chaine est définit manuelle pas de soucis:

Code : Tout sélectionner

$cotations = '1_4,1_5,2_4,2_5'; echo $cotations; // il me renvoie '1_4,1_5,2_4,2_5' // et je peux updater ma base de données en exploitant les occurrences une par une
Si ma chaine est récupérer dynamiquement ça pose problème

Code : Tout sélectionner

$cotations = $_POST['cotations']; $cot= ''; foreach($cotations as $o) { $cot .= $o.','; } $cotations = substr($cot, 0, -1); echo $cotations; // il me renvoie bien '1_4,1_5,2_4,2_5' // mais je ne peux pas exploiter les occurrences individuelement // il exploite uniquement les occurrences '2_4,2_5' et zappe '1_4,1_5' // par contre si les occurrences sont '1_4,1_5,1_6,1_7' pas de soucis pour les exploiter
Serais tu pourquoi ?
Merci

Re: [RESOLU] Insertion occurence Chaine de characteres dans base de données

Posté : 13 avr. 2017, 14:27
par moogli
tu sais que
$cotations = $_POST['cotations'];
$cot= '';
foreach($cotations as $o) {
$cot .= $o.',';
}
$cotations = substr($cot, 0, -1);

c'est la même chose que $cotations = implode(',',$_POST['cotations']); ? (pour peux que $_POST['cotations'] soit bien un tableau
ton cas c'est même l'exemple de la doc ;) http://php.net/manual/fr/function.implode.php

pour le reste c'est étonnant, si tu as la même chaîne tu dois avec le même comportement.

par contre je ne comprend pas pourquoi d'un coté tu passe d'un tableau à une chaîne de caractère pour faire ensuite l'inverse.
pourquoi n'utilise tu pas simplement le tableau ?

@+

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 13 avr. 2017, 14:39
par hugo_064
Re,

lol
$cotations = implode(',',$_POST['cotations']);
Merci au passage.

mais ça ne resoud pas mon problème.
il exploite uniquement les occurrences '2_4,2_5' et zappe '1_4,1_5'

"pour le reste c'est étonnant, si tu as la même chaîne tu dois avec le même comportement. "
Sur le principe je suis d'accord alors pourquoi ça marche pas dans mon cas ??? j'ai la même chaine qui s'affiche mais qui se traite différement.

"par contre je ne comprend pas pourquoi d'un coté tu passe d'un tableau à une chaîne de caractère pour faire ensuite l'inverse.
pourquoi n'utilise tu pas simplement le tableau ?"
Heu,.... la je suis perdu

Merci

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 13 avr. 2017, 17:15
par hugo_064
Oula,

je viens de comprendre où cela bug.
En fin de compte c'est pas mon import qui merde.

C'est le $_POST['cotation'] que je récupère qui merde
quand les cotations ont la même première valeur pas de soucis 1_1,1_2 (ok)
par contre quand la 1ere valeur est différente ça bug 1_1,2_1 (pris en compte uniquement 2_1 )

Il faut que je revoie mon script qui poste les cotations
ou que je revoie le traitement des infos du $_POST['cotation'].

Je tiendrai informé le forum

Hugo_064

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 14 avr. 2017, 08:09
par moogli
ce qui serait intéressant c'est de voir la finalité globale de ce que tu fais.
Parce que la j'ai l'impression que tu fait quelque chose de complexe qui pourrais ne pas l'être.
il existe des type structuré plus efficace que le csv.
si tu as un tableau dans $_POST['cotation'] pourquoi ne pas utiliser ce tableau ?

@+

Re: Insertion occurence Chaine de characteres dans base de données

Posté : 14 avr. 2017, 11:29
par hugo_064
Re,

j'ai trouvé le problème, cela venait de ma chaine de caractères importée.
Une sal.... de faute de frappe.

J'ai encore du boulot avant de pouvoir te montrer la finalité du projet.
J'en suis à peine à 10%.
Je pense que tu me reverras sur le forum avant la fin du projet
mais je n'hésiterai pas à poster le lien une fois le tout en place.

Merci encore pour ton aide et aux autres qui ont pris le temps de lire mes problématiques.

hugo_064