Mise à jour des colonnes d'une table
nguim
-
flokocha Messages postés 1519 Statut Membre -
flokocha Messages postés 1519 Statut Membre -
Bonjour à tous !
Je suis nouveau en PHP.
J'ai écrit un petit code pour mettre à jour certaines colonnes d'une table de ma BD. Mes données sont stockées dans un fichier texte qui a 9999 lignes. Mais le temps d'exécution mon script est très élevé (plus de 20 minutes). Je voudrais que quelqu'un m'aide à optimiser ce code ou me donne des astuces pour réduire le temps d'exécution de ce code.
voici mon script:
Je suis bloqué.
S'il vous plait aidez moi.
Merci d'avance.
Je suis nouveau en PHP.
J'ai écrit un petit code pour mettre à jour certaines colonnes d'une table de ma BD. Mes données sont stockées dans un fichier texte qui a 9999 lignes. Mais le temps d'exécution mon script est très élevé (plus de 20 minutes). Je voudrais que quelqu'un m'aide à optimiser ce code ou me donne des astuces pour réduire le temps d'exécution de ce code.
voici mon script:
<?php
set_time_limit(0);
error_reporting(E_ALL ^ E_NOTICE);
$db = mysqli_connect('localhost','root','', 'gestnum');
//On ouvre le fichier en question (en lecture seule)
$handle = fopen("fichab.txt", "r");
// on prepare la requete
$req = 'UPDATE coordab SET MEID=? WHERE IMSI =? ';
$stmt = mysqli_prepare($db, $req);
$stmt = mysqli_prepare($db, $req);
$meid = '';
$imsi = '';
mysqli_stmt_bind_param($stmt, "ss", $meid,$imsi);
//on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
while (($data = fgetcsv($handle, 0, " ")))
{
// renseignements des valeurs
$meid = $data[1];
$imsi = $data[0];
// execution
mysqli_stmt_execute($stmt);
}
//on ferme le fichier
fclose($handle);
// on ferme la requete et la connextion
mysqli_stmt_close($stmt);
mysqli_close($db);
?>
Je suis bloqué.
S'il vous plait aidez moi.
Merci d'avance.
A voir également:
- Mise à jour des colonnes d'une table
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise a jour windows 10 - Accueil - Mise à jour
- Table des matières word - Guide
- Table ascii - Guide
- Mise a jour chromecast - Accueil - Guide TV et vidéo
3 réponses
Salut,
Difficile de t'aider précisément sans connaitre la structure de la table cible et le contenu du fichier source, mais je t'invite à te renseigner sur la commande LOAD DATA INFILE qui te permettra éventuellement de loader en base toutes les données de ton fichier en une seule requête : http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
Tu réduirais normalement le temps d'exécution de ton script à une poignée de secondes. :)
Difficile de t'aider précisément sans connaitre la structure de la table cible et le contenu du fichier source, mais je t'invite à te renseigner sur la commande LOAD DATA INFILE qui te permettra éventuellement de loader en base toutes les données de ton fichier en une seule requête : http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
Tu réduirais normalement le temps d'exécution de ton script à une poignée de secondes. :)
Merci pour ce code fantastisque
Mais l m'affiche une petite erreur:
Maintenant je veux faire comme vous avez dit, mais déjà je ne connais pas encore comment on met une table à jour à partir d'une autre et surtout si c'est plus rapide qu'à partir d'un fichier texte.
S'il vous plait aidez moi encore.
Mais l m'affiche une petite erreur:
Parse error: syntax error, unexpected 'DATA' (T_STRING) in C:\wamp\www\etudephp\mysqlicorexc.php on line 7
Maintenant je veux faire comme vous avez dit, mais déjà je ne connais pas encore comment on met une table à jour à partir d'une autre et surtout si c'est plus rapide qu'à partir d'un fichier texte.
S'il vous plait aidez moi encore.
Voici la structure de ma table coordab:
-- phpMyAdmin SQL Dump -- version 4.0.4 -- http://www.phpmyadmin.net -- -- Client: localhost -- Généré le: Mar 04 Mars 2014 à 10:00 -- Version du serveur: 5.6.12-log -- Version de PHP: 5.4.12 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- Base de données: 'gestnum' -- CREATE DATABASE IF NOT EXISTS 'gestnum' DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE 'gestnum'; -- -------------------------------------------------------- -- -- Structure de la table 'coordab' -- CREATE TABLE IF NOT EXISTS 'coordab' ( 'ida' int(10) NOT NULL AUTO_INCREMENT, 'IMSI' char(15) NOT NULL, 'MEID' char(14) NOT NULL, 'ESN1' char(8) NOT NULL, 'PUK1' char(8) NOT NULL, 'AKY' char(16) NOT NULL, 'MDN' char(10) NOT NULL, PRIMARY KEY ('ida'), KEY 'ida' ('ida') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;Voici un extrait du contenu de mon fichier texte:
( ----------IMSI-------------------MEID-------)
624030743830000 WW00001D7DWW6D
624030743830001 WW00001D7DWW6E
624030743830002 WW00001D7DWW6F
624030743830003 WW00001D7DWW70
624030743830004 WW00001D7DWW71
624030743830005 WW00001D7DWW72
6240307438300h6 WW00001D7DWW73
A quel niveau de mon code dois je insérer cette commande.
S'il vous plait aidez moi.
Merci d'avance.
LOAD DATA LOCAL INFILE 'fichab.txt' REPLACE INTO coordab FIELDS TERMINATED BY ' ' IGNORE 1 LINES (IMSI, MEID);
Je pars du principe que le séparateur dans ton fichier txt est un simple espace, mais si c'est par exemple une tabulation, il faudra mettre à jour le contenu de FIELDS TERMINATED BY en conséquence.
Et tu n'as donc plus aucune boucle à faire. Tu ouvres ta connexion, tu exécutes cette requête, tu fermes ta connexion, et basta. :)
Il faut donc réaliser la même opération, mais en ciblant une table qui ne contiendra que les IMSI et MEID, puis faire un update de la table coordab à partir de cette nouvelle table.