[RESOLU] Plusieurs requetes SQL à la suite

Eléphant du PHP | 103 Messages

07 déc. 2013, 10:55

Bonjour!

Je dois [TRES 8-| ] mal faire car je suis obligé d'user d'imagination pour faire plusieurs requetes à la suite.
Actuellement, et cela fonctionne, je fais comme cela pour successivement réaliser :
  1. Un query pour CREATE
  2. Un query pour SELECT
  3. Un prepare pour INSERT / UPDATE
<?php  
$date = date("Ymd");
$heure = date("His");
  
$pdo = new PDO('mysql:host=localhost;dbname=MABASE', 'MONUSER', 'MONPASSWORD');
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
      
        $pdo->query("CREATE TABLE IF NOT EXISTS `$resultat2->subid` (date DATE, heure TIME, prod INT, PRIMARY KEY(date, heure));");

          $prodmax=$pdo->query('SELECT prod FROM `'.$resultat2->subid.'` ORDER BY prod DESC LIMIT 1');
          $prodmax->setFetchMode(PDO::FETCH_OBJ);
          $valeurprodmax = $prodmax->fetch();
        
            if ($texte[1] >= $valeurprodmax->prod)
              {
                $stmt = $pdo->prepare('INSERT INTO `' . $resultat2->subid . '` (date, heure, prod) VALUES (str_to_date('.$date.',\'%Y%m%d\'), '.$heure.', '.$texte[1].') ON DUPLICATE KEY UPDATE date = VALUES(date), heure = VALUES(heure), prod = VALUES(prod)');    
                $stmt->execute();
              }            
?>
Je souhaite rajouter un DELETE dans le prepare (ou ailleurs du moment que ce soit faire avant le INSERT/UPDATE), j'ai lu quelque part qu'on pouvait mettre plusieurs requetes du moment qu'on les sépare avec ; ou \ ce qui doit être finalement faux car cela ne fonctionne pas :
$stmt = $pdo->prepare('DELETE FROM '.$resultat2->subid.' WHERE date = str_to_date('.$date.',\'%Y%m%d\'); INSERT INTO `' . $resultat2->subid . '` (date, heure, prod) VALUES (str_to_date('.$date.',\'%Y%m%d\'), '.$heure.', '.$texte[1].') ON DUPLICATE KEY UPDATE date = VALUES(date), heure = VALUES(heure), prod = VALUES(prod)');    
$stmt->execute();
Tout comme rajouter dans le prepare ne fonctionne pas plus :
$stmt = $pdo->prepare('DELETE FROM '.$resultat2->subid.' WHERE date = str_to_date('.$date.',\'%Y%m%d\')'); 
$stmt = $pdo->prepare('INSERT INTO `' . $resultat2->subid . '` (date, heure, prod) VALUES (str_to_date('.$date.',\'%Y%m%d\'), '.$heure.', '.$texte[1].') ON DUPLICATE KEY UPDATE date = VALUES(date), heure = VALUES(heure), prod = VALUES(prod)');    
$stmt->execute();
PS : Il est normal que je fasse un DELETE avec INSERT/UPDATE car ayant des clés composées, je peux avoir plusieurs enregistrement au même jour mais pas à la même heure. Je veux supprimer tout enregistrement du jour précis avant d’insérer par cette méthode.

Je ne peux déclarer plusieurs query, exec ou prepare dans mySQL, comment faire au mieux?

Merci!!!!!
Modifié en dernier par moogli le 07 déc. 2013, 12:57, modifié 1 fois.
Raison : bbcode php

Eléphant du PHP | 103 Messages

07 déc. 2013, 18:50

Aie aie aie, la solution doit être toute simple mais je m'y casse les dents depuis quelques heures...!!!!!!!! #-o
Soulagez moi!!!!!!!!!!!!!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 déc. 2013, 21:40

Pourquoi tu ne fait pas un delete (pdo::query) puis l'insert ?
C'est quoi le problème ?
D'ailleurs si la clef primaire existe tu fait un update ça sert a rien de delete puis insert.
Mysql proposé la syntaxe replacé pour éviter de chercher si tu doit faire un insert ou un delete. (Oracle propose aussi une syntaxe similaire).


Pas : les "up" ne sont pas bien vu surtout sur la même journée un samedi avant nowel en plus ;) )

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 103 Messages

07 déc. 2013, 23:31

Bonsoir Moogli!

Il est vrai que mon système est un peu atypique! J'ai justement une clef composite sur 2 colonnes justement parce que j'ai deux système différents d'insertion mais ayant la même finalité.

Le premier système insère simplement la prod selon la date et une heure générique genre minuit car destinée à ne contenir qu'une seule donnée par jour.
Le second système insère la prod avec la date et l'heure réelle car destinée à contenir de nombreuses données par jour.

Il sera néanmoins possible pour une table utilisée par le second système d’insérer ponctuellement selon le premier système et dans ce cas il faut donc respecter la condition de la donnée unique journalière et donc de faire un DELETE avec INSERT!

En fait c'est exactement ce code qu'il me faut mais comment faire pour rajouter un DELETE juste avant le INSERT?

Merci!!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 déc. 2013, 00:15

Tu peu gérer toi même la transaction
http://fr.php.net/manual/fr/pdo.begintransaction.php
http://fr.php.net/manual/fr/pdo.commit.php

Ou utiliser le replace de mysql qui plus opti que ton delete puis insert je pense.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 103 Messages

09 déc. 2013, 20:15

Encore une fois merci Moogli !!!
Cela fonctionne, voici un bout de code :
$pdo->beginTransaction();
                $stmt1 = $pdo->prepare('DELETE FROM `' . $resultat2->subid . '` WHERE date=str_to_date('.$date.',\'%Y%m%d\')');
                $stmt1->execute();                
                $stmt = $pdo->prepare('INSERT INTO `' . $resultat2->subid . '` (date, heure, prod) VALUES (str_to_date('.$date.',\'%Y%m%d\'), '.$heure.', '.$texte[1].')');            //ON DUPLICATE KEY UPDATE date = VALUES(date), heure = VALUES(heure), prod = VALUES(prod)
                $stmt->execute();
                $pdo->commit();
Bye!!