PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 14-07-2010 15:59:12

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

INSERT/UPDATE conditionnel

Bonjour,

Je crois que je mets un problème classique, mais tanpis !

[code mysql]
SELECT
    CASE WHEN EXISTS
        (
            SELECT
                COUNT( * )
            FROM
                wei
            WHERE
                id_eleve = ".$this->IdEleve."
        )
        THEN
        (
            UPDATE wei SET bus = 87 WHERE id_eleve = ".$this->IdEleve."
        )
        ELSE
        (
            INSERT INTO wei (bus, id_eleve) VALUES (87, ".$this->IdEleve.")
        )
    END 

[/code]

Ca ne fonctionne pas.

Ce qui ne semble pas aller, c'est la "sous-requête" INSERT ou UPDATE.*

J'ai regardé sur le web : http://dotnettipoftheday.org/tips/updat … w-sql.aspx : je n'arrive pas à le faire fonctionner

Merci !

Dernière modification par moijhd (14-07-2010 16:16:49)

Hors ligne

#2 14-07-2010 16:29:36

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

J'ai aussi trouvé ça :

[code mysql]
INSERT INTO table (cle,blabla) VALUES (1337,'truc') ON DUPLICATE KEY UPDATE blabla='truc';
[/code]

qui fonctionne pour le coup.

Mais, cela m'oblige à rechercher la clé. Et sachant que ma clé est autoincremente je ne vois pas très bien comment construire la requête ?

Qu'en pensez vous ?

Hors ligne

#3 14-07-2010 17:12:05

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : INSERT/UPDATE conditionnel

La clé qui doit être utilisé est bien id_eleve non ?
Pourquoi la mettre en auto_increment je ne comprend pas.

Hors ligne

#4 14-07-2010 17:27:37

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

La table wei a les champ suivants (id (auto), bus, id_eleve).
Je fais une recherche sur id_eleve.

Hors ligne

#5 14-07-2010 18:20:27

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : INSERT/UPDATE conditionnel

Peux-tu nous donner le résultat d'un SHOW CREATE TABLE wei


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 14-07-2010 18:55:24

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

C'est ce que j'allais faire :

[code mysql]
--
-- Structure de la table `wei`
--

