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 :

Problème d'exécution de requête


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Problème d'exécution de requête
    Bonjour à tous,

    Il m'est demandé de mettre à jour une base de données SQL à partir de données contenues dans un fichier texte, les données correspondant à chaque enregistrement se trouvant sur une même ligne et séparées par des splits "|".

    J'ai donc élaboré le code suivant pour remplir chaque table :

    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
     
    /* Relecture du fichier */
    $array_file = file('C:\Program Files\wamp\www\demo_test\donnees\patients.txt');
     
    for ($i = 1; $i <= sizeof($array_file); $i++) {
    $array_insert [6] ;
    $cpt = 0 ;
     
    for ($j = 1; $j <= 6; $j++){
    $ptr = strpos(substr($array_file[$i],$cpt),"|");
    $array_insert[$j] = str_replace("'"," ",substr($array_file[$i],$cpt,$ptr));
    $cpt = $cpt + $ptr + 1 ;
    }
     
    // connection à la base
    include ('connection.php');
     
    /* !!!! INSERTION DANS LA BASE !!!! */
    $sql_d="INSERT INTO patient (SIGLE,CENTRE,PATIENT,PHASE,INITIALES,DATE_INC)";
    $sql_d.="VALUE ('$array_insert[1]','$array_insert[2]','$array_insert[3]',";
    $sql_d.="'$array_insert[4]','$array_insert[5]','$array_insert[6]') ;";
    $req_d = mysql_query($sql_d) or die('Erreur SQL !<br>'.$sql_d.'</br>'.mysql_error());
     
    // déconnexion de la base MySQL
    mysql_close();
    }
    A priori, tout marche bien (les premières lignes sont insérées nikel), mais le soucis, c'est que le nombre l'enregistrement a insérer à chaque fois est très grand. Aussi, je me retrouve avec le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Maximum execution time of 30 seconds exceeded in C:\Program Files\wamp\www\demo_test\base_update_patient.php on line 31
    Vu que les requêtes effectuées à chaque tour de boucle ne sont pas très compliquées, il me semblait bizzard que leur temps d'exécution puissent dépasser le timeout d'exécution. J'ai également essayé de voir si cela ne venait pas du fichier source, mais ce n'est pas le cas.

    Voilà. Toute aide est la bienvenue !

    D'avance merci.

    Jeannot

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    tu peux déjà tenter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $rows = sizeof($array_file);
    for ($i = 1; $i <= $rows; $i++) {
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 1; $i <= sizeof($array_file); $i++) {
    car là il doit recalculer la taille du tableau à chaque fois.

    Ensuite si ton fichier est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    eaeaz|zerez|rtertert
    vcbc|trr|trrttrer
    tu te compliques un peu la vie avec des substr(), tu as juste à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($array_file as $row) {
    $array_insert = explode("|", $row);
    // et ici la requête
    }
    sans aucun for()

    [edit] En fait tu peux même faire plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($array_file as $row) {
    $sql_d="INSERT INTO patient (SIGLE,CENTRE,PATIENT,PHASE,INITIALES,DATE_INC)";
    $sql_d.="VALUES ('".str_replace("|", "', '", $row)."') ;";
    }
    ou un truc du style.
    [/edit]

    Bye

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Si tu utilises mysql, tu peux le faire directement en sql avec 'load data infile ...'. C'est le plus rapide.
    La syntaxe complète ici

  4. #4
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut max_execution_time
    Tu peux aussi modifier max_execution_time dans le fichier php.ini qui par défaut est à 30. Tu mets une grande valeur du style 600 (10 minutes). Une fois que tu as fini l'update, tu la remets à 30 ou autre valeur. C'est vous qui voyez!!! (Chevalier & Laspales)

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    En complément à propos de 'load data infile' et à titre d'exemple :

    Chargement d'un fichier csv de 60 000 lignes de 5 colonnes :
    • col 1 => int
    • col 2 => int
    • col 3 => char(2)
    • col 4 => char(3)
    • col 5 => varcha(50)


    durée de chargement d'une table vide : entre 4 secondes et 4 secondes 09

    Test effectué sur un PIII 500mz

  6. #6
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut alors je comprends pas...
    Je comprends pas pourquoi tu as ce fatal error s'il ne faut que 4 secondes pour effectuer la manipulation.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Merci !!!!!!
    Bonjour à tous,

    Avant tout, merci à tous pour vos réponses.

    Ai commencé par tester la version de code de Djakisback. Mais, s'il m'était effectivement possible d'insérer plus de données, au final je me faisais toujours jeter avec la même erreur. Du coup, je me suis tourné vers la proposition d'utiliser le 'load data infile', en faisant travaillant directement depuis SQL... Et ça marche du tonnerre !

    Merci encore pour avoir répondu si rapidement !

    A peluche

    Juanito

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

Discussions similaires

  1. problème d'exécution de requêtes sous oracle 9i
    Par loukili81 dans le forum Oracle
    Réponses: 3
    Dernier message: 12/07/2007, 11h24
  2. Réponses: 2
    Dernier message: 24/04/2007, 00h18
  3. [MySQL] Problème d'exécution de requête
    Par hedgehog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/02/2007, 15h29
  4. problème d'exécution de requête sous VBA?
    Par jessy212 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/08/2006, 18h48
  5. [STRUTS/HIBERNATE] Problème d'exécution de requête
    Par mc_chicken dans le forum Hibernate
    Réponses: 5
    Dernier message: 21/10/2005, 09h27

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