Insérer 700 tuples avec une boucle while

WRInaute passionné
Bonjour,

Voilà, j'ai 700 enregistrements dans une première table, je veux les passer dans une deuxième table en y ajoutant des informations d'une troisième table, via une clef étrangère entre les tables 1 et 3.

J'ai écrit un petit script et j'ai ajouté un compteur pour voir le nombre de tuples enregistrés.

Le compteur s'arrête à 507. Ca c'est normal, car la clef étrangère est une suite varchar et certains caractères sont encodés dans une des deux tables. Je peux corriger le problème facilement.

Mais ce que je ne comprend pas, c'est ça :
Le compteur du script s'arrête à 507, ce qui signifie donc que 507 instruction INSERT into ont été effectuées, sur les 700 souhaitées.

Mais dans la table censée réceptionner les données, je n'ai que 253 enregistrement. Même des champs dont la clef étrangère ne comporte aucun caractère spécial ne sont pas récupérés et insérés.



Je me dis que c'est parce que la base de donnée ne peut pas traiter autant d'enregistrement en une fois, mais en fait j'en doute :?

D'où vient le problème d'après vous ?



Merci d'avance
 
WRInaute passionné
Un truc me chiffonne quand même : toutes les infos sont en base de données dans 2 tables différentes, et tu passes par une boucle PHP pour créer la troisième table... t'es sûr de ton coup là ? Souvent ce n'est pas nécessaire du tout.
 
WRInaute passionné
Ouaip, j'y ai pensé mais je pense pas que te donnera grand chose, vu qu'il bug pas.
Je pense que le problème vient d'ailleurs.

Est-ce trop, une boucle while d'insert sur 700 tuples (ou 500 et quelques, pour le moins) ?

Code:
<?php

$affiche_titre=
"SELECT 
mot.libelle AS libelleMot,
mot.contenu AS contenuMot,
mot.id AS idMot,
ibf_topics.tid AS tid
FROM 
mot, ibf_topics
WHERE mot.libelle=ibf_topics.title 
 ";
$resultatTitle = mysql_query("$affiche_titre") OR die(mysql_error());
$compteur=1;
while($R = mysql_fetch_array($resultatTitle))
{
$tid=$R['tid'];
$idMot=$R['idMot'];
$libelleMot=$R['libelleMot'];
$contenuMot=$R['contenuMot'];

$insert="INSERT INTO `insertionBD` 
(
`tid`,`libelle`,`mot`,`idMot`
) 
VALUES 
(
'$tid','$libelleMot','$contenuMot','$idMot'
)";
$valid=mysql_query($insert);
$compteur++;
echo "$compteur, "
;}

echo" <p> OK";

?>


**edit**

Je vais refaire un test supplémentaire en affichant dans la boucle les id des tuples censés être insérés, pour ensuite vérifier s'ils le sont effectivement dans la table censée les réceptionner.
 
WRInaute passionné
je fais des while avec + de 500 000 entrées - 500 ou 700 insert c'est nada pour un serveur mysql.

Petit detail : Pourquoi mets tu le compteur a 1 au depart sachant que tu l'incrementes juste avant de l'afficher ?:wink:

essaye de mettre un if (!$valid) {echo $affiche_titre."\n";} pour voir si certains insert ne passent pas dans le cas ou tu n'afficherais pas les erreurs (ca m'est arrivé :oops: )

Sinon debug au max .... et tiens nous au courant ;)
 
WRInaute passionné
Bool a dit:
Un truc me chiffonne quand même : toutes les infos sont en base de données dans 2 tables différentes, et tu passes par une boucle PHP pour créer la troisième table... t'es sûr de ton coup là ? Souvent ce n'est pas nécessaire du tout.

Oui, justement, je fais un test avant de le faire, mais avec un update...

essaye de mettre un if (!$valid) {echo $affiche_titre."\n";} pour voir si certains insert ne passent pas dans le cas ou tu n'afficherais pas les erreurs (ca m'est arrivé :oops: )
Je vais tester ça, merci.
 
WRInaute passionné
Ca se pourrait sur certaines, en effet, bien vu.

Mais sur certaines n'ont pas de ' et pourtant elles n'y sont pas. J'ai pas encore tester le truc de raljx.
 
WRInaute passionné
Ok ok, alors en effet c'était un problème d'addslashes.

En fait, le non-addshshage ne gênait pas au niveau du titre, mais au niveau du contenu, mais mes modestes neurones avait omis ce champ dans leur raisonnement défaillant.


Là tout est inséré, en force. Du moins il en manque encore 200, mais ce doit être un problème d'encodage d'accent cette fois.

Bien vu pour le test de raljx, ça m'a aidé à trouver le bug.
Bug facile du reste, mais ce sont souvent les plus simples que l'on voit le moins...


Topic qui reste ouvert, m'étonnerait pas qu'un autre problème se présente...

Encore merci pour vos réponses, ceci dit.
 
WRInaute accro
moi je ferais afficher la requête au cas où l'insert ne fonctionne pas. Et je testerais ensuite cette requête avec phpmyadmin, pour voir d'où vient le problème
 
WRInaute passionné
raljx a dit:
je fais des while avec + de 500 000 entrées - 500 ou 700 insert c'est nada pour un serveur mysql.

Heu... Alors ca ca dépend ce que tu insère.

Si c'est de simplement champs texte d'une longueur de 255 caractères ca passe bien, par contre, si il faut que tu insère 5 ou 10 BLOBS / ligne, tes 500 000 inserts vont faire faire la tronche à ton serveur MySQL ! ;)
 
WRInaute passionné
@ BadProcESs --> ci-joint :)
i171445_load.jpg


Un insert de 547 000 enregistrements sur une table contenant 11 tables avec VARCHAR|BIGTEXT|INT(10) hier a minuit ... quelques update cet am et un gros insert ce soir.
 
WRInaute passionné
Boarfff les insert, ce n'est pas ce qui consomme le plus de processus... même loin de là. ça pourrait tourner en boucle jusqu'à plus de mémoire disque lol (bon j'exagère ptet un peu mais si qq1 veut tester... ^^)
 
WRInaute impliqué
raljx a dit:
@ BadProcESs --> ci-joint :)
i171445_load.jpg


Un insert de 547 000 enregistrements sur une table contenant 11 tables avec VARCHAR|BIGTEXT|INT(10) hier a minuit ... quelques update cet am et un gros insert ce soir.

:!:
sur ma dedibox v1 quand je restore le dump de ma database (soir environ 200 000 lignes) ca se passe en moins d'une minute !!!
inutile de dire que le load lissé sur la journée tu vois que dalle :)
 
WRInaute passionné
julienr a dit:
raljx a dit:
@ BadProcESs --> ci-joint :)
i171445_load.jpg


Un insert de 547 000 enregistrements sur une table contenant 11 tables avec VARCHAR|BIGTEXT|INT(10) hier a minuit ... quelques update cet am et un gros insert ce soir.

:!:
sur ma dedibox v1 quand je restore le dump de ma database (soir environ 200 000 lignes) ca se passe en moins d'une minute !!!
inutile de dire que le load lissé sur la journée tu vois que dalle :)

Oui mais seulement dans le cas d'un dump :wink:
 
WRInaute impliqué
il me semble que le script d'export de base, optimise juste en groupant les insert par paquet et que c'est drôlement efficace et donc rien n'empêche de faire pareil dans ses propres script...
 
Discussions similaires
Haut