IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Peut-on faire plusieurs INSERT en une fois


Sujet :

PHP & Base de données

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 223
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 223
    Par défaut Peut-on faire plusieurs INSERT en une fois
    Salut à tous,

    J'ai une station prend des mesures grâce à plusieurs sondes. Chaque sonde a un seuil critique.
    Si 3 ou 4 sondes mesurent une valeur critique, je dois insérer dans ma tables 'notifications' 3 ou 4 lignes.

    Avant la requete MYSQl, j'ai un array qui contient les mesures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    // $content
    Array
    (
        [0] => Array
            (
                [id_collection] => 309001
                [id_station] => 43
                [id_sensor] => 154
                [messageFR_db] => [1: 15cm] La mesure 24kPa doit se situer entre 30.00kPa et 60.00kPa
                [messageEN_db] => [1: 15cm] The measure 24kPa must be between  30.00kPa and 60.00kPa
                [messageFR] => La sonde [1: 15cm] est déclenchée
                [messageEN] => the sensor [1: 15cm] is trigged
                [operator] => <>
            )
     
        [1] => Array
            (
                [id_collection] => 309001
                [id_station] => 43
                [id_sensor] => 155
                [messageFR_db] => [2: 25cm] La mesure 17kPa ne doit pas se situer entre 10.00kPa et 60.00kPa
                [messageEN_db] => [2: 25cm] The measure 17kPa must not be between 10.00kPa and 60.00kPa
                [messageFR] => La sonde [2: 25cm] est déclenchée
                [messageEN] => the sensor [2: 25cm] is trigged
                [operator] => ><
            )
     
        [2] => Array
            (
                [id_collection] => 309001
                [id_station] => 43
                [id_sensor] => 158
                [messageFR_db] => [Pluie] la mesure 0mm est en dessous du seuil 30.00mm
                [messageEN_db] => [Pluie] The measure 0mm is below the thresold  30.00mm
                [messageFR] => La sonde [Pluie] est déclenchée
                [messageEN] => the sensor [Pluie] is trigged
                [operator] => >
            )
     
    )
    Je pourrais parcourir mon array et faire 3 requetes

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    if(count($content) > 0){
     
                    /* 
                    * SAVE ALARM INTO THE notifications TABLE 
                    */
     
                    foreach($content) as $k => $v{
                        // Prepare the MySQL request
                        $sql_insert_notifications = 'INSERT into notifications (
                            id_notification,
                            stations_id_station, 
                            sensors_id_sensor,
                            collections_id_collection,
                            notification_date,
                            notification_message_fr,
                            notification_message_en
     
                        ) VALUES (
                            "",
                            "'.$v['id_station'].'",
                            "'.$v['id_sensor'].'",
                            "'.$v['id_collection'].'",
                            "'.gmdate("Y-m-d H:i:s").'",
                            "'.$v['messageFR_db'].'",
                            "'.$v['messageEN_db'].'"
                        )';
     
                        if (!$_connect->query($sql_insert_notifications) )
                        {
                            if($debug) printf("Erreur : %s\n", $connect->error);
                        }else{
                            if($debug) echo "<p>Alarm inserted</p>";
                        }
     
     
                    }
    }

    ca irait très bien comme cela.

    Mais je me demandais s'il était possible de faire qu'une fois
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $_connect->query($sql_insert_notifications)

    En rédirigeant ce message, j'ai vu ceci 'multi_query'
    Je pourrais donc modifier comme ceci
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $sql_insert_notifications = "INSERT INTO notifications (
                        id_notification,
                        stations_id_station, 
                        sensors_id_sensor,
                        collections_id_collection,
                        notification_date,
                        notification_message_fr,
                        notification_message_en
                    ) VALUES
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en' )";
     
     
                    if ($_connect->multi_query($sql_insert_notifications) === TRUE) {
                      echo "New records inserted successfully";
                    } else {
                      echo "Error: " . $sql . "<br>" . $conn->error;

    La question que je me pose, est comment je peux construire cette partie, à partir de mon array $content, sachant que le nombre d'insert peu différer
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en' )

    Je ne peux pas faire un foreach entre VALUE et le dernier "

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    VALUES
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en'),
                        ('', 'stations_id_station', 'sensors_id_sensor', 'collections_id_collection', 'notification_date', 'notification_message_fr','notification_message_en' )"

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 532
    Par défaut
    Bonjour,
    Tu peux mettre le début de la requête dans une chaîne (jusqu'au VALUES), puis ajouter les valeurs dans ton foreach.
    Tu te retrouves ainsi avec une seule chaîne qui contient la requête complète (l'ordre INSERT et la liste des valeurs).

    Tatayo.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 581
    Par défaut
    Tu peux générer une requête sous la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table (champs1,champs2) VALUES ('val1','val2'),('val3','val4');
    en considérant que val1 et val2 sot les valeurs pour les champs sur une 1ère requête INSERT, val3 et val4 les valeurs pour une 2ème requête, insert
    facile à faire depuis ton foreach
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 223
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 223
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses
    oui mais on est d'accord que je dois ensuite faire
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $_connect->multi_query($sql_insert_notifications)
    au lieu de
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $_connect->query($sql_insert_notifications)

    Mais on est d'accord que
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table (champs1,champs2) VALUES ('val1','val2'),('val3','val4');
    est en fait une chaine de caractère.

    Je suis arrivé à ceci, et ca semble bien fonctionner

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $value ='';
    $c = count($content);
    $d = gmdate("Y-m-d H:i:s");
    foreach($content as $k => $v){
      $value=$value.'("","'.$v['id_station'].'","'.$v['id_sensor'].'","'.$v['id_collection'].'","'.$d.'","'.$v['messageFR_db'].'","'.$v['messageEN_db'].')';                  
     
      if($k < $c-1) $value=$value.',';
    }
    sql_insert_notifications = 'INSERT INTO notifications (
                        id_notification,
                        stations_id_station,
                        sensors_id_sensor,
                        collections_id_collection,
                        notification_date,
                        notification_message_fr,
                        notification_message_en
                    ) VALUES '.$value;
     
     
                    if ($_connect->multi_query($sql_insert_notifications) === TRUE) {
                      echo "New records inserted successfully";
                    } else {
                      echo "Error: " . $sql . "<br>" . $conn->error;
                  }

    Avez-vous quelque chose à redire?

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 581
    Par défaut
    Il ne faut ma multi_query mais simplement query car ce que j'indique n'est qu'une seule requête.

    Pour info, multi_query accepte une seuele requet donc ça marchera mais c'est juste pas necessaire.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. [Utilisation] Peut-on versionner plusieurs fichiers en une seule fois ?
    Par llaffont dans le forum Subversion
    Réponses: 0
    Dernier message: 18/03/2011, 16h33
  2. [C#/MySQL] Peut-on faire plusieurs requêtes dans une Transaction ?
    Par Ben42 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 01/02/2011, 09h16
  3. Exécuter plusieurs insert en une seul fois
    Par Lorenzox dans le forum Débuter
    Réponses: 3
    Dernier message: 04/11/2010, 14h35
  4. Réponses: 13
    Dernier message: 21/12/2005, 12h04
  5. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo