Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2006, 18h04   #1
Invité de passage
 
Inscription : novembre 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 13
Points : 4
Points : 4
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 :
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 :
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
Juanito-Toto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 22h13   #2
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Salut,
tu peux déjà tenter

Code :
1
2
$rows = sizeof($array_file);
for ($i = 1; $i <= $rows; $i++) {
au lieu de :

Code :
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 :
1
2
eaeaz|zerez|rtertert
vcbc|trr|trrttrer
tu te compliques un peu la vie avec des substr(), tu as juste à faire :

Code :
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 :
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
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2006, 06h18   #3
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
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
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2006, 07h19   #4
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
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)
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2006, 08h40   #5
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
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
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2006, 08h50   #6
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
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.
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2006, 10h14   #7
Invité de passage
 
Inscription : novembre 2005
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 13
Points : 4
Points : 4
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
Juanito-Toto est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h51.


 
 
 
 
Partenaires

Hébergement Web