Mise à jour d'un champ en conservant la valeur existante

Pinocchio
Invité n'ayant pas de compte PHPfrance

30 mai 2006, 10:05

Bonjour à tous

Je souhaiterais updater un champ de ma table tout en conservant la valeur déjà présente dans ce champ.

J'ai essayé ça :
$MySQL = "UPDATE table SET champ1=(SELECT champ1 FROM table WHERE id=2) '" . $var . "' WHERE id=2;";
Mais ça ne fonctionne pas :/

Si par exemple mon champ1 contenait la valeur Toto, Titi.
Et que ma variable valait Tutu, je voudrait avoir au final donc Toto, Titi, Tutu dans ce champ.

Est-ce possible en une seule requête ?

Merci.

Mammouth du PHP | 1353 Messages

30 mai 2006, 10:44

Si il s'agit de chaine de caractère il semble que la concaténation soit possible en convertissant d'abord en VARCHAR.

Une requete de ce type :

Code : Tout sélectionner

'UPDATE table SET champ1 = CONVERT(VARCHAR,champ1) + '.$var.' WHERE ID_DOC = 6';
me semble correcte

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2006, 12:10

A tous les coups ta base de données est mal modélisée, puisque tu stockes plusieurs valeurs dans une même colonne, alors que tu aurais dû a priori avoir une autre table et une jointure entre les 2.

Et à chaque nouvelle valeur à enregistrer, ajouter une nouvelle ligne dans la jointure ce qui t'aurais évité des manoeuvres tordues comme celle ci.

Ce n'est peut-être pas trop tard étudie donc le problème ;)

Pinocchio
Invité n'ayant pas de compte PHPfrance

30 mai 2006, 14:14

Merci de vos réponses.

En fait ce champ (NULL par défaut) est optionnel quelques utilisateurs ( de confiance )pourront y rentrer quelquechose et ne doivent pas être identifié de quelques manières que ce soit ( anonymat oblige ).

Je préfèrerais ne pas créer une table réservée uniquement à cet enregistrement car, je serais contraint de faire un requête supplémentaire dans mon code php, ou une double jointure externe ( voir triple ) dans ma requête.
Et comme je suis pas trop bon en sql ( je tiens pas me tromper) et que la mise en place de ce que je veux est à faire assez rapidement, je n'ai pas trop le temps d'étudier tout ça plus en détail ( manque de temps ).

Mon champ est de type text, je vais donc essayer ta requête guilt92.

Merci à vous deux :D

Pinocchio
Invité n'ayant pas de compte PHPfrance

30 mai 2006, 14:33

Ca ne fonctionne pas :(

Tant pis, je faire un select avant l'update.

Merci quand même :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2006, 14:35

Ca ne fonctionne pas :(
Et ça fait quoi exactement ? message d'erreur, résultat :?:

Tu dois pouvoir rajouter une valeur en faisant comme ça, pas besoin de passer par 2 requêtes

Pinocchio
Invité n'ayant pas de compte PHPfrance

30 mai 2006, 15:58

Je viens de réessayer avec ou sans quotes, c'est pareil, toujours pas d'enregistrement.

Voici l'echo de ma requête :

Code : Tout sélectionner

UPDATE table SET champ= CONVERT(VARCHAR,champ) + test WHERE id=7
Et l'erreur signalée par mysql_error()
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR,champ) + test WHERE id=7' at line 1

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 mai 2006, 21:57

as tu été voir la doc pour CONVERT ?

Sinon un CONCAT ne ferait pas l'affaire ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 mai 2006, 22:04

as tu été voir la doc pour CONVERT ?
Oui, tu ferais bien, tu verras pourquoi ça ne marche pas

Ce n'est pas parcequ'un truc est marqué sur le forum qu'il faut copier aveuglément! une petite erreur d'inatention est vite arrivée... à toi de corriger en cherchant dans la doc

Et quand tu auras vu ce qui poseproblème, tu pourras l'enlever (le Convert) car ici il ne sert à rien
Et tu suivras la suggestion de Truc ;)

Pinocchio
Invité n'ayant pas de compte PHPfrance

31 mai 2006, 00:16

Ce n'est pas parcequ'un truc est marqué sur le forum qu'il faut copier aveuglément! une petite erreur d'inatention est vite arrivée... à toi de corriger en cherchant dans la doc
C'est parce que j'ai une confiance aveugle en mes interlocuteurs :D
Et puis des trucs, il y en a au moins 3187 sur le forum :mrgreen:

Bon, je viens d'aller voir et effectivement le type varchar n'est pas supporté.

Mais excusez moi de mon ignorance ou de ma stupidité, mais je vois vraiment pas comment adapté un CONCAT à mon update :?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 mai 2006, 00:36

Et puis des trucs, il y en a au moins 3187 sur le forum :mrgreen:
Pas sûr je suis le seul :mrgreen:

Et un lien vers la doc de CONCAT au cas où tu ne l'aurais pas trouvé :wink:

la fonction concatène les paramètres les uns après les autres donc:
CONCAT('elem1',' elem2') => 'elem1 elem2'
Tu peux passer ce dont tu as besoin en paramètre.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Pinocchio
Invité n'ayant pas de compte PHPfrance

31 mai 2006, 20:15

Oui, je sais tu es le seul Truc :D

D'accord, le CONCAT, j'ai compris, mais je ne peux pas m'en servir puisque les données à entrer dans ce champ ne se font pas en même temps (jour, heure).

J'ai essayé une requête aussi loufoque que ça :
$sql = "UPDATE table SET champ =
      SELECT CONCAT('" . $_POST['note'] . "',
      (SELECT champ FROM table WHERE id=" . $_POST['id'] . ")) 
       WHERE id=" . $_POST['id'];
Mais bien sûr MySQL ne veut pas :mrgreen:

Donc je vois pas d'autres moyens que de faire un SELECT avant.

Merci tout de même ;)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

31 mai 2006, 20:27

D'accord, le CONCAT, j'ai compris, mais je ne peux pas m'en servir puisque les données à entrer dans ce champ ne se font pas en même temps (jour, heure).
Je comprends pas, tu vois trop compliqué

Le CONCAT ne sert pas à concaténer les infos que tu entres à des moments différents, mais à concaténer ce qu'il y a DEJA dans la colonne, et ce que tu veux rajouter

Et pour ça pas besoin de SELECT tordu, tu peux utiliser le nom d'une colonne comme valeur

Base toi sur la première requête avec CONVERT que guilt92 t'avais donnée

Pinocchio
Invité n'ayant pas de compte PHPfrance

31 mai 2006, 20:41

Bon, d'accord, je vais réeesayer avec CONVERT et je vous dis quoi :P

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

31 mai 2006, 20:45

Bon, d'accord, je vais réeesayer avec CONVERT et je vous dis quoi :P
NOOON !!!

Est-ce que tu as compris ce que faisait CONVERT ?
Est-ce que tu as compris ce que faisait CONCAT ?

A mon avis non, Convert ne fait pas ce que tu veux, Concat oui.
Après la requête est sensiblement la même...