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 :

Insertion dans 2 tables à la fois !


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut Insertion dans 2 tables à la fois !
    Bonjour

    Je cherche à insérer les données dans 2 tables différentes. 1 infosfacture corresponds à 1 ou plusieurs facturations.

    Voici mes tables :
    Code sql : 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
    CREATE TABLE `infosfacture` (  `id_facture` int(11) NOT NULL AUTO_INCREMENT,
      `num` varchar(10) DEFAULT NULL,
      `client` text,
      `datefacture` DATETIME DEFAULT NULL,
      `facturede` text,
      `conditions` text
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    ---- Structure de la table `infosfacture`
    --
     
    CREATE TABLE `facturation` (
      `id_prestation` int(11) NOT NULL AUTO_INCREMENT,
      `fk_facturation_id` int(11) NOT NULL,
      `designation` text,
      `quantite` int(11) DEFAULT NULL,
      `prixht` decimal(10,2) DEFAULT NULL,
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    Voici mon code qui traite les données venant du formulaire :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?phprequire_once 'connexion.php';
    //On vérifie si la variable existe et sinon elle vaut NULL
    $num = isset($_POST['num']) ? $_POST['num'] : NULL;
    $client = isset($_POST['client']) ? $_POST['client'] : NULL;
    $designation = isset($_POST['designation']) ? $_POST['designation'] : NULL;
    $quantite = isset($_POST['quantite']) ? $_POST['quantite'] : NULL;
    $prixht = isset($_POST['prixht']) ? $_POST['prixht'] : NULL;
    $datefacture = isset($_POST['datefacture']) ? $_POST['datefacture'] : NULL;
    $facturede = isset($_POST['facturede']) ? $_POST['facturede'] : NULL;
    $conditions = isset($_POST['conditions']) ? $_POST['conditions'] : NULL;
    //var_dump($_POST);
    // generate request params
    $params = [];
    $values = '';
    $facturation = [];
    foreach ($_POST['designation'] as $key => $designation) {
        $params[':designation' . $key] = $designation;
        $params[':num' . $key]    = $_POST['num'];
        $params[':client' . $key]    = $_POST['client'];
        $params[':quantite' . $key]    = $_POST['quantite'][$key];
        $params[':prixht' . $key]  = $_POST['prixht'][$key];
        $params[':datefacture' . $key] = $_POST['datefacture'];
        $params[':facturede' . $key] = $_POST['facturede'];
        $params[':conditions' . $key] = $_POST['conditions'];
     
     
        $values1 .= '(:num' . $key . ' , :client' . $key . ', :datefacture' . $key . ', :facturede' . $key . ', :conditions' . $key . '),';
     
     
          // prepare facturation data
        $facturation[] = [
          'designation' => $designation,
          'num'  => $_POST['num'][$key],
          'client'  => $_POST['client'][$key],
          'quantite'    => $_POST['quantite'][$key],
          'prixht'  => $_POST['prixht'][$key],
          'datefacture'  => $_POST['datefacture'][$key],
          'facturede'  => $_POST['facturede'][$key],
          'conditions'  => $_POST['conditions'][$key]
        ];
    }
     
     
    //var_dump($_POST['num'][$key]);
     
     
    // remove trailing ","
    $values1 = rtrim($values1, ',');
    $req1 = $base->prepare('INSERT INTO infosfacture (num, client, datefacture, facturede, conditions) VALUES '. $values1);
     
     
     
     
    //$sql= $base->prepare('SELECT id FROM infosfacture WHERE id='.$fk)
     
     
    $values2 .= '(:designation' . $key . ', :quantite' . $key . ', :prixht' . $key . ', LAST_INSERT_ID()),';
     
     
    $values2 = rtrim($values2, ',');
    $req2 = $base->prepare('INSERT INTO facturation (designation, quantite, prixht, fk_facturation_id) VALUES '. $values2);
     
     
    BEGIN;
    $req1->execute($params);
    $req2->execute($params);
    COMMIT;
     
     
    $base = null;
    ?>
    Voici mon formulaire :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <!DOCTYPE html><html lang="en">
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width"/>
        <title>Créer une facture</title>
        <link rel="stylesheet" href="style.css" media="all" />
        <link rel="icon" type="image/png" href="favicon.png" />
      </head>
      <body>
        <br/><br/>
        <main>
    <?php require_once('includes/menu.php') ?>
    <br/><br/><br/>
    <form action="afficheFacture2.php" method="post">
     
     
      <fieldset>
        <legend>Infos de base</legend>
        <label>Numéro de la facture *</label><br/>
        <input type="text" placeholder="Numéro de la facture" name="num" required><br/><br/>
        <label>Date de la facture *</label>
        <input type="text" placeholder="15/03/2018" name="datefacture" required><br/><br/>
     
     
        <label>Infos de votre entreprise *</label><br/>
        <textarea id="facturede" name="facturede" rows="4" cols="45"
          placeholder="Votre entreprise: Raison sociale, adresse.." required></textarea><br/><br/>
     
     
        <label>Infos de votre client *</label><br/>
        <textarea name="client" rows="4" cols="45"
            placeholder="Facturé à: Raison sociale, adresse.." required>
        </textarea>
        <br/><br/>
        <label>Conditions et moyens de paiement *</label><br/>
        <textarea name="conditions" rows="10" cols="45"
            placeholder="Conditions et paiements" required></textarea>
      </fieldset><br/>
     
     
                <fieldset>
                <legend>Contenu de la facture *</legend>
                <div id="ID_container">
                <textarea name="designation[]" rows="4"
                  placeholder="Designation" required></textarea>
                <input type="number" placeholder="Quantité" name="quantite[]" required>
                <input type="number" placeholder="Prix HT" name="prixht[]" required>
                </div>
                <button type="button" onclick="ajout(this);">+ Ajouter une designation</button>
                <!-- <input type="number" placeholder="Taxe" name="taxe"><br/><br/> -->
                <!-- <input type="number" placeholder="Total du montant HT" name="montantHT"><br/><br/> -->
                </fieldset>
    <br/>
        <input type="submit" value ="Créer une facture" />
          </form>
          <br/>
        </main>
          <?php require_once('includes/footer.php') ?>
     
     
    <script src="js/fonctions.js"></script>
      </body>
    </html>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est le code de création de la créature de Frankenstein

    Il faut que tu fasses une requête préparée pour chacune des requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req1 = $base->prepare('INSERT INTO infosfacture (num, client, datefacture, facturede, conditions)
    VALUES (:num, :client, :datefacture, :facturede, :conditions)');
     
    $req2 = $base->prepare('INSERT INTO facturation (designation, quantite, prixht, fk_facturation_id)
    VALUES (:designation, :quantite, :prixht, :facturation_id)');

    Et ensuite tu executes dans des boucles chaque série de valeurs :
    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
     
    $param = array();
    $params[':num']    = $_POST['num'];
    $params[':client']    = $_POST['client'];
    $params[':datefacture'] = $_POST['datefacture'];
    $params[':facturede'] = $_POST['facturede'];
    $params[':conditions'] = $_POST['conditions'];
     
    $req1->execute($params);
    $facturation_id = $base->lastInsertId(); 
     
     
    $params = array();
    $params[':facturation_id'] = $facturation_id;
     
    foreach ($_POST['designation'] as $key => $designation) {
        $params[':designation'] = $designation;
        $params[':quantite']    = $_POST['quantite'][$key];
        $params[':prixht']  = $_POST['prixht'][$key];
     
        $req2->execute($params);    
    }
    et adieu les 71 lignes de code.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    Merci d'avance Sabotage !
    En fait j'obtiens cette erreur que j'exécute ton code :
    Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1364 Field 'id' doesn't have a default value in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php:27 Stack trace: #0 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php(27): PDOStatement->execute(Array) #1 {main} thrown in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php on line 27
    Et la ligne 27 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req1->execute($params);

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    ta colonne "id" est bien auto-incrementée ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    Ok j'ai auto incrémenté le champ id. Mais j'ai rajouté un champ "tva" et j'ai cette erreur qui n'a rien avoir avec le champ ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php:41 Stack trace: #0 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php(41): PDOStatement->execute(Array) #1 {main} thrown in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture2.php on line 41
    Et voici la ligne 41: $req2->execute($params);

    Voici mon code :
    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
    $req1 = $base->prepare('INSERT INTO infosfacture (num, client, datefacture, facturede, conditions, tva)VALUES (:num, :client, :datefacture, :facturede, :conditions, :tva)');
     
     
    $req2 = $base->prepare('INSERT INTO facturation (designation, quantite, prixht, fk_facturation_id)
    VALUES (:designation, :quantite, :prixht, :fk_facturation_id)');
     
     
     
     
    $param = array();
    $params[':num']    = $_POST['num'];
    $params[':client']    = $_POST['client'];
    $params[':datefacture'] = $_POST['datefacture'];
    $params[':facturede'] = $_POST['facturede'];
    $params[':conditions'] = $_POST['conditions'];
    $params[':tva'] = $_POST['tva'];
     
     
    $req1->execute($params);
    $fk_facturation_id = $base->lastInsertId();
     
     
     
     
    $params = array();
    $params[':$fk_facturation_id'] = $fk_facturation_id;
     
     
    foreach ($_POST['designation'] as $key => $designation) {
        $params[':designation'] = $designation;
        $params[':quantite']    = $_POST['quantite'][$key];
        $params[':prixht']  = $_POST['prixht'][$key];
     
     
        $req2->execute($params);
    }

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $params[':$fk_facturation_id'] = $fk_facturation_id;
    A+.

  7. #7
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Bonjour



    A+.
    Que voulez-vous dire ? Je ne vous comprends pas !

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Il ne devrait pas y avoir le $ que j'ai coloré en rouge.

    A+.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Fais un effort pour comprendre les messages d'erreur (et les réponses données), afin d'être capable de corriger toi-même,
    au lieu de poster un message sans réfléchir, et d'attendre que ce soient les autres qui te corrigent...

    Sinon, tu ne progresseras pas.


    N.B. comprends-tu au moins le code de sabotage, ou t'es-tu contentée de le copier-coller ?

  10. #10
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    Je comprend le code de Sabotage.

    Depuis là je cherche à comprendre cette erreur et je ne vois comment faire, j'ai essayé de mettre un try catch à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($req2 as $presta):
    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php    try {
        foreach ($req2 as $presta): ?>
        <tr>
            <td class="desc"><?= $presta['designation'] ?></td>
            <td class="qty"><?= $presta['quantite'] ?></td>
            <td class="unit"><?= $presta['prixht'] ?></td>
            <td class="total"><?= $presta['prixht'] * $presta['quantite'] ?></td>
          </tr>
        <?php endforeach;
      }
      catch(PDOException $e) {
      die($e->getMessage());
      }
        ?>
    Mais j'ai cette erreur tout court :
    SQLSTATE[HY000]: General error

  11. #11
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    J'ai déjà donné la solution pour l'ancienne erreur, là tu reviens avec de nouveau code sans nous dire si tu as pu corriger l'ancien. Et il n'y a pas de suite logique sur ton ancien code et ce que tu venais de poster, $req2 était pour une insertion, là tu utilises cette variable comme un tableau.

    A+.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Tu mets un try catch PDO autour d'un code qui ne contient pas de PDO...

    • Mets des noms de variables plus explicites (faciles à comprendre, pour éviter les confusions),
    • écris du commentaire / explications dans ton code,
    • ...

    Bref...

    "Aide-toi, DVP t'aidera..."

  13. #13
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    ça marche ça marche, merci infiniment merci !
    En fait j'ai rajouté un tableau dans lequel je recupère les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $facturation[] = [      'designation' => $designation,
          'quantite'    => $_POST['quantite'][$key],
          'prixht'  => $_POST['prixht'][$key],
        ];
    Ensuite je fait un foreach sur ce tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php foreach ($facturation as $presta): ?>    <tr>
            <td class="desc"><?= $presta['designation'] ?></td>
            <td class="qty"><?= $presta['quantite'] ?></td>
            <td class="unit"><?= $presta['prixht'] ?></td>
            <td class="total"><?= $presta['prixht'] * $presta['quantite'] ?></td>
          </tr>
          <?php $somme += $presta['prixht'] * $presta['quantite']; ?>
        <?php endforeach; ?>
    Merci à tous pour votre aide et votre attention !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 14/05/2015, 10h55
  2. [interbase6]probleme d'insertion dans une table
    Par macadam314 dans le forum Bases de données
    Réponses: 10
    Dernier message: 22/02/2005, 14h21
  3. [Sybase] Temps d'une insertion dans une table
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 14/02/2005, 10h04
  4. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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