CREATE TABLE IF NOT EXISTS `wei` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_eleve` int(11) NOT NULL,
  `bus` tinyint(1) NOT NULL,
  `acompte` tinyint(1) NOT NULL,
  `paye` tinyint(1) NOT NULL,
  `date_acompte` datetime NOT NULL,
  `date_paye` datetime NOT NULL,
  PRIMARY KEY (`id`)
)
[/code]

Hors ligne

#7 14-07-2010 21:11:57

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : INSERT/UPDATE conditionnel

Il n'y a donc aucun index ni aucune contrainte sur la colonne `id_eleve`, qui semble pourtant être une clé étrangère.
Mais le moteur (ENGINE) de la table n'étant pas précisé, il doit s'agir d'une table MyISAM et non InnoDB.
Il n'y a donc pas d'UNICITE déclarée sur la colonne `id_eleve`.
Quelle est la requête INSERT que tu essayes d'appliquer sur cette table wei ?


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 14-07-2010 21:37:22

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

J'ai rusé pour résoudre mon problème, je passe la clé primaire (c'est de toute façon mieux et plus facile) et j'utilise ON DUPLICATE KEY :

[code mysql]
INSERT INTO
    wei
    (
        id,
        bus,
        id_eleve,
        paye
    )
    VALUES
    (
        '".$this->Id."',
        '".$this->Bus."',
        '".$this->IdEleve."',
        1
    )
ON DUPLICATE KEY
    UPDATE
        bus = '".$this->Bus."' ,
        paye = 1

[/code]

$this->Id peut être vide : du coup, cela fait un INSERT avec AUTOINCREMENT. Sinon, ça fait UPDATE.

Le fait est que je voudrais bien savoir pourquoi ma première avec le CASE ne fonctionne pas.

Dernière modification par moijhd (14-07-2010 21:38:54)

Hors ligne

#9 14-07-2010 23:57:33

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : INSERT/UPDATE conditionnel

Bonjour,

Juste pour info, il faut savoir qu'ici l'insert n'est pas provoqué uniquement sur un $this->Id vide mais sur toute valeur qui n'est pas déjà éxistante dans la base de données. un $this->Id vide permet uniquement de bénéficier de l'auto_increment.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#10 15-07-2010 06:20:20

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

Je m'arrange pour que $this->Id une valeur existante ou rien :s

Dernière modification par moijhd (15-07-2010 06:21:00)

Hors ligne

#11 15-07-2010 06:21:14

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : INSERT/UPDATE conditionnel

moijhd a écrit :

Bonjour,

Je crois que je mets un problème classique, mais tanpis !


SELECT
  CASE WHEN EXISTS
    (
      SELECT
        COUNT( * )
      FROM
        wei
      WHERE
        id_eleve = ".$this->IdEleve."
    )
    THEN
    (
      UPDATE wei SET bus = 87 WHERE id_eleve = ".$this->IdEleve."
    )
    ELSE
    (
      INSERT INTO wei (bus, id_eleve) VALUES (87, ".$this->IdEleve.")
    )
  END  

 

Pourquoi faire simple si l'on peut faire compliqué wink

CASE
    WHEN EXISTS
        (SELECT id_eleve
         FROM wei
         WHERE id_eleve = ".$this->IdEleve.")
    THEN
        (UPDATE wei SET bus = 87 WHERE id_eleve = ".$this->IdEleve.")
    ELSE
        (INSERT INTO wei (bus, id_eleve) VALUES (87, ".$this->IdEleve.")
END

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 15-07-2010 12:42:55

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

Justement, la requête écrite directement comme ça ne fonctionne pas !

Hors ligne

#13 16-07-2010 21:19:00

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : INSERT/UPDATE conditionnel

Bonjour,

Il faut savoir quand même que "ON DUPLICATE KEY UPDATE" est spécifique à l'instruction INSERT et uniquement à l'instruction INSERT et permet donc EXCEPTIONNELLEMENT au sein de la même requête de transformer une requête INSERT en UPDATE dans un cas bien précis. Donc relis bien ton manuel mySQL et tu verras qu'une requête MySQL consiste SOIT à rechercher des informations via SELECT, SOIT à mettre à jour des infos via UPDATE, SOIT ajouter des infos via INSERT (pour l'essentiel) avec un moteur myISAM.

On veut bien t'aider, enfin, en ce qui me concerne, à la condition que tu fasses au moins l'effort de comprendre ce que tu écris et ce que tu essayes de faire, car je le rappele, nous on est obligé de le faire pour te répondre d'une manière avisée et cohérente. Il me parait donc normal que tu en fasses autant pour le moins.

Bonne continuation.

Dernière modification par Jc (16-07-2010 21:29:05)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#14 16-07-2010 22:03:35

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

Ok !

Cela ne m'aide pas à comprendre comment me passer de ON DUPLICATE KEY UPDATE pour faire l'une ou l'autre de mes requêtes et pourquoi le CASE tel que je l'écris ne fonctionne pas.

Je n'ai jamais dis non plus que j'étais convaincu par cette "ruse", mais je n'ai pas trouvé pour le moment d'autres solutions.

Sinon, je résous ce problème en deux requêtes indépendantes, mais ce n'est pas mon but. Mon but, c'est d'apprendre du SQL. J'essaie donc.

Dernière modification par moijhd (16-07-2010 22:05:11)

Hors ligne

#15 16-07-2010 22:39:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : INSERT/UPDATE conditionnel

Re bonjour,

Je viens de te l'expliquer pourtant : tu ne peux pas dans une instruction select faire de l'insert ou de l'update ni les deux. SOIT du fait du select, SOIT du fait de l'update, SOIT tu fait de l'insert. Essayer de faire du PHP en MySQL ne fonctionnera jamais, MySQL n'est pas conçu pour ça.

Peut pas être plus explicite hein. J'aurais du aussi rajouter "que tu essayes de comprendre ce que l'on te réponds". Donc si tu ne comprends pas (tu en as le droit), dis le, on te réexplique autrement, mais ne dit pas que nos réponses ne t'aident en rien. Car si tu es en mesure de juger de la qualité/pertinence de nos réponses, c'est que par conséquent tu es capable et en mesure de trouver les réponses à tes questions par toi même.

Je te laisse y réfléchir

PS: de plus dans la requête de ton premier post, quand tu ecris

qry="SELECT COUNT( * ) FROM wei WHERE id_eleve = '".$this->IdEleve."'";

la particularité d'une telle écriture (utiliser COUNT()) fait que même si l'ideleve n'existe pas ta requête retournera un enregistrement malgrès tout avec count(*)=0. Par conséquent, tester si une telle requête existe est obsolète et sera toujours vrai. D'autre part, je te laisse consulter la doc MySQL et vérifier sur PHPmyAdmin ton utilisation de EXISTS dans cette requête.

Dernière modification par Jc (16-07-2010 23:15:11)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#16 17-07-2010 07:11:32

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : INSERT/UPDATE conditionnel

Vu pour le SELECT SELECT / INSERT / UPDATE...je n'y avais as pensé...ou n'avais donc pas compris.
Mon test avec EXSTS doit être un copier-collle loupé.

Mais je ne peux pas commencer une requête par un CASE directement non plus.

Hors ligne

#17 18-07-2010 08:08:14

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : INSERT/UPDATE conditionnel

>>Mais je ne peux pas commencer une requête par un CASE directement non plus.

bah oui, tu peux wink

a++

Hors ligne

#18 21-07-2010 18:37:49

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : INSERT/UPDATE conditionnel

Bonjour,

Travaillant toujours en production avec un serveur 5.0, à ma connaissance ce que je vais dire maintenant reste d'actualité en v5.5 mais peut être pas en 6.0 . Donc si il y a des commentaires à ce que je vais dire maintenant n'hésitez pas^^.

J'ai l'impression donc que tout le monde mélange l'utilisation de CASE. En MySQL, il existe :
1) Une déclaration CASE
2) Un Opérateur de contrôle de flux de données CASE.

Dans le 1er cas, CASE peut en effet commencer la requête ou presque dans la mesure où la déclaration CASE ne peut s'utiliser qu'au sein d'une procédure stockée comme suit (je reprends l'exemple du manuel)


DELIMITER |

CREATE PROCEDURE p()
  BEGIN
    DECLARE v INT DEFAULT 1;

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE
        BEGIN
        END;
    END CASE;
  END;
  |
 

Dans ce cas donc, la déclaration CASE se termine par END CASE.

2) Dans le 2e cas, CASE en tant qu'opérateur ne peut débuter une requête et s'utilise comme suit:

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

Il s'utilise qu'au sein d'une déclaration SELECT^^. Ici de plus L'opérateur CASE se termine par END.

Dernière modification par Jc (21-07-2010 18:39:02)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums