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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mise à jour d'un champ en conservant la valeur existante

par Hubert Roksor » 01 juin 2006, 22:48

T'inquiète pas, ce n'est pas plus dur que d'être obligé de jongler avec les CONCAT(), COALESCE() et LTRIM() qui sont nécessaire avec le format que tu utilises à l'heure actuelle. Et puis il est plus facile de trouver de l'aide pour un problème de jointure dont on est pas sûr que pour le traitement d'un champs dénormalisé.

par Pinocchio » 01 juin 2006, 22:10

Oui, je sais, mais ça me fait un peu peur les requêtes complexes, et comme vous avez pu le constater, je suis nul en ce domaine, et donc, il faut pas que je me trompe.

Mais je vais essayer de faire une nouvelle table, vous avez raison, je vais tenter ma chance.

Merci.

par Hubert Roksor » 01 juin 2006, 22:03

Ca me fait rajouter un caractère au début de mon champ, mais c'est pas grave, je l'enlèverais avec le php.
Ah, le second problème est apparu pendant que j'écrivais mon précédent message ;)

Mauvaise nouvelle : ce ne sera pas le dernier... normalise !

par Hubert Roksor » 01 juin 2006, 22:01

Comme le disait ouckileou en début de topic, normalise tes données et crée une nouvelle table. Vraiment, c'est le meilleur conseil qu'on puisse te donner. Il n'existe virtuellement aucune situation où garder plusieurs informations dans un même champs est bénéfique, tu auras mieux fait d'utiliser une table séparée plus une seconde pour faire la liaison.

Et ne t'inquiète pas pour la "double jointure", ça prend 5 secondes de plus à écrire et 3 microsecondes à exécuter. Crois-moi, si tu t'obstines à conserver ce schéma tu risques de gros ennuis, ça n'en vaut pas la peine. (la preuve, tu commences déjà à avoir des problèmes à cause de NULL)

par Pinocchio » 01 juin 2006, 21:58

Ca fonctionne :D

Ca me fait rajouter un caractère au début de mon champ, mais c'est pas grave, je l'enlèverais avec le php.

Merci !!

par ouckileou » 01 juin 2006, 21:30

Regarde ici : http://sunsite.mff.cuni.cz/MIRRORS/ftp. ... _NULL.html

Notamment le premier commentaire de la liste

par Pinocchio » 01 juin 2006, 20:33

Bonsoir,

Je suis désolé de relancer le sujet, mais je viens de m'aperçcevoir que ça ne fonctionnait pas pour le 1er enregistrement, et pour cause, il est NULL par défaut, c'est précisé dans la doc, CONCAT(NULL, 'quelquechose') donne NULL, y'a t-il un moyen de contourner le problème ?

Merci.

par ouckileou » 31 mai 2006, 21:58

Je suis sur le cul, je cherchais un truc hyper complexe alors que c'était tout simple.
Ben ouais ;)

C'est ça que je voulais que tu trouves, reprendre le modèle CONVERT, mais avec CONCAT...
"Se baser sur" ne veut pas dire "copier/coller" :lol:

par Pinocchio » 31 mai 2006, 21:52

J'ai réussi :D
$sql = "UPDATE table SET note= CONCAT(note, '" . $_POST['note'] . "')
            WHERE id=" . $_POST['id'];
Je suis sur le cul, je cherchais un truc hyper complexe alors que c'était tout simple.

Merci à tous, et merci de votre patience à mon égard :P

par Cyrano » 31 mai 2006, 21:33

Peut-être expliqué différemment, l'idée du CONCAT te paraîtra plus évidente: il s'agit en effet de court-circuiter la requête SELECT en faisant directement ta mise à jour : En supprimant une requête, tu gagnes en temps et en performance. Je t'accorde volontiers que sur une requête, le gain est insignifiant, mais multiplie ça à l'échelle de toute une application et tu réalisereas que finalement, cette option n'est pas totalement dénuée d'intérêt ;)

Donc en clair : au lieu d'un SELECT + une bidouille par programmation pour créer la nouvelle chaine + un UPDATE, tu fais uniquement un UPDATE, rien d'autre :)

par Pinocchio » 31 mai 2006, 21:15

Désolé, je comprend plus là, tu me dis d'utiliser la méthode de guilt92, et après tu me dis non.

Oui, j'ai compris ce que faisait concat et convert.

Mais CONCAT ne me sert à rien, je suis obligé d'extraire avec un select avant.

Vous embêté pas pour moi, je sais je suis long à comprendre.

Je vais essayer quand même.

par ouckileou » 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...

par Pinocchio » 31 mai 2006, 20:41

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

par ouckileou » 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

par Pinocchio » 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 ;)