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 :

UPDATE depuis un fichier php


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut UPDATE depuis un fichier php
    Bonjour,

    A partir d'un fichier csv je souhaite mettre à jour le champ d'une de mes tables.
    Je récupère bien les infos souhaités dans mon csv.
    D'après les sorties d'ecrans, tout se passe bien au niveau de ma requête mais il y a aucune modification effectuée dans ma base de données.

    Quand je copie-colle directement la requête générée depuis mon fichier dans ma base de données les modifications se font bien.

    Voici ma requête en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ps_attribute_lang al, ps_product_attribute pa, ps_product_attribute_combination pac 
    SET al.redoute='0WRXDL62' WHERE al.name='50 ' 
    and pa.id_product='2' and pa.id_product_attribute=pac.id_product_attribute and pac.id_attribute=al.id_attribute
    Le problème pourrait venir de la jointure des tables dans le Where?
    Je n'ai vraiment aucune idée.

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Ci dessous mon php

    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
     
    <?php
    //Le chemin d'acces a ton fichier sur le serveur
    $fichier = fopen("test2.csv", "r");
     
    //tant qu'on est pas a la fin du fichier :
    while (!feof($fichier))
    {
    // On recupere toute la ligne
    $uneLigne = fgets($fichier, 1024);
    //On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    $tableauValeurs = explode(';', $uneLigne);
     
    if(is_array($tableauValeurs) && isset($tableauValeurs[2])) {
    $sql = "UPDATE ps_attribute_lang al, ps_product_attribute pa, 
    ps_product_attribute_combination   pac 
    SET al.redoute='".$tableauValeurs[2]."' 
    WHERE al.name='".$tableauValeurs[5]."' 
    and pa.id_product='".$tableauValeurs[3]."' 
    and pa.id_product_attribute=pac.id_product_attribute 
    and pac.id_attribute=al.id_attribute";
     
    echo $sql."<br />";
     
    $req=mysql_query($sql)or die (mysql_error());
     
     
    // la ligne est finie donc on passe a la ligne suivante (boucle)
    	}
    }
    //vérification et envoi d'une réponse à l'utilisateur
    if ($req)
    {
     
    echo"Ajout dans la base de données effectué avec succès <br />";
    echo mysql_errno($liendb) . ": " . mysql_error($liendb) . "<br />";
    echo "Nombre de Lignes Affectées: " .mysql_affected_rows()."<br />";
    }
    else
    {
    echo"Echec dans l'ajout dans la base de données <br />";
    }
     
    echo "traitement terminé";
     
    ?>
    Merci d'avance

  3. #3
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    un truc simple remplace ton update par un "select count(*)" avec le même where et regarde combien de lignes sont concernées

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Salut Ericd69,

    J'ai 3 lignes concernées quand je fais la requête dans mysql mais que je l'appelle depuis mon script

    Il me sort -1


    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
     
    if(is_array($tableauValeurs) && isset($tableauValeurs[2])) {
     
    $sql = "SELECT COUNT(*) FROM ps_attribute_lang al, ps_product_attribute pa, ps_product_attribute_combination pac WHERE pa.id_product_attribute=pac.id_product_attribute 
    and pac.id_attribute=al.id_attribute 
    and al.name='".$tableauValeurs[5]."' 
    and pa.id_product='".$tableauValeurs[3]."'";
     
    echo $sql."<br />";
    echo "Nombre de Lignes Affectées: " .mysql_affected_rows()."<br />";
    $req=mysql_query($sql)or die (mysql_error());
     
     
     
    	}
    Y'a bien un problème depuis mon script que je n'arrive pas à comprendre.

  5. #5
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    déjà pour lire un csv c'est fgetcsv
    qui te sort le tableau correspondant à une ligne de ton csv...

    ça va simplifier ton code... essaye déjà avec ça sans faire la requête

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Ericd69, j'ai jugé inutile de passer par fgetcsv parce que je récupère parfaitement les données souhaitées.

    Le soucis que j'avais c'est que j'avais un blanc après mes valeurs. J'ai corrigé ce problème.

    Un problème en amenant un autre maintenant mon update ne se fait pas dans son intégralité pourtant les requêtes executées sont correctes et fonctionne en direct dans Phpmyadmin.

    En isolant les requêtes posant problème et en les mettant dans un nouveau csv ça fonctionne mais dès 40 lignes dans mon csv l'update ne se fait plus dans son intégralité.

    Ci-joint mon fichier csv d'origine.

    Merci d'avance pour votre compréhension

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Ericd69, j'ai jugé inutile de passer par fgetcsv parce que je récupère parfaitement les données souhaitées.
    fgetcsv = fgets + explode, la portabilité en plus.

    Et sinon, t'as pensé à changer le reporting d'erreur et à regarder les messages de warning de MySQL ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message

    Et sinon, t'as pensé à changer le reporting d'erreur et à regarder les messages de warning de MySQL ?
    J'ai juste le mysql_error() qui ne m'indique aucune erreur.
    Que me proposes tu d'autres?

  9. #9
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    1. Utilise mysql_info pour savoir s'il y a eu des warnings
    2. mets la directive error_reporting à -1
    3. mets la directive display_errors à 1
    4. mysql_query(...) or die(...) en dev si tu veux mais jamais en production
    5. vérifie systématiquement l'exécution de tes requêtes
    6. trouve des noms un peu plus parlants que tableauValeur, sinon tu va galérer quand tu vas devoir te relire

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    1. Utilise mysql_info pour savoir s'il y a eu des warnings
    2. mets la directive error_reporting à -1
    3. mets la directive display_errors à 1
    4. mysql_query(...) or die(...) en dev si tu veux mais jamais en production
    5. vérifie systématiquement l'exécution de tes requêtes
    6. trouve des noms un peu plus parlants que tableauValeur, sinon tu va galérer quand tu vas devoir te relire
    Bonjour Benjamin,

    Toutes mes excuses pour le retard mais je travaillais sur autre chose.
    Merci pour tes conseils pour tracker mes requêtes SQL.
    Malheureusement, le problème reste le même.
    Je n'ai aucun warning et certains Update sont validées par mon php mais je ne retrouve pas les données dans la table.

    J'en perds la tête.

  11. #11
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    tu es face à un problème assez commun, les updates sur jointure c'est toujours risqué...

    comment un select count(*) peut te sortir -1?

    écrit déja une jointure normalisée avec la syntaxe de maintenant, pas celle antérieure à 1992:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "SELECT COUNT(*)
    FROM ps_attribute_lang al
    inner join ps_product_attribute_combination pac
    	on pac.id_attribute=al.id_attribute
    inner join ps_product_attribute pa
    	on pa.id_product_attribute=pac.id_product_attribute and  pa.id_product='{$tableauValeurs[3]}'
    WHERE al.name='{$tableauValeurs[5]}'"
    voilà en respectant que la table principal est celle qui subira l'update...

    ce qui devrait de donner en version update:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "update ps_attribute_lang al
    inner join ps_product_attribute_combination pac
    	on pac.id_attribute=al.id_attribute
    inner join ps_product_attribute pa
    	on pa.id_product_attribute=pac.id_product_attribute and  pa.id_product='{$tableauValeurs[3]}'
    SET al.redoute='{$tableauValeurs[2]}'
    WHERE al.name='{$tableauValeurs[5]}'"

    utiliser {} dans "" te permet de passer des tableaux directement sans concaténation... mieux non?

    teste ça

    si le résultat est pas bon c'est que tu fait pas les bonne conditions de jointure

    rappel: inner join implique que tu aies une correspondance dans la table à droite ET à gauche...

    tu serais pas en innodb sans commit de fait par hasard, vu que certains sont pris et pas d'autres...?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Bonjour Eric,

    J'ai testé ton select Count(*) dans phpMyAdmin avec tes jointures normalisées et y'a pas de problème.
    J'ai le bon résultat.

    Par contre j'ai un soucis avec mon update phpMyAdmin me retourne une erreur que voici

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'inner join ps_product_attribute_combination pac on pac.id_attribute=al.id_attrib' at line 1
    Voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UPDATE ps_attribute_lang al SET al.cdiscount='MP00010483-0001', al.ean_cdiscount='3606505375253' 
    inner join ps_product_attribute_combination pac 
             on pac.id_attribute=al.id_attribute 
    inner join ps_product_attribute pa 
             on pa.id_product_attribute=pac.id_product_attribute and pa.id_product='29' 
    WHERE al.name='50'
    Ma base de données est en myisam

  13. #13
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    autan pour moi

    il faut que tu mettes les jointure avant le set...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ps_attribute_lang al 
    inner join ps_product_attribute_combination pac 
             on pac.id_attribute=al.id_attribute 
    inner join ps_product_attribute pa 
             on pa.id_product_attribute=pac.id_product_attribute and pa.id_product='29'
    SET al.cdiscount='MP00010483-0001', al.ean_cdiscount='3606505375253'
    WHERE al.name='50'

Discussions similaires

  1. recuperer des informations depuis un fichier php
    Par doud180878 dans le forum jQuery
    Réponses: 2
    Dernier message: 21/07/2011, 15h28
  2. Réponses: 0
    Dernier message: 07/02/2008, 11h26
  3. Exécuter un fichier PHP depuis un .bat
    Par zalalus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 26/11/2007, 13h44
  4. Ouvrir un fichier.txt avec Notepad depuis un script PHP
    Par legastu dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/07/2007, 11h40
  5. généré un fichier excel depuis un formulaire php
    Par wadoux dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 08/03/2007, 17h12

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