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

Langage PHP Discussion :

mise à jour d'une table.


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 89
    Points
    89
    Par défaut mise à jour d'une table.
    Bonjour,

    Le script ci-dessous qui me pose problème me sert à mettre une table à jour.
    J'ai donc la table stages et la table stages_temp.

    Avec le script ci-dessous, je compte le nombre de stage présent dans stages_temp mais pas dans stages et ensuite je les récupère pour les ajouter à stages.

    Voici mon code
    Code php : 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
    47
    48
    49
    50
    51
    52
    53
    54
     
    // Je compte le nombre de stagiaire à ajouter.
    $sql = "SELECT COUNT(st.id)
    	FROM stages_temp st 
    	LEFT JOIN stages s ON s.id = st.id
    	WHERE s.id IS NULL";
    $req_combien = mysql_query($sql);
    $nb_ajouter = mysql_fetch_row($req_combien);
    $nb_ajouter = $nb_ajouter[0];
    unset($req_combien);
     
     
    // Je les ajoutes.
    $enreg=0;
    while($enreg<$nb_ajouter){
     
    		$sql = "SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site
    			FROM stages_temp st 
    			LEFT JOIN stages s ON s.id = st.id
    			WHERE s.id IS NULL
    			LIMIT $enreg, 500";
    		$req = mysql_query($sql) or die(mysql_error());
     
    		while ($stagiaire = mysql_fetch_array($req))
    		{
    			$sql = "INSERT IGNORE INTO stages(
    					id,
    					numero_client,
    					statut,
    					nom,
                                            prenom,										 
    					date_enregistrement,
    					date_inscription,
    					date_stage,
    					postal_stage,											 
    					lieux_stage,
    					site) VALUES(
    					'" . mysql_real_escape_string($stagiaire['id']) . "',
    					'" . mysql_real_escape_string($stagiaire['numero_client']) . "',
    					'" . mysql_real_escape_string($stagiaire['statut']) . "',
    					'" . mysql_real_escape_string($stagiaire['nom']) . "',
    					'" . mysql_real_escape_string($stagiaire['prenom']) . "',
    					'" . mysql_real_escape_string($stagiaire['date_enregistrement']) . "',
    					'" . mysql_real_escape_string($stagiaire['date_inscription']) . "',
    					'" . mysql_real_escape_string($stagiaire['date_stage']) . "',											 
    					'" . mysql_real_escape_string($stagiaire['postal_stage']) . "',
    					'" . mysql_real_escape_string($stagiaire['lieux_stage']) . "',
    					'" . mysql_real_escape_string($stagiaire['site']) . "')";
     
    			mysql_query($sql) or die(mysql_error());
    		}
     
    	$enreg = $enreg + mysql_num_rows($req);
    }

    Les 10 premiéres lignes me serve à savoir combien j'ai de stagiaires à ajouter, ce qui donne 13422.

    Ensuite je fais une boucle pour les ajouter par paquet de 500.

    Mon problème est le suivant:
    Avec la limite "$enreg, 500", il s’arrête à 6922 et je ne comprend pas pourquoi.
    J'ai placé des echo pour essayer de comprendre, dont voici le résultat:
    $sql:SELECT COUNT(st.id) FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL
    $nb_ajouter:13422
    On voie ici qu'il y a bien 13422 ligne à ajouter.

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 0, 500
    mysql_num_rows($req): 500
    $enreg: 500

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 500, 500
    mysql_num_rows($req): 500
    $enreg: 1000
    Les premières requêtes dans la boucle se passe bien, il les ajoute 500 par 500.

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 1000, 500
    mysql_num_rows($req): 500
    $enreg: 1500

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 1500, 500
    mysql_num_rows($req): 500
    $enreg: 2000

    ............... requête ok

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 6000, 500
    mysql_num_rows($req): 500
    $enreg: 6500

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 6500, 500
    mysql_num_rows($req): 422
    $enreg: 6922

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 6922, 500
    mysql_num_rows($req): 0
    $enreg: 6922

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 6922, 500
    mysql_num_rows($req): 0
    $enreg: 6922

    $sql:SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site FROM stages_temp st LEFT JOIN stages s ON s.id = st.id WHERE s.id IS NULL LIMIT 6922, 500
    mysql_num_rows($req): 0
    $enreg: 6922
    ............
    ... et ainsi de suite, il tourne en boucle et n'en fini jamais, puisque la requete ne renvoie plus aucun résultat après 6922 enregistrement.

    Si je ne met pas de limite (donc tous d'un coup), c'est ok il enregistre bien les 13422.

    J'ai essayé avec d'autre limite, pour voir ce que ça donne:
    Avec la limite "$enreg, 100", il s’arrête à 6722.
    Avec la limite "$enreg, 1000", il s’arrête à 7000.

    Quelqu'un saurait-il me dire ce qui ne va pas ?

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 89
    Points
    89
    Par défaut
    Il suffit de rédiger mon problème pour comprendre ma co****ie.
    A chaque boucle il y en a 500 de moins à ne pas être dans stages. donc normal.
    $enreg ne sert à rien, il faut toujours commencer à zéro.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    c'est un problème de logique :
    quand tu fais cette requete dans le while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		$sql = "SELECT st.id, st.numero_client, st.statut, st.nom, st.prenom, st.date_enregistrement, st.date_inscription, st.date_stage, st.postal_stage, st.lieux_stage, st.site
    			FROM stages_temp st 
    			LEFT JOIN stages s ON s.id = st.id
    			WHERE s.id IS NULL
    			LIMIT $enreg, 500";
    		$req = mysql_query($sql) or die(mysql_error());
    Ensuite, la table "stages" est MODIFIEE !
    DONC, le nombre de résultat CHANGE -> il diminue de 500 à chaque tour de boucle.

    en 13 boucles, il passe bien de 13422 à 6922.

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

Discussions similaires

  1. Mise à jour d'une table
    Par smotte76 dans le forum Access
    Réponses: 2
    Dernier message: 31/10/2005, 18h13
  2. Mise à jour d'une table
    Par bath dans le forum Oracle
    Réponses: 5
    Dernier message: 19/10/2005, 12h01
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. Réponses: 5
    Dernier message: 06/01/2005, 12h07
  5. mise à jour d'une table d'interbase sous delphi
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2004, 13h09

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