update spécial, variable dynamique et mysql

update spécial, variable dynamique et mysql - SQL/NoSQL - Programmation

Marsh Posté le 13-09-2003 à 15:47:43    

bonjour!
 
j'ai un probleme dont j'ai parlé malheureusement dans la mauvaise catégorie; voici le sujet:

Citation :


Voilà mon souci:
 
sur une page je génére un formulaire qui servira a modifier des valeur de trois champs sur $n entrée différente. j'ai donc 3*$n input de type texte auquel je donne les noms en concatenant l'"id" du l'entrée corespondante avec "_1" "_2" ou "_3" suiant qu'il sagissent du champ 1, 2, 3 a modifier.
 
 
Donc du coup, mes 3*$n input ont les nom (admettons que $n = 4)
 
1_1 1_2 1_3 2_1 2_2 2_3 3_1.. etc
 
dans la page suivante ou j'effectue effectivement le changement sur le BD, je voudrais effectuer une requette du genre:
 
$sql = "UPDATE `subject` SET toto = ${CONCAT(id,'_1')}";
 
un peu a la maniere de  
 
UPDATE persondata SET age=age*2, age=age+1;
 
( http://dev.nexen.net/docs/mysql/an [...] ien=update )
 
sauf que je veux que le contenu de "id "soit concaténé avec "_1" et que ce string soit interprété comme une variable dont le contenu doit etre entré dans le champ "toto"
 
et cette requette ne marche pas.
 
(je sais que là je modifirais qu'un champs si ca marcherait, mais c'est pour simplifier)
Pouriez vous m'aider?
 
note: en fait la vrai question c'est : les variables dynamique existent t'elle en mySQL??


 
 
voilà l'adresse du message original:
http://forum.hardware.fr/forum2.ph [...] at=393#bas
 
merci de votre aide! ;)

Reply

Marsh Posté le 13-09-2003 à 15:47:43   

Reply

Marsh Posté le 13-09-2003 à 16:23:24    

un moyen de contourner le problème serait de pouvoir passer un champs dans une fonction genre
 
$sql = "UPDATE `subject` SET toto = ".test("id" )."";
 
mais j'ai essayer de le faire avec plein de syntaxes et je n'y arrive pas :(

Reply

Marsh Posté le 13-09-2003 à 20:45:59    

Tu peux accéder à unbe variable avec la syntaxe :
${"nom de la variable"}
 
Dans ton cas, ce serait un truc du genre :
${'id' . $i . '_' . $j}

Reply

Marsh Posté le 14-09-2003 à 19:03:33    

oui sauf que id doit etre remplacer à chaque tour dans la requette UPDATE par la valeur de l'id de l'enregistrement examiné en cour...
 
pour l'instant j'ai mis une boucle for pour faire tout les updates mais c'est assez catastrophique en terme d'acces a la BD :-/

Reply

Marsh Posté le 14-09-2003 à 20:26:45    

bon j'en ai parler longement avec un pot et vu comment on a galérer j'en deduis que mon esplication n'est pas clair du tout alors je recommence ;)
---------------------------------------------
je travail en php mysql
---------------------------------------------
j'ai une table nommé subject formé comme ceci:
 
id lang1 lang2 lang3 lang4
 
les lang de 1 à 4 sont les numeros des langues enregistré en id dans une autre table (languages), avec quantitées de traductions
 
l'id de la table subject est l'id d'un sujet X, "sujet" dans le meme etat d'esprit qu'un sujet d'un topic sur le forum (meme si ca n'a rien a voir, ici c'est un sujet de classement.) traduit dans les différentes langue. langX est de type varchar
 
le nombre de sujet et le nombre de lang n'est donc pas fixé.
 
 
l'idée est de vouloir rajouter une langue.
 
je genere donc un formulaire avec des input type="test" qui ont comme nom 1 2 3 4, numero des sujets. (en fait concaténé avec une chaine de caractere car sinon une variable avec un nom de chiffre ca ne marche pas)
 
dans la page ou j'effectue réélement les requettes,
 
dans un premier temps je fais un ALTER table pour ajouter la colone lang5
 
puis un update pour mettre a jour toutes les traductions des sujets dans cette nouvelle langue.
 
je devrais donc effecter autant d'update qu'il y a de sujet, ce qui est gerable avec une boucle for (c'est le systeme qui est en place, avec un autre systeme pour savoir les numeros car vu qu'il est possible de supprimer des langues et des sujets, des numeros d'id peuvent sauter), mais je trouve assez catastrophique de faire autant de requette alors que je pense qu'il est possible d'en faire une.
 
pour en faire une je note:  
 
$sql = "UPDATE `subject` SET lang".$id_new_lang." = ${CONCAT(id,'_1')}";
 
où $id_new_lang est l'id de la nouvelle langue et id l'id des sujets.
 
CONCAT(id,'_1') et sencé me generer le nom de chaque variable de mon formulaire a associé avec chaque id de sujet.  
 
mais vu que c'est que le nom de la variable, et qu'il nous faut le contenu, je fais  
 
${CONCAT(id,'_1')} pour avoir le contenu de la variable qui a le nom donné par la chaine de caratere genere par la partie entre acolade. ( systeme des variable dynamique)
 
le problème est que CONCAT(id,'_1') c'est du language mySQL et le coup des variable dynamique c'est du php, resultat ca ne marche pas:
 
en effet la chaine $sql est évalué une seule fois avant d'etre passé à mysql_query().
 
si je mets mes variables dans un tableau pour faire un truc du genre  
 
$sql = "UPDATE `subject` SET lang".$id_new_lang." = ".tab[id]."";
 
ca ne marche pas non plus pour les memes raisons.
 
il me faudrait donc un systeme de variable dynamique en mySQL en ayant accé au variable php, et ca je ne sais pas si ca existe.
 
Donc si vous connaisez ou si vous trouvez une autre methode pour faire la requette en une fois (quite a refaire le formulaire), je suis prenneur
 
merci ;)

Reply

Marsh Posté le 14-09-2003 à 20:36:11    

non, tu ne peux pas demander à ton serveur mysql de traiter les variables PHP.
T'es obligé de faire autant de requêtes qu'il y a de lignes [:proy]

Reply

Marsh Posté le 14-09-2003 à 20:40:14    

meme en generant une longue ligne en php comme quand on fait  
 
 
udpate toto set toto=2, tel = 055654641 etc...
 
je viens d'avoir l'idée, je peux pas mettre plusieur clause Where, avec une clause par upadate ?
 
remarque si c'est posible au niveau de l'acés a la base, ca revient un peu au meme...  
 
tant pis merci quand meme! ;)

Reply

Marsh Posté le 14-09-2003 à 21:04:00    

non
dans un UPDATE, chaque ligne est indépendante des autres [:proy]  
 
Il est parfois possible de "bricoler" quelques chose, du genre :
UPDATE table SET value = 4*(id=2) + 6*(id=3) WHERE id=2 OR id=3
 
Ca met value à 4 lorsque id=2, et value à 6 lorsque id=3
On joue sur le fait que (id=2) vaut 1 si id est égal à 2, 0 sinon.

Reply

Marsh Posté le 14-09-2003 à 22:39:44    

ok je te remercie.
 
 
mais pour quelque chose de propre, vu que comme tu l'as fais remarquer c'est du bricolage, vaut mieux que je fasse une boucle for?

Reply

Marsh Posté le 14-09-2003 à 22:44:58    

Je vois pas d'autre moyen [:proy]

Reply

Marsh Posté le 14-09-2003 à 22:44:58   

Reply

Marsh Posté le 14-09-2003 à 22:52:01    

oui mais ce que je veux dire, tu penses qu'il vaut mieux faire ce bidouillage ou faire une boucle for, pour ce qui est du temps de traitement? car j'ai deja pas mal de requette dans la page http://urgeman.free.fr/img/smiley/mlc.gif

Reply

Marsh Posté le 14-09-2003 à 22:57:58    

C'est plus simple de faire une boucle for. De toute façon, ce n'est pas une page qui est utilisée fréquemment.

Reply

Marsh Posté le 14-09-2003 à 22:59:13    

bonne remarque, merci  :jap:

Reply

Sujets relatifs:

Leave a Replay

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