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 :

Remplir automatiquement un tableau


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 115
    Par défaut Remplir automatiquement un tableau
    Bonjour,

    J'ai, pour une boutique en ligne sur prestashop, un tableau de prix en fonction du poids et du département.

    Les départements sont regroupés en 4 zones et comme j'ai 40 tranches de poids, j'ai donc 160 cas différents.

    Le problème c'est qu'il faut remplir manuellement les 160 cas par environ 100 départements, soit 16000 enregistrements



    Je cherche à créer un script php pour remplir automatiquement le reste du tableau après avoir renseigné les 160 cas de départ.

    Le programme parcours la base de données, si il rencontre un prix différent de zéro, il va attribuer ce prix à tous les enregistrements pour lesquelles id_carrier et id_range_weight sont identiques à l'enregistrement de base.

    Voila mon script qui ne fonctionne 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
     
    <?php
    // connexion a la base de données
    try{
    	$bdd = new PDO('mysql:host=#####;dbname=#####', '#####', '#####');
    }
    	catch (Exception $e){
    	die('Erreur : ' . $e->getMessage());
    }
     
    $reponse = $bdd->query('SELECT  * FROM ps_delivery ');
     
    while ($donnees = $reponse->fetch())
    {
    	if ($donnees['price']!=0){
    		ajout($donnees['id_carrier'],$donnees['id_range_weight'],$donnees['price']);
    	}
    }
     
    function ajout($carrier, $poids, $prix){
    	$reponse2 = $bdd->query('SELECT  * FROM ps_delivery ');
    	while ($donnees2 = $reponse2->fetch())
    	{
    		echo 'carrier : '.$carrier;
    		$bdd->exec('UPDATE ps_delivery SET price ='.$prix.' WHERE id_carrier ='.$carrier.'AND id_range_weight ='. $poids);
    	}
    }
    $reponse->closeCursor();
    $reponse2->closeCursor();
    ?>
    Pouvez-vous m'aider à résoudre ce problème ?

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Il y a quelques erreurs de logique, lorsque tu veux, dans une fonction, faire référence à une variable déclarée globalement, tu dois utiliser le préfixe global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function ajout(...){
        global $bdd;
    }
    $reponse2 n'existe pas en dehors du scope de la fonction ajout().
    La fonction ajout() ne sert à rien.
    Tu peux séléctionner uniquement les enregistrements qui ont un prix différent de 0 :

    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
     
    try{
    	$bdd = new PDO('mysql:host=#####;dbname=#####', '#####', '#####');
    }
    	catch (Exception $e){
    	die('Erreur : ' . $e->getMessage());
    }
     
    $reponse = $bdd->query('SELECT  * FROM ps_delivery WHERE price <> 0');
     
    while ($donnees = $reponse->fetch())
    {	
        $bdd->exec('UPDATE ps_delivery SET price = '.$donnees['price'].' WHERE id_carrier ='.$donnees['id_carrier'].'AND id_range_weight ='. $donnees['id_range_weight']);
    }
     
    $reponse->closeCursor();
    Aussi, si plusieurs enregistrements ont un prix différent de 0 et le même id_carrier et id_range_weight, quel valeur de prix vas-tu insérer ? Actuellement ca va prendre la dernière.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 115
    Par défaut
    Merci pour ta réponse thomasR,

    En fait, j'ai pas été clair,

    Sur la bdd qui contient 16000 enr. je rentre manuellement 160 prix.
    Ensuite la procédure php doit remplir le reste automatiquement.

    je veux faire fonctionner 2 boucles.
    la boucle 1 parcours la base de données, quand le "curseur" trouve un prix <> 0, une autre boucle parcours la bdd est attribue le prix trouvé à tous les enregistrement qui ont le même id_carrier et id_range_weight.
    Ensuite la boucle 1 reprend jusqu'au prochain enregistrement dont le prix est <> 0 ....

    Voila pourquoi j'ai fait une fonction ajout() qui doit contenir la boucle 2.

    J'ai tenté de mettre "global" devant les déclarations de variable mais rien n'y fait...

    +

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,
    la boucle 1 parcours la base de données, quand le "curseur" trouve un prix <> 0, une autre boucle parcours la bdd est attribue le prix trouvé à tous les enregistrement qui ont le même id_carrier et id_range_weight.
    Comme je l'ai écrit plus haut, tu peux directement récupérer les enregistrements dont le prix est différent de 0 avec une seule requête puis mettre à jour l'ensemble des enregistrements avec une seule requête également, exactement comme je l'ai fait ci-dessus.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 115
    Par défaut
    Merci pour ces précisions,

    Je comprends que la boucle 2 n'est pas nécessaire car UPDATE va parcourir toute la bdd.

    Le code que tu as mis plus haut est donc le bon, malheureusement ca ne fonctionne pas...

    j'ai testé directement sur phpMyAdmin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE ps_delivery SET price =9.999 WHERE id_carrier = 3 AND id_range_weight = 10
    ca marche...
    J'ai repris ton code, remplacé l'UPDATE par un affichage des données, ca marche....

    je ne vois vraiment pas pourquoi ca ne fonctionne pas si tout est bon...

Discussions similaires

  1. [XL-2010] Remplir automatiquement un tableau
    Par lucazzo dans le forum Excel
    Réponses: 2
    Dernier message: 21/10/2014, 19h03
  2. Réponses: 8
    Dernier message: 25/03/2013, 18h27
  3. [MySQL] Remplir automatiquement un tableau
    Par pitou31 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/05/2010, 13h44
  4. Réponses: 14
    Dernier message: 17/10/2005, 09h41
  5. [Info]Exportation automatique de tableau en *.pdf ou *.doc
    Par demifred dans le forum Documents
    Réponses: 3
    Dernier message: 12/08/2005, 08h06

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