Optimisation code php

Bonjour, j'aimerais savoir si il existe un moyen d'optimisé ce code :
<?php
$timestamp_debut = microtime(true);
 
require 'groups/functions.php';
$bdd = connexion_bdd();
$text = 'exemple@email.com'; 

$reqmail = $bdd->query('SELECT mail FROM espace_membre_membres');
$i = 0;
while($mail = $reqmail->fetch()){
	if($text == decrypter($mail['mail'])){
		$i++;
	}
}

echo $i.'<br />';
 
$timestamp_fin = microtime(true);
$difference_ms = $timestamp_fin - $timestamp_debut;
echo 'Exécution du script : ' . $difference_ms . ' secondes.';
?>

Merci d'avance
Nils0

2 réponses

  1. Modérateur
    Bonjour,

    Tout dépend ce que contient ta fonction decrypter

    1. Merci de ta réponse, voici les fonctions :
      function crypter($chaine){
          if($chaine != null){
              $key = 'lacle';
              $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
              $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
              $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
              $chaine, MCRYPT_MODE_CBC, $iv);
              $ciphertext = $iv . $ciphertext;
              $ciphertext_base64 = base64_encode($ciphertext);
              return $ciphertext_base64; 
          }
      }
      
      function decrypter($chaine_crypter){
          if($chaine_crypter != null){
              $key = 'lacle';
              $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
              $ciphertext_dec = base64_decode($chaine_crypter);
              $iv_dec = substr($ciphertext_dec, 0, $iv_size);
              $ciphertext_dec = substr($ciphertext_dec, $iv_size);
              $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
              $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
              return trim($plaintext_dec);
          }
      }
      
  2. Bonjour,

    Tu peux probablement l'optimiser en cryptant le mail $text, et le mettant dans la clause WHERE du SQL, avec un COUNT(1) :
    <?php
    $timestamp_debut = microtime(true);
     
    require 'groups/functions.php';
    $bdd = connexion_bdd();
    $text = crypter('exemple@email.com'); 
    
    $reqmail = $bdd->query("SELECT COUNT(1) as nb FROM espace_membre_membres WHERE mail='$text'");
    
    $res = $reqmail->fetch();
    echo $res['nb'] . '<br />';
     
    $timestamp_fin = microtime(true);
    $difference_ms = $timestamp_fin - $timestamp_debut;
    echo 'Exécution du script : ' . $difference_ms . ' secondes.';
    ?>
    

    Pourquoi ça optimise ? Tu ne fais qu'une seule opération cryptographique au lieu de N.
    Pourquoi j'ai dit « probablement » ? Parce que je ne sais pas combien coûte la fonction crypter par rapport à la fonction decrypter. Si la première coûte 10 fois la seconde, et que tu n'as que 5 lignes en base, alors mon code n'optimise rien.
    Par contre, pour un grand nombre de lignes en base, c'est clairement plus efficace.

    Xavier
    1. (Juste au passage, si $text vient en réalité d'une donnée saisie par un utilisateur, utilise une requête préparée pour éviter les injections SQL)
    2. par contre ça ne marche pas car le systeme de cryptage retourne une chaine aléatoire...
    3. Si tu chiffres deux fois la même chaîne tu n'as pas deux fois le même résultat ?
      Mais tu peux les déchiffrer quand même ? C'est louche ton truc ^^'