[RESOLU] Plusieurs requetes SQL à la suite

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 : [RESOLU] Plusieurs requetes SQL à la suite

Re: Plusieurs requetes SQL à la suite

par josse34 » 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!!

Re: Plusieurs requetes SQL à la suite

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

@+

Re: Plusieurs requetes SQL à la suite

par josse34 » 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!!

Re: Plusieurs requetes SQL à la suite

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

@+

Re: Plusieurs requetes SQL à la suite

par josse34 » 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!!!!!!!!!!!!!

Plusieurs requetes SQL à la suite

par josse34 » 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!!!!!