Mise à jour des colonnes d'une table

Fermé
nguim - Modifié par nguim le 4/03/2014 à 09:29
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 - 4 mars 2014 à 14:57
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:

<?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:

3 réponses

flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
4 mars 2014 à 13:37
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. :)
0
Merci pour votre aide !
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.
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
4 mars 2014 à 14:08
Parfait, alors tu as juste à exécuter cette requête :

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. :)
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
4 mars 2014 à 14:14
Précision : Je viens de m'apercevoir que ta table coordab ne contient pas que les colonne IMSI et MEID, et je pense que le REPLACE va alors supprimer tout le contenu des autres colonnes.

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.
0
Merci pour ce code fantastisque

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.
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
4 mars 2014 à 14:41
Peux-tu stp indiquer la manière dont tu exécutes la requête sur ta page ?
0
Je m'excuse car l'erreur venait de moi même. Maintenant mon problème se trouve au niveau de :
Comment donc mettre à jour certaines colonnes d'une table à partir d'une autre table ?
Merci d'avance.
0
flokocha Messages postés 1510 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 10 octobre 2015 281
4 mars 2014 à 14:57
En admettant que la table ciblée par le LOAD DATA soit nommée "xxx" :

UPDATE coordab, xxx SET coordab.MEID=xxx.MEID WHERE coordab.IMSI=xxx.IMSI;
0