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

Langage PHP Discussion :

Récupérer une valeur dans un tableau associatif multidimentionnel


Sujet :

Langage PHP

  1. #21
    Membre régulier
    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
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    Il faut surtout reprendre toute la logique depuis le début.

    UNE facture - plusieurs produits

    On doit avoir :
    • une table "factures" (id_facture, numéro, date,...)
    • une table "facture_produits" (id_produit, id_facture, designation, quantité, prix,...)



    Le numéro de facture ou la date n'ont pas à être copiés plusieurs fois !
    Ok j'y ai pensé à séparer les tables mais je le ferai après que l'insertion et l'affichage des données seront fonctionnelles, merci

    Citation Envoyé par Celira Voir le message
    Ce que tu dois déterminer, c'est ce qui est unique et ce qui multiple.
    Tu as une seule facture, avec un numéro, un client, une date.
    Tu as plusieurs désignations, quantités et prix.

    Donc quand tu boucles sur les désignations, il faut utiliser la même valeur de numéro de facture pour tous les tours de boucles, mais une valeur différente de désignation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($_POST['designation'] as $key => $designation) {
        $params[':designation' . $key] = $designation; // multiple, on utilise la valeur de la boucle
        $params[':num' . $key]    = $_POST['num']; // unique : tout est dans la même facture
        $params[':client' . $key]    = $_POST['client']; // unique : tout est pour le même client
        $params[':quantite' . $key]    = $_POST['quantite'][$key]; // multiple, on utilise la valeur de la boucle
        $params[':prixht' . $key]  = $_POST['prixht'][$key]; // multiple, on utilise la valeur de la boucle
        $params[':dateFacture' . $key] = $_POST['dateFacture']; // unique : tout est dans la même facture
        $params[':facturede' . $key] = $_POST['facturede']; // unique : tout est dans la même facture
        $params[':conditions' . $key] = $_POST['conditions']; // unique : tout est dans la même facture
    Ok j'ai fais 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
    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
    //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'];
     
     
        $values .= '(:num , :client, :designation' . $key . ', :quantite' . $key . ', :prixht' . $key . ', :dateFacture, :facturede, :conditions),';
          // prepare facturation data
        $facturation[] = [
          'designation' => $designation,
          'num'  => $_POST['num'],
          'client'  => $_POST['client'],
          'quantite'    => $_POST['quantite'][$key],
          'prixht'  => $_POST['prixht'][$key],
          'datefacture'  => $_POST['datefacture'],
          'facturede'  => $_POST['facturede'],
          'conditions'  => $_POST['conditions']
        ];
    }
     
     
    //var_dump($_POST['num'][$key]);
     
     
    // remove trailing ","
    $values = rtrim($values, ',');
    $req = $base->prepare('INSERT INTO facturation (num, client, designation, quantite, prixht, datefacture, facturede, conditions) VALUES '. $values);
    $req->execute($params);
    $base = null;
    ?>
    Mais j'ai cette erreur :
    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\afficheFacture.php:46Stack trace:#0 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture.php(46): PDOStatement->execute(Array)#1 {main} thrown in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\Facturation_generale\afficheFacture.php on line 46
    En fait ça dit qu'il ne reconnait pas le paramètre $params de la ligne 46 qui est : $req->execute($params);
    Et pourquoi ne reconnait pas $params pourtant c'est bien défini !

    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    Ce que tu fais n'a aucun sens...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <input type="text" placeholder="Numéro de la facture" name="num" required><br/>
    Ici, on ne récupère qu'un et un seul numéro avec $_POST['num'].

    $_POST['num'][$key] n'a donc aucun sens.

    Je doute que tu comprennes toi-même ce que tu fais.

    Fais un var_dump($_POST);. Au moins tu verras ce que tu récupères...
    var_dump($_POST); me donne bien toutes les valeurs que j'ai saisie dans mon formulaire
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  2. #22
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Attention : dans le code que je t'ai montré, seule l'alimentation du paramètre est modifiée, le nom du paramètre reste échangé : $params[':num' . $key] = $_POST['num'];.
    PDO ne permet d'utiliser 2 fois le même paramètre, même si c'est pour la même valeur.

    Donc tu gardes les $key partout dans les noms des paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $values .= '(:num' . $key . ' , :client' . $key . ', :designation' . $key . ', :quantite' . $key . ', :prixht' . $key . ', :dateFacture' . $key . ', :facturede' . $key . ', :conditions' . $key . '),';
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #23
    Membre régulier
    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
    Points : 111
    Points
    111
    Par défaut
    Merci beaucoup à tous, l'insertion marche, voici les écrans:
    Nom : Créer une facture.png
Affichages : 148
Taille : 41,7 Ko

    Nom : 127.0.0.1 8080   127.0.0.1   facturationgenerale   facturation   phpMyAdmin 4.7.0(2).png
Affichages : 121
Taille : 105,8 Ko

    Je vais maintenant séparer la table en 2 et insérer les données. 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
    ---- Structure de la table `facturation`
    --
     
     
    CREATE TABLE `facturation` (
      `id` int(11) NOT NULL,
      `designation` text,
      `quantite` int(11) DEFAULT NULL,
      `prixht` decimal(10,0) DEFAULT NULL,
      `fk_facturation_id` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ---- Structure de la table `infosfacture`
    --
     
     
    CREATE TABLE `infosfacture` (
      `id` int(11) NOT NULL,
      `num` varchar(10) DEFAULT NULL,
      `client` text,
      `datefacture` varchar(10) DEFAULT NULL,
      `facturede` text,
      `conditions` text
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    Merci encore infiniment mais je ne crois pas que je suis totalement de l'auberge ! Je vous tiens au courant
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

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

    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
    19
    CREATE TABLE `factures` (
      `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 `facture_prestations` (
      `id_prestation` int(11) NOT NULL AUTO_INCREMENT,
      `id_facture` int(11) NOT NULL,
      `designation` text,
      `quantite` int(11) DEFAULT NULL,
      `prixht` decimal(10,2) DEFAULT NULL,
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Ca, c'est le minimum.

    Tu devrais aussi te renseigner sur les données OBLIGATOIRES qui doivent figurer sur une facture...
    Dernière modification par rawsrc ; 19/03/2018 à 21h22.

  5. #25
    Membre régulier
    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
    Points : 111
    Points
    111
    Par défaut
    Aidez-moi svp j'ai cherchez mais je ne trouve pas comment insérer les données dans mes 2 tables. Voici ce que j'ai essayé de faire mais ça ne marche pas :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    <?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) VALUES '. $values2);
     
     
    BEGIN;
    $req1->execute($params);
    $req2->execute($params);
    COMMIT;
     
     
    $base = null;
    ?>
     
     
    <!DOCTYPE html>
    <html lang="fr">
      <head>
        <meta charset="utf-8">
        <title>Afficher une Facture</title>
        <link rel="stylesheet" href="style.css" media="all" />
        <link rel="icon" type="image/png" href="favicon.png" />
      </head>
      <body>
        <header class="clearfix">
          <div id="logo">
            <img src="logo.png">
          </div>
          <div id="company">
          <div class="to"><h2>De:</h2> <?php echo $facturede ?></div>
          </div>
        </header>
        <main>
          <div id="details" class="clearfix">
            <div id="client">
              <div class="to"><h2>Facture à:</h2><?php echo $client ?></div>
     
     
            </div>
            <div id="invoice">
              <h1>FACTURE N° <?php echo $num ?></h1>
              <div class="date">Date: <?php echo $datefacture ?></div>
            </div>
          </div>
          <?php
    //       echo '<pre>';
    // print_r($_POST['num'][$key]);
    // echo '</pre>';
           ?>
    <table>
      <thead>
        <tr>
          <th class="desc">DESIGNATION</th>
          <th class="qty">QUANTITÉ</th>
          <th class="unit">PRIX HT</th>
          <th class="total">Total HT</th>
        </tr>
      </thead>
      <tbody>
        <?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 endforeach; ?>
      </tbody>
    </table>
    <div id="notices">
            <div><h2>Conditions et moyens de paiement:</h2></div>
            <div class="notice"> <?php echo $conditions ?> </div>
          </div>
          <?= '<a href="facturesPDF/imprimer.php?num='.$num.'" target="_blank">Imprimer</a>' ?>
        </main>
        <?php require_once('includes/footer.php') ?>
      </body>
    </html>
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

  6. #26
    Invité
    Invité(e)
    Par défaut
    Tu prends les tables à l'envers.
    Et tu te compliques inutilement la vie avec ton array $params et $key... Ca ne sert à rien.

    Le principe :
    1. on INSERT d'abord dans la table `factures` les données ne concernant QUE la facture (num, client,...)
    2. on récupère l'`id_facture` créé avec lastInsertId()
    3. on peut insérer cet `id_facture` dans la table `facture_infos`, pour CHAQUE désignation
    Dernière modification par Invité ; 19/03/2018 à 19h29.

  7. #27
    Membre régulier
    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
    Points : 111
    Points
    111
    Par défaut
    Depuis je cherche mais je ne trouve pas comment faire. Si vous pouvez me donner encore un coup de pouce ça me fera avancer, merci. Je continue aussi à chercher !
    Formatrice - Web développeuse - WebMarketing - Recrutement
    Site O'ClockWeb : http://oclockweb.cvflashjob.com/
    Mon Facebook : https://www.facebook.com/minkoueobame

Discussions similaires

  1. Récupérer une valeur dans un tableau de tableau de JSON
    Par ecnerrolf dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 27/06/2014, 11h03
  2. [HTML] Récupérer une valeur dans un tableau - DIV
    Par frtou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 02/09/2008, 11h12
  3. Récupérer une valeur dans un tableau ?
    Par le polak dans le forum Excel
    Réponses: 1
    Dernier message: 26/05/2008, 19h08
  4. Récupérer une valeur dans un tableau
    Par Jeren dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2008, 11h03
  5. Réponses: 2
    Dernier message: 15/02/2008, 22h45

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