Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 28/08/2011, 19h57   #1
Membre du Club
 
Inscription : février 2008
Messages : 137
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 137
Points : 45
Points : 45
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 :
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:
Citation:
$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.

Citation:
$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.

Citation:
$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.
yann123456 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 20h03   #2
Membre du Club
 
Inscription : février 2008
Messages : 137
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 137
Points : 45
Points : 45
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.
yann123456 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 20h14   #3
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
c'est un problème de logique :
quand tu fais cette requete dans le while :
Code :
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.
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est actuellement 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 14h33.


 
 
 
 
Partenaires

Hébergement Web