insertion en grand nombre

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : insertion en grand nombre

par Sékiltoyai » 08 août 2007, 18:02

Ouais, mais il serait mieux de réfléchir à faire ce que tu veux faire autrement plutôt que de te faire toute la table à chaque fois, car ca va réduire le traffic entre ton serveur web et ton serveur SQL, mais pas la charge du serveur.
Il faut absolument faire ces modifications à l'enregistrement.

par Genova » 08 août 2007, 10:53

Si si ça marche parfaitement, à partir de la version 3.22.5 d'après ce que j'ai lu.

par d0m » 08 août 2007, 10:49

Ensuite, en SQL tu peux réaliser plusieurs insertions en une fois
Il me semble que ça ne marche pas les insertions multiples avec MySQL. J'ai essaié et j'ai été obligé de passer par des boucles.

par Genova » 08 août 2007, 10:16

Onjour,
déjà je trouve ton code absolument illisible, la moindre des choses quand on demande de l'aide est de montrer un code lisible (c'est à dire indenté !).

Ensuite, en SQL tu peux réaliser plusieurs insertions en une fois :

Code : Tout sélectionner

INSERT INTO ma_table (champ1, champ2, champ3) VALUES ('valeur1', 'valeur2', 'valeur3'), ('valeur1', 'valeur2', 'valeur3'), ('valeur1', 'valeur2', 'valeur3'), ('valeur1', 'valeur2', 'valeur3')
ce qui équivaut à

Code : Tout sélectionner

INSERT INTO ma_table (champ1, champ2, champ3) VALUES ('valeur1', 'valeur2', 'valeur3'); INSERT INTO ma_table (champ1, champ2, champ3) VALUES ('valeur1', 'valeur2', 'valeur3'); INSERT INTO ma_table (champ1, champ2, champ3) VALUES ('valeur1', 'valeur2', 'valeur3'); INSERT INTO ma_table (champ1, champ2, champ3) VALUES ('valeur1', 'valeur2', 'valeur3');
Généralement ça accélère énormément la chose.

par Sékiltoyai » 08 août 2007, 10:00

....Je pense que la difficulté vient de la boucle que je ne sais pas bien écrire(incrémentation $i,$i++).
Non, non. Le problème vient du fait que tu fais une requète pour chaque enregistrement de ta table. Tu fais exploser le traffic SQL. Il faudrait réduire le nombre d'enregistrement, et tout fairte en quelques requètes (2 si tu fait une sélection massive et une insertion massive.
Ce qu'il faudrait c'est "formater" une bonne fois toutes les lignes en PHP et les insérer ensuite avec une requête INSERT.
On est d'accord, ceci doit être fait à l'enregistrement et non être refait à la volée.

par Invité » 08 août 2007, 09:25

Toutes les lignes comportent des modifications à faire (au moins pour les dates) , sinon il y a la solution en SQL pur avec

Code : Tout sélectionner

CASE WHEN... THEN...ELSE...END
mais cela implique des difficultés supplémentaires (date avec 12 mois(JAN,FEB,MAR, etc...) donc 12 conditions dans la même instruction!).
....Je pense que la difficulté vient de la boucle que je ne sais pas bien écrire(incrémentation $i,$i++).
Ce qu'il faudrait c'est "formater" une bonne fois toutes les lignes en PHP et les insérer ensuite avec une requête INSERT.
En fait, quand je remplace la requête INSERT par des "echo ", la page HTML s'affiche trés rapidement!
<?php  
 $connect=mysql_connect("localhost", "root", "") or die ("Echec de la connexion au serveur !"); 
$select=mysql_select_db("facture");  
$sql="SELECT * from $perso"; 
    //echo $sq; 
    $result=mysql_query($sql); 
    $i=0; 
while ($row=mysql_fetch_array($result)) { 
if ($i==0) { 
$i++; } 
else { 
$i--; 
} 
$abonne=$gsm; 
//recueil des 9 derniers chiffres du N° 
$abon=substr($gsm,-9); 
$appelant=$row[0]; 
//effacer les espaces 
$appelant2 = ereg_replace(' ','',$appelant); 
//Effacer le i de international 
$appelant3 = ereg_replace('i','',$appelant2); 
//recueil des 9 derniers chiffres du N° 
$appelant4=substr($appele3,-9); 
$appele=$row[1]; 
$appele2 = ereg_replace(' ','',$appele); 
$appele3 = ereg_replace('i','',$appele2); 
$appele4=substr($appele3,-9); 
$compose=$row[2]; 
$compose2 = ereg_replace(' ','',$compose); 
$compose3 = ereg_replace('i','',$compose2); 
$compose4=substr($compose3,-9); 
//date fr vers date Mysql 
$horo =dateswitch($row[3]); 
// si temps est en secondes alors heures minutes secondes 
if (ereg ("[A-Za-z]", $row[4])){ 
$dursec= ereg_replace("s","",$row[4]); 
$seconde=convert_sec($dursec); 
$dur=ConvertisseurTime($seconde); 
} 
else 
{ 
$dur=ereg_replace(' ','',$row[4]); 
} 
$resultap=ereg_replace(' ','',$row[5]); 
$appele4=substr($appele3,-9); 
if ($resultap != "Efficace") 
{ 
$resultap="Répondeur"; 
} 
else if ($resultap == "Efficace" && $appele4 == $abon ) 
{ 
$resultap="Entrant"; 
} 
else  
{ 
$resultap="Sortant"; 
} 
if ($compose4==$abon){ 
$corresp=$appelant3; 
} 
else  
{ 
$corresp=$appele3; 
} 
//insertion des données 
   // $sql = "INSERT INTO $perso2(`type appel`, `abonné`,`correspondant`, `date`, `durée`,`id`) 
//VALUES ('$resultap','$gsm','$corresp','$horo','$dur',$row[7]) "; 
//affichage des données
echo $resultap ;
echo $gsm;
echo $corresp;
echo $horo;
echo $dur;
//$res = @mysql_query($sql) ; 
//echo $sql; 
} 
 ?>

par Sékiltoyai » 07 août 2007, 22:55

Et tu es obligé de le faire sur toute la table à chaque fois, tu ne peux pas le faire à l'insertion ?

par martial » 07 août 2007, 21:37

Chaque ligne contient un numéro de téléphone avec soit un prefixe en 33 (ce n'est pas toujours le cas) ou un préfixe en international (ou encore précédé par un "i"), je dois enlever le 33 et/ou le i et dans le cas du 33 le remplacer par 0.
En plus les dates sont au format français (ex: "22/11/06 13:22:00" ou 22-NOV-2006 13:22:00), je dois les transformer au format Mysql (2006-11-22 13:22:00)
les durées d'appels sont quelquefois au format hh:mm:ss et quelquefois en secondes (ex: 23s).
En fait, La base va rassembler tous les numéros et ensuite nous devons faire des stats pour savoir les N° le plus appelé en fonction de la date et du temps passé pour chaque appel,pour enfin cibler la clientéle en fonction de chaque région. On appelle ca de la stratégie marketing.

Par la suite (mais c'est une autre histoire) nous devrons joindre les N° aux coordonnées clients.
Quant à la boucle, elle me servait à afficher les lignes sur une page HTML. (quand je ne met pas la requête dans la boucle, elle ne m'enregistre rien)

par Sékiltoyai » 07 août 2007, 21:17

Justement, à quoi te sert ce code :
if ($i==0) { 
$i++; } 
else { 
$i--; 
}
Et est-ce que tu pourrais résumer les modifications que tu fais sur chaque enregistrement ?

par martial » 07 août 2007, 20:56

justement ,la lenteur vient de la boucle qui à chaque fois a pour instruction d'insérer une nouvelle ligne aprés avoir "remodelé" les champs (la date, la durée d'appel, les N° internationaux, etc..)...et en plus je ne "maitrise" pas bien la programmaiton de pas la boucle
while ($row=mysql_fetch_array($result)) { 
if ($i==0) { 
$i++; } 
else { 
$i--; 
} 
Donc ou dois je mettre la requête?

par Sékiltoyai » 07 août 2007, 20:07

Ah oui, aussi, on ne met pas une requète SQL dans une boucle, à moins de vouloir détruire son serveur, et il faut préférer str_replace() pour les remplacements basiques et preg_replace() pour les remplacements avancés à ereg_replace(), laquelle est beaucoup moins performante.

par Sékiltoyai » 07 août 2007, 20:04

Regardes du côté de la fonction microtime() et fais des benchs sur ton programme (surtout l'éxécution de la requète) pour savoir d'où vient la lenteur.

insertion en grand nombre

par martial » 07 août 2007, 20:00

Bonjour à tous
Au boulot je suis chargé de regrouper toutes les factures d'appels de portables des commerciaux avec les appels de la boite pour faire un mailing vers les clients.
J'ai donc crée une base de données Mysql et j'insére les données par fichiers CSV
mais je dois ensuite "remodeler" cette premiére table afin que les factures soient lisibles par tous les commerciaux.
J'ai donc "créee" un programme en PHP pour le faire mais quand je transfére les données de la table UNE à la table 2 c'est la catastrophe; les milliers de lignes mettent un temps infini à se tranférer. Vu mon faible niveau en PHP je pense que ce programme n'est pas du tout optimisé (probléme d'accolades, d'instruction, de boucle, etc...)
Comment peut-on faire pour que les données s'insérent rapidement (moins de 10 secondes)
Voici le programme
<?php 
 $connect=mysql_connect("localhost", "root", "") or die ("Echec de la connexion au serveur !");
$select=mysql_select_db("facture"); 
$sql="SELECT * from $perso";
	//echo $sq;
	$result=mysql_query($sql);
	$i=0;
while ($row=mysql_fetch_array($result)) {
if ($i==0) {
$i++; }
else {
$i--;
}
$abonne=$gsm;
//recueil des 9 derniers chiffres du N°
$abon=substr($gsm,-9);
$appelant=$row[0];
//effacer les espaces
$appelant2 = ereg_replace(' ','',$appelant);
//Effacer le i de international
$appelant3 = ereg_replace('i','',$appelant2);
//recueil des 9 derniers chiffres du N°
$appelant4=substr($appele3,-9);
$appele=$row[1];
$appele2 = ereg_replace(' ','',$appele);
$appele3 = ereg_replace('i','',$appele2);
$appele4=substr($appele3,-9);
$compose=$row[2];
$compose2 = ereg_replace(' ','',$compose);
$compose3 = ereg_replace('i','',$compose2);
$compose4=substr($compose3,-9);
//date fr vers date Mysql
$horo =dateswitch($row[3]);
// si temps est en secondes alors heures minutes secondes
if (ereg ("[A-Za-z]", $row[4])){
$dursec= ereg_replace("s","",$row[4]);
$seconde=convert_sec($dursec);
$dur=ConvertisseurTime($seconde);
}
else
{
$dur=ereg_replace(' ','',$row[4]);
}
$resultap=ereg_replace(' ','',$row[5]);
$appele4=substr($appele3,-9);
if ($resultap != "Efficace")
{
$resultap="Répondeur";
}
else if ($resultap == "Efficace" && $appele4 == $abon )
{
$resultap="Entrant";
}
else 
{
$resultap="Sortant";
}
if ($compose4==$abon){
$corresp=$appelant3;
}
else 
{
$corresp=$appele3;
}
//insertion des données
    $sql = "INSERT INTO $perso2(`type appel`, `abonné`,`correspondant`, `date`, `durée`,`id`)
VALUES ('$resultap','$gsm','$corresp','$horo','$dur',$row[7]) ";

//mysql_query ($sql0) or die ('Erreur SQL !'.$sql0.'<br />'.mysql_error());
$res = @mysql_query($sql) ;
//echo $sql;
}
 ?>