Problème exécution de deux requettes simultanée

Problème exécution de deux requettes simultanée - PHP - Programmation

Marsh Posté le 17-02-2006 à 15:19:16    

Bonjour à tous,
 
je bloque actuellement sur un problème (simple à résoudre  :pt1cable: ?) concernant l'exécution de deux requettes.
 
Je trouvail sur une table cote numérotée. Du genre cote no.1 ... no.n, j'ai rajouté deux boutons pour pouvoir monter au descendre les cotes en changeant leur no.  
Théroriquement c'est simple : si l'utilisateur veut que la cote no.1 devient la no.2 il clique sur le bouton de la fleche qui descent donc : il faut ajouter +1 au no.1 qui devient 2 et inversement -1 au no.2 qui devient 1.
 
Voici mon script :

Code :
  1. /* on ajoute +1 à la cote en cour */
  2.      $query1 = "UPDATE p_cotes SET no_cote = ($no_cote +1) WHERE produit_id LIKE '$produit_id' AND no_cote LIKE '$no_cote'";
  3.      $result1 = mysql_query($query1)
  4.    or die ("Erreur dans la descente de numéro côte type e1" ); 
  5.  
  6.     /* on enleve -1 à la cote suivante */
  7.     $query2 = "UPDATE p_cotes SET no_cote = '$no_cote' WHERE produit_id LIKE '$produit_id' AND no_cote LIKE ($no_cote +1)";
  8.     $result2 = mysql_query($query2)
  9.   or die ("Erreur dans la descente de numéro côte type e2" ); 
  10.     redirect("index.php?action=gestion.cotes&produit=$produit_id", 0);


 
Si j'exécute les requettes séparément pas de problème, mais dès que je les ajoutes ca marche plus ... j'obtient toujours le meme resultat, le même numéro de cote !  :ouch:  
 
Quelqu'un pourais me donner une petite soluce ???

Reply

Marsh Posté le 17-02-2006 à 15:19:16   

Reply

Marsh Posté le 17-02-2006 à 15:22:41    

deux choses:
- tu fais +1 à la cote X ( celle-ci devient donc X'=X+1) et ensuite tu fais -1 à la cote qui vaut X+1 soit X'
- c'est normal que ça soit des strings tes cotes et pas des int?

Reply

Marsh Posté le 17-02-2006 à 15:24:10    

Tu met temporairement un des id à -1 (théoriquement tu dois pas avoir -1 dans ta bdd).

Reply

Marsh Posté le 17-02-2006 à 15:29:48    

- c'est normal que ça soit des strings tes cotes et pas des int?
Heu ... quel est la différence ?
 
Pour ce qu'il est des cotes, sur papier j'ai trouvé que pour une cote X le no. de celle-ci devient X+1
Par la suite la cote suivante no. X+1 son no devient X-1
 
Un exmple concret : descente de la cote 1 en 2
- le no de la cote 1 devient X+1 donc 2
- le no de la cote 2 devient X-1 donc 1
Vue que les cotes sont classées par no., la cote deux serait donc bien à la place de la 1.
 
Je sais pas ou je me trompe, mais ca fait deux heures que j'essaye n'importe qu'elle technique et le resultat est le meme. J'ai meme essayé de passer le no. de cote en cour et celui suivant dans l'url pour m'en reservir dans les requettes mais rien n'y fait ... :(

Reply

Marsh Posté le 17-02-2006 à 15:31:25    

Tu met temporairement un des id à -1 (théoriquement tu dois pas avoir -1 dans ta bdd).
C'est ce que j'suis entrain de faire, mais j'aurais bien aimé savoir ou je m'étaits trompé avant, car oau début je pensais que ce serait simple !!!

Reply

Marsh Posté le 17-02-2006 à 15:40:54    

mc_cut_killer a écrit :

- c'est normal que ça soit des strings tes cotes et pas des int?
Heu ... quel est la différence ?


la doc ça roxxe:
http://dev.mysql.com/doc/refman/4. [...] rview.html
http://dev.mysql.com/doc/refman/4. [...] rview.html
 
Quoi qu'il en soit, même s'en savoir ce quoi la différence, comment se fait-il que les deux requetes ne soit pas similaires?
 

mc_cut_killer a écrit :


Un exmple concret : descente de la cote 1 en 2
- le no de la cote 1 devient X+1 donc 2
- le no de la cote 2 devient X-1 donc 1


oui enfin la tu noteras bien que tu as 2 cotes qui valent 2 ...
Regarde j'ai les quotes X=1 et Y=2.
Tu fais X=X+1 => X=2
Ensuite
Pour la cote = 2 tu fais -1, d'accord mais la quote=2 c'est X ET Y


Message édité par anapajari le 17-02-2006 à 15:41:41
Reply

Marsh Posté le 17-02-2006 à 15:42:03    

Voici, quelque chose qui marche en mettant temporairement -1 au no de tranche en cour :
 

Code :
  1. /* on met le no de cote à -1 pour la cote en cour */
  2.      $query1 = "UPDATE p_cotes SET no_cote = -1 WHERE produit_id LIKE '$produit_id' AND no_cote LIKE '$no_cote'";
  3.      $result1 = mysql_query($query1)
  4.    or die ("Erreur dans la descente de numéro côte type e1" ); 
  5.  
  6.     /* on met le no de cote en cour pour la suivante */
  7.     $query2 = "UPDATE p_cotes SET no_cote = '$no_cote' WHERE produit_id LIKE '$produit_id' AND no_cote LIKE ($no_cote +1)";
  8.     $result2 = mysql_query($query2)
  9.   or die ("Erreur dans la descente de numéro côte type e2" ); 
  10.    
  11.     /* on met le no de cote en cour + 1 au lieu de -1 */
  12.     $query3 = "UPDATE p_cotes SET no_cote = ($no_cote +1) WHERE produit_id LIKE '$produit_id' AND no_cote = -1";
  13.     $result3 = mysql_query($query3)
  14.   or die ("Erreur dans la descente de numéro côte type e3" );


 
Cela ne fait pas inpeu lourd ? Il existe pas un moyen plus simple pour obtenir ce resultat ?

Reply

Marsh Posté le 17-02-2006 à 15:46:19    

et puis tu dois pouvoir tout faire en une seule requete un truc dans le genre

Code :
  1. UPDATE p_cotes SET no_cote = no_cote+1 - (no_cote-$no_cote)*2 WHERE produit_id LIKE '$produit_id' AND ( no_cote = $no_cote or no_cote=$no_cte+1)

Reply

Marsh Posté le 17-02-2006 à 15:48:03    

Regarde j'ai les quotes X=1 et Y=2.
Tu fais X=X+1 => X=2
Ensuite
Pour la cote = 2 tu fais -1, d'accord mais la quote=2 c'est X ET Y

 
 
Effectivement, j'avais été un peu vite dans l'étude du problème.
J'ai fini par opté pour le mise à -1 temporaire du no de cote à descendre, car je ne voi pas comment faire en partant de l'autre principe.

Reply

Marsh Posté le 17-02-2006 à 15:54:01    

Je viens d'essayer la requette au dessus de mon dernier poste de anapajari.
 
Celle-ci renvoie encore une fois le meme no pour les cotes concernées :( domage j'aurais bien aimez n'utiliser qu'une requette au lieu de 3!
 
Je vais essayer de trouver comme faire avec une requette, mais je croi bien que c'est au dessus de mes compétences :)

Reply

Marsh Posté le 17-02-2006 à 15:54:01   

Reply

Marsh Posté le 17-02-2006 à 16:03:40    

mc_cut_killer a écrit :

Je viens d'essayer la requette au dessus de mon dernier poste de anapajari.
 
Celle-ci renvoie encore une fois le meme no pour les cotes concernées :( domage j'aurais bien aimez n'utiliser qu'une requette au lieu de 3!
 
Je vais essayer de trouver comme faire avec une requette, mais je croi bien que c'est au dessus de mes compétences :)


Nan nan elle marche bien la requête :o
 
J'ai créé la table suivante pour tester:

Code :
  1. CREATE TABLE `cote` (
  2.  `no` int(11) NOT NULL,
  3.  `lib` varchar(2) NOT NULL
  4. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  5.  
  6. INSERT INTO `cote` VALUES (3, 'A');
  7. INSERT INTO `cote` VALUES (4, 'B');


 
Donc je me retrouve dans la table avec:

Citation :


no      lib
3        A
4        B


 
Ensuite je fais cette requete ( j'ai remplace ton $no_cote par 3 pour l'exemple):

Code :
  1. UPDATE cote SET no = no + 1 - (no-3)*2 WHERE no=3 OR no=3+1


 
et le contenu de ma table devient:

Citation :


no      lib
4        A
3        B


 

Reply

Marsh Posté le 17-02-2006 à 16:19:47    

J'doi vraiment etre un bourrin lol
 
Moi ca marche pas, faut dire que je me contente d'utiliser des requettes simple pour l'instant  :sweat:  
 
Je vais garder ce post pour m'en servir lors d'une prochaine évolution.
Quoi qu'il en soit je vous remercie pour votre aide car maintenant ca marche, certes avec trois requettes mais bon ...
 
 
Moi j'utilise cette table, et $no_cote est récupéré dans l'url par un $_GET

Code :
  1. CREATE TABLE `p_cotes` (
  2.   `cote_id` mediumint(9) NOT NULL auto_increment,
  3.   `produit_id` mediumint(9) NOT NULL,
  4.   `no_cote` tinyint(4) NOT NULL,
  5.   `lib_controle` varchar(50) NOT NULL,
  6.   `cote_mini` decimal(15,6) NOT NULL,
  7.   `cote_maxi` decimal(15,6) NOT NULL,
  8.   `date_creation` int(11) NOT NULL,
  9.   `utilisateur_creation` varchar(15) NOT NULL,
  10.   `poste_creation` varchar(15) NOT NULL,
  11.   `date_modif` int(11) NOT NULL,
  12.   `utilisateur_modif` varchar(15) NOT NULL,
  13.   `poste_modif` varchar(15) NOT NULL,
  14.   PRIMARY KEY  (`cote_id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;


 
Avec ces trois valeurs de test :

Code :
  1. INSERT INTO `p_cotes` (`cote_id`, `produit_id`, `no_cote`, `lib_controle`, `cote_mini`, `cote_maxi`, `date_creation`, `utilisateur_creation`, `poste_creation`, `date_modif`, `utilisateur_modif`, `poste_modif`) VALUES (9, 2, 1, 'cote de test 1.0', 6.000000, 5.000000, 1139829613, 'utilisateur', '192.168.0.2', 1139830279, 'jeremie', '192.168.0.2');
  2. INSERT INTO `p_cotes` (`cote_id`, `produit_id`, `no_cote`, `lib_controle`, `cote_mini`, `cote_maxi`, `date_creation`, `utilisateur_creation`, `poste_creation`, `date_modif`, `utilisateur_modif`, `poste_modif`) VALUES (11, 2, 2, 'cote 2', 12.000000, 50.000000, 1140103831, 'utilisateur', '192.168.0.2', 1140103831, 'jeremie', '192.168.0.2');
  3. INSERT INTO `p_cotes` (`cote_id`, `produit_id`, `no_cote`, `lib_controle`, `cote_mini`, `cote_maxi`, `date_creation`, `utilisateur_creation`, `poste_creation`, `date_modif`, `utilisateur_modif`, `poste_modif`) VALUES (13, 2, 3, 'cote 3', 1.000000, 2.000000, 1140165347, 'utilisateur, '192.168.0.2', 1140165347, 'jeremie', '192.168.0.2');

Reply

Marsh Posté le 17-02-2006 à 16:49:30    

nan nan même avec ta table ça marche :o
 

Code :
  1. SELECT cote_id, no_cote FROM p_cotes;
  2. code_id   no_cote
  3. 9            1
  4. 11           2
  5. 13           3


puis ( $no_cote=1 dans l'exemple)

Code :
  1. UPDATE p_cotes SET no_cote = no_cote+1 - (no_cote-1)*2 WHERE produit_id LIKE '%' AND ( no_cote = 1 OR no_cote=1+1)


enfin

Code :
  1. SELECT cote_id, no_cote FROM p_cotes;
  2. code_id   no_cote
  3. 9            2
  4. 11           1
  5. 13           3


Message édité par anapajari le 17-02-2006 à 16:50:21
Reply

Marsh Posté le 17-02-2006 à 16:57:53    

Effectivement ca marche !  :D  
 
Encore falait-il que je pense à faire le premier select  :pfff:  
 
Du coup je te remercie vraiment pour ton aide, car ca fait carément plus propre et plus efficace que ma première technique  :jap:  
 
@bientot et bon week end ...  :sarcastic:

Reply

Marsh Posté le 22-02-2006 à 11:15:29    

Bon je reviens sur mon problème :(
 
Effectivement j'ai cru que ca marchais et après mon petit week de 4 jours, je teste tranquilement et ... c'est le drame !
 
Voici la requette que j'utilise avec mes paramètres :

Code :
  1. $query = "UPDATE p_cotes SET no_cote = no_cote+1 - (no_cote-1)*2 WHERE produit_id LIKE '$produit_id' AND ( no_cote = $no_cote OR no_cote=($no_cote+1))";
  2.      $result = mysql_query($query)
  3.       or die ("Erreur dans la descente de numéro côte type e1" );


 
Lorsque je l'exécute une première fois, ca marche nickel la cote 1 obtient le no.2 et inversement pour la 2.
Par la suite je tente donc de déscendre la cote 1 devenue 2 en 3, et la ca marche plus du tout !
 
La cote 3 obtient le no. 0 et la cote 2 et 1 on toutes deux le numéro 1  :pt1cable:  
 
Je voie pas du tout où est le problème car je ne possède pas encore le niveau pour utiliser de telles requettes  :sweat:  
Alors sans abuser, si on pouvais m'indiquer l'érreur ca serait vraiment bien  :ange:

Reply

Marsh Posté le 22-02-2006 à 15:52:32    

up! :)

Reply

Marsh Posté le 22-02-2006 à 16:39:11    

"no_cote = no_cote+1 - (no_cote-1)*2"
C'est pas pour dire, mais cette partie me semble être basé sur un super cas particulié. En bref, en temps normal, ca ne marche pas.
 
En plus, la partie where de ta requette semble faite pour ne permette l'inversion que de deux éléments contigue.
 
 
En plus générique :  

  • tu commences par faire la somme des deux indices.
  • dans le "where", tu sélectionnes tes deux éléments.
  • dans le "set", tu soustraits l'indice actuel au nombre que t'as calculé au début.


Tu véras que comme ça, ca marchera trés bien et même si t'as besoin d'inverser des éléments trés éloigné, tu le feras sans rien avoir à changer.
 
PS : je te l'ai écrit sous forme d'algorythme, a toi de le coder sous forme d'une requette sql et d'un peu de php.
 
 
PS2 : Voilà les indices calculé par ta formule avec le calcul sous la forme : incide de départ => (indice de départ-1) - ((indice de départ+1)*2) = résultat
0 => 1 - (-2) =  3
1 => 2 - 0    =  2
2 => 3 - 2    =  1
3 => 4 - 4    =  0
4 => 5 - 6    = -1
4 => 6 - 8    = -2
....

Message cité 1 fois
Message édité par omega2 le 22-02-2006 à 16:45:17
Reply

Marsh Posté le 22-02-2006 à 17:11:20    

OK, je regarde ca demain :)
 
Mais dans tout les cas l'inversion se fera toujours sous forme contigue. En fait j'ai ajouté deux images de fleches à la suite de l'apercu (une qui monte et qui descent), de cette façon l'inversion se fait toujours avec l'élément (le no.) du dessus, ou du dessous pour l'opération inverse.

Reply

Marsh Posté le 23-02-2006 à 12:06:34    

omega2 a écrit :

"no_cote = no_cote+1 - (no_cote-1)*2"
C'est pas pour dire, mais cette partie me semble être basé sur un super cas particulié. En bref, en temps normal, ca ne marche pas.
En plus, la partie where de ta requette semble faite pour ne permette l'inversion que de deux éléments contigue.


Tout a fait cela ne marche que si les deux élements se suivent ... Sinon [:ratal]
Mais c'est comme ça que j'avais compris le problème! et c'est bien ce que semble dire mc_cut_killer.
 
Si ça merde c'est parce qu'à un endroit j'avais remplacé $no_cote par 1 et que tu as laissé 1, il fallait faire:

Code :
  1. UPDATE p_cotes SET no_cote = no_cote+1 - (no_cote-$no_cote)*2 WHERE produit_id LIKE '$produit_id' AND ( no_cote = $no_cote OR no_cote=($no_cote+1))


Et là tu n'auras plus (enfin ne devrais plus avoir) de problème.

Reply

Marsh Posté le 24-02-2006 à 11:07:27    

Excelent  :sol:  
 
J'avais laissé un 1, du coup avec la dernière requette ca marche nickel  :wahoo:  
 
Un grand merci à anapajari pour son aide et sa patience ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed