loudeur et lenteur de mon code

Eléphant du PHP | 162 Messages

08 avr. 2012, 20:57

salut voici un code que je viens de créer pour la gestion du courrier de mon ministère .
le code permet d'enregister les imputation de courrier et envoyer un mail au destinateur ( celui a qui on a imputer ).
de plus le mail doit contenir le fichier courrier qui avait auparavant été scanné .

je pense que le code marche bien main il prend trop de temps pour s’exécuter quand on click sur le bouton valider .
je pense que c'est du au fichier qui doit être envoyé par mail .
je vous demande de parcourir mon code pour voir :
1. s'il est bien conçu
2. comment éviter si possible cette lourdeur lors de l'envoi du code.


voici le code :
<?php
if (isset($_POST["valider"])) {
    
      /*IMPORTANT*/ 

include("connection.php"); 

/*faut securiser*/ 
foreach($_POST as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
} 

/*faut securiser*/ 
foreach($_GET as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
}
   
    $NumEnreg=trim($_POST["NumEnreg"]);
    $dateArrCourrier=trim($_POST["dateArrCourrier"]);
	$dateReinsert=trim($_POST["dateReinsert"]);
	$expediteur=trim($_POST["expediteur"]);
	$destinataire=trim($_POST["destinataire"]);
	$DateImput=trim($_POST["DateImput"]);
	$delaisImput=trim($_POST["delaisImput"]);
	$instructions=trim($_POST["instructions"]);
	$autreInstruction=trim($_POST["autreInstruction"]);
	$contact=trim($_POST["contact"]);
	$NoteDirCab=trim($_POST["NoteDirCab"]);
	$NoteMinitr=trim($_POST["NoteMinitr"]);
	$monemail=trim($_POST["monemail"]);
	 //requète sql
    $sql = "SELECT NumEnreg FROM Courrierimputation WHERE NumEnreg='$NumEnreg'"; 
    $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());  
     
    // on compte le nombre de résultats 
    $res = mysql_num_rows($req); 

      if($res!=0)  // l'url existe déjà, on affiche un message d'erreur 
        { 
             $msg = 'Désolé, mais ce numero  existe déjà dans notre base.'; 
             echo '<script>alert(\' '.$msg.' \');</script>';
        } 
      else  // L'url n'existe pas, on insère les informations du formulaire dans la table 
        { 

// insertion de l'ex-combattants
 $sql = "INSERT INTO Courrierimputation(      id,NumEnreg,dateArrCourrier,expediteur,destinataire,monemail,DateImput,delaisImput,instructions,autreInstruction,contact,NoteDirCab,NoteMinitr)																																																																																																																																																																																				VALUES('','".$NumEnreg."','".$dateArrCourrier."','".$expediteur."','".$destinataire."','".$monemail."','".$DateImput."','".$delaisImput."','".$instructions."','".$autreInstruction."','".$contact."','".$NoteDirCab."','".$NoteMinitr."')";
      // on insère les informations du formulaire dans la table  
    $result= mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
      $msg =  'Les informations sur le courrier ont été ajoutées ont été ajoutées dans la base de données.</br>';
      ///echo '<font color="red">'.$msg.'</font>'; 
      echo '<script>alert(\' '.$msg.' \');</script>';


      }
	  if($result) 
	     {
		     $q = mysql_query("SELECT * FROM Courrierimputation where NumEnreg=$NumEnreg"); // requete 
			  if (!$q) {
                  echo 'Impossible d\'exécuter la requête : ' . mysql_error();
                    exit;
                }
while ($row = mysql_fetch_assoc($q)) {

ini_set('error_reporting', E_ALL); 
ini_set('display_errors', 1); 

ini_set('SMTP', 'smtp.aviso.ci'); 
ini_set('smtp_port', 25); 
ini_set('sendmail_from', '[email protected]'); 
       
	   // To
       
      $mail = $row['monemail'] ;
 if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui présentent des bogues.
{
	$passage_ligne = "\r\n";
}
else
{
	$passage_ligne = "\n";
}
//=====Déclaration des messages au format texte et au format HTML.
$message_txt = "Vous venez de recevoir un mail du cabinet . Veuillez ouvvir le courrier et suivre les instruction . merci .";
$message_html = "<html><head></head><body><b>Salut à tous</b>, voici un e-mail envoyé par un <i>script PHP</i>.</body></html>";
//========
//requète pour recuperer le nom de l'image 
  $qt = mysql_query("SELECT renseigner.fichier_choisi,renseigner.id_victime,servicecourrier.id_sc,servicecourrier.NumEnreg,courrierimputation.NumEnreg FROM renseigner , servicecourrier , courrierimputation  WHERE renseigner.id_victime=servicecourrier.id_sc AND servicecourrier.NumEnreg=courrierimputation.NumEnreg "); // requete 
			  if (!$qt) {
                  echo 'Impossible d\'exécuter la requête : ' . mysql_error();
                    exit;
                }
while ($row = mysql_fetch_assoc($qt)) {
$monImage = $row['fichier_choisi'] ;
//=====Lecture et mise en forme de la pièce jointe.
$fichier   = fopen($monImage, "r");
$attachement = fread($fichier, filesize("$monImage"));
$attachement = chunk_split(base64_encode($attachement));
fclose($fichier);
//==========
 
//=====Création de la boundary.
$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());
//==========
 
//=====Définition du sujet.
$sujet = "Hey mon ami !";
//=========
 
//=====Création du header de l'e-mail.
$header = "From: \"WeaponsB\"<[email protected]>".$passage_ligne;
$header.= "Reply-to: \"WeaponsB\" <[email protected]>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
//==========
 
//=====Création du message.
$message = $passage_ligne."--".$boundary.$passage_ligne;
$message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
//=====Ajout du message au format texte.
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_txt.$passage_ligne;
//==========
 
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
 
//=====Ajout du message au format HTML.
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$message_html.$passage_ligne;
//==========
 
//=====On ferme la boundary alternative.
$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
//==========
 
 
 
$message.= $passage_ligne."--".$boundary.$passage_ligne;
 
//=====Ajout de la pièce jointe.
$message.= "Content-Type: image/jpeg; name=\"upload_fichier/image.jpg\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: base64".$passage_ligne;
$message.= "Content-Disposition: attachment; filename=\"upload_fichier/image.jpg\"".$passage_ligne;
$message.= $passage_ligne.$attachement.$passage_ligne.$passage_ligne;
$message.= $passage_ligne."--".$boundary."--".$passage_ligne; 
//========== 
//=====Envoi de l'e-mail.
mail($mail,$sujet,$message,$header);
 
//==========
		 }
     }
  
   }
  //}
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 avr. 2012, 22:40

Salut,

On ne fait pas de select * pour compter mais un sélect count(*).

Même chose lorsque utilise qu'un champ pas de select(*) mais
                     $q = mysql_query("SELECT monemail FROM Courrierimputation where NumEnreg=$NumEnreg");

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 162 Messages

08 avr. 2012, 22:56

j'ai fait cette requète : <<$q = mysql_query("SELECT * FROM Courrierimputation where NumEnreg=$NumEnreg")>> pas pour compter mais pour recupérer le mail enregistrer plus haut .

je pense que je pouvais aussi mettre : $q = mysql_query("SELECT monemail FROM Courrierimputation where NumEnreg=$NumEnreg");

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 avr. 2012, 23:03

Ma remarque sur le count c'est pour la requête juste avant l'insertion (ou juste après le patè avec les post.
Il en faut peu pour être heureux ......

Eléphant du PHP | 162 Messages

08 avr. 2012, 23:08

je vois mais est ce que ce que j'ai fait est faux ?? les deux requête jouent le meme role ici non ??

ViPHP
xTG
ViPHP | 7331 Messages

09 avr. 2012, 07:58

Euh oui, j'ai pas non plus trouvé la requête dont parlait moogli.

Par contre j'ai trouvé ça :
/*faut securiser*/
foreach($_GET as $k => $v){
$v=mysql_real_escape_string(strip_tags($v));
$_POST[$k]=$v;
}
Tu réécrases le tableau POST au lieu de GET.

Eléphant du PHP | 162 Messages

09 avr. 2012, 11:08

j'ai toujours utilisé ce code et ça toujours marché .
et je comprend pas trop la remarque .

ma préoccupation de savoir pourquoi l'envoi du formulaire est très lent et ça affiche après :
Fatal error: Maximum execution time of 60 seconds exceeded in C:\wamp\www\GESTION COURRIER MINISTERE_email\testmail3.php on line 160


je veux savoir comment régler cette lourdeur et lenteur .

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2012, 12:16

Y a que moi qui vois le mysql_num_rows ?
Parce que bon tu récupère X tuples pour savoir si ça existe dans la base => c'est le rôle d'un count ;)

Quitte à boucler sur $_POST autant faire le trim danse foreach
C'est normal que la boucle sur GET écrase les infos dans post ?

Tu fait une requête dans le traitent du autre c'est sûrement la que ça met le brin.
Une seule requête bien faite devrait suffire.

Il faut aussi que tu regarde comment on fait on jointures maintenant pour alléger un peu ton code et le rendre plus lisible ;)

Tu peux aussi regarder le temps que prennent les opérations, en utilisant la fonctions Time a différent endroit et une simple soustraction pour avoir le temps d'exécution des instructions entre les deux temps.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 162 Messages

09 avr. 2012, 12:38

merci moogly de bien vouloir m'aider . je suis débutant en PHP .
pour mysql_num_rows tu voudrais que je remplace par ça ??
$query = "SELECT count(*) from Courrierimputation WHERE NumEnreg='$NumEnreg'"; 
$result = mysql_query($query) or die (mysql_error()); 

$row=mysql_fetch_row($result); 

 if($row!=0)  // l'url existe déjà, on affiche un message d'erreur 
        { 
             $msg = 'Désolé, mais ce numero  existe déjà dans notre base.'; 
             echo '<script>alert(\' '.$msg.' \');</script>';
        } 
      else  // L'url n'existe pas, on insère les informations du formulaire dans la table 
        { 
               //////////////

        }

dit moi si cette requète est juste .



pour ça :
Quitte à boucler sur $_POST autant faire le trim danse foreach
C'est normal que la boucle sur GET écrase les infos dans post ?

vraiment je sais pas comment m'y prendre .

ensuite est-ce que ma requète avec la jointure est fausse ? si c'est le cas que me propose tu ??

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2012, 12:58

Pour la requête oui sauf que tu n'utilise pas correctement le résultat $row étant un tableau.
Donc la $row[0]

Tu a deux foreach au début du code un sûr $_POST et un un sur $_GET.
Les deux appliquent un mysql_real_escape_string sur chaque entrée (bien qu'Alain array_walk me semble plus indiqué ^^).
Le second foreach prend les valeur GET pour les mettre dans le tableau post. Or si tu a le même index dans GET et dans post tu écrase la valeur de post.
D'ailleurs tu n'utilise pas les valeurs de GET, normal ?

Tu ne test pas non plus l'existence des index dans post cela peux conduite à une erreur.
Pourquoi utiliser d'autre variable tu peux très bien utiliser le tableau poste dans les requête (avec la concaténation ça passe tous seul et c'est clair).

Garde la dernière requête et insère dedans le prédicat (la clause where de la première).
Je te conseil d'utiliser phpmyadmin, ou tout autre client mysql pour tester la requête avant d'essayer de l'exploiter dans ton script php ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 162 Messages

09 avr. 2012, 13:05

donc si je comprend bien dans cette partie:
/*faut securiser*/ 
foreach($_POST as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
} 

/*faut securiser*/ 
foreach($_GET as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
}
   
je dois enlever ça :
/*faut securiser*/ 
foreach($_GET as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
}
pour laisser que ça :
/*faut securiser*/ 
foreach($_POST as $k => $v){ 
$v=mysql_real_escape_string(strip_tags($v)); 
$_POST[$k]=$v; 
} 


et pour le $row je dois ecrire :
if($row[0]!=0)
enfin pour la jointure tu na rien dit

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2012, 13:38

Elle n' est pas fausse en soit, mais utilisé une manière de faire quelque peu désuète.
Pour une jointure on utilise le mot clef join, pour peu que tes tables soit en innodb, sinon en myisam laisse comme ça.
Il faut tu indique dans le where le numenreg= xxx dans la seconde requête et vire la première.
Ensuite tu récupère deux fois ce numéro dans la seconde requête c'est inutile parce que c'est le même et que de toute façon du la déjà déjà (d'ailleurs tu n'utilise que le mail donc le reste est de trop). De manière générale le select * et à bannir.

Donc revois ta requête pour qu'elle te donne ce que tu veux et ensuite calque ton code dessus.
Tu peux remplacer fopen + boucle par file_get_contents.
Ensuite à tu essayé d'envoyer un seul mail ?


@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

09 avr. 2012, 15:00

Je met en évidence l'erreur :
/*faut securiser*/
foreach($_GET as $k => $v){ // on travaille les données contenues dans $_GET
$v=mysql_real_escape_string(strip_tags($v));
$_POST[$k]=$v; // on insère la donée traitée dans $_POST !!!!!
}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 avr. 2012, 17:11

Vi à virer ça ;)
Il en faut peu pour être heureux ......