Comparer les valeurs et inserer une nouvelle fois

Signaler
-
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
-
Bonjour,

j'ai besoin d'aide a propos de ca :
par exemple j'ai une table "client" et une table "societe"
dans la table client on a un champs "nomsociete"

donc ma question est comment faire pour verifier le "nomsociete" depuis les 2tables et l'insere sur une nouvelle table "newsociete"
je dis bien verifier ex => "commentcamarche" et" CommentCamarche"

Merci d'avance

Language : php
BDD: mysql

Configuration: Windows / Chrome 79.0.3945.130

8 réponses

Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Bonjour
Déjà, pour la comparaison il va te falloir utiliser un IF et la fonction strcmp

https://www.php.net/manual/fr/function.strcmp.php

pour ce qui est ensuite de prendre les données dans la base et éventuellement en insérer de nouvelles dans une table tout dépend si tu utilises musqli ou PDO...


Bonjour
Merci pour votre reponse
je check la fonction strcmp

pour ta question j'utiilise mysqli
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Tu pourrais aussi le faire directement via une requête SQL sans avoir à passer par du PHP.

Cette opération doit être réalisée une seule fois... ou sinon dans quel(s) cas ?

Quelle est la structure de tes trois tables ?



Bonjour, :

table 1 => id/nomclient/nomsoc
table 2 => id/nomsoc

table3 => id / nomsoc

c un peut comme la verification des doublons mais plutot verification des valeurs sur les tables

comme j'ai deja dit : par exemple on verifie "Commentcamarche" avec "comment Ca Marche" ca doit nous donner une seul valeur vu que c'est le meme et l'insere sur la table 3
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
en relisant ta question je constate que non seulement les majuscule minuscule peuvent changer mais qu'il peut également y avoir des espaces...
Peux-tu également avoir d'autres caractères comme par exemple des tirets ?
au final le plus simple va être d'utiliser du PHP et de faire un script qui boucle sur ta première table afin de faire les comparaisons.
Il faudra que tu procède un traitement afin d'éliminer tous les caractères parasites tels que les espaces les tirets les points ou autre chose que tu aurais pu laisser...
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Voici une petite fonction pour traiter les chaines avant de faire les comparaisons

<?php
/**
* Fonction pour remplacer les caractères accentués, les espaces et les tirets
*/
function cleanStr($str){
  //on supprime les caractères accentués (on les remplace par les caractères non accentués )
  $unwanted_array = array(    'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                            'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U',
                            'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c',
                            'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
                            'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y');
  $str = strtr( $str, $unwanted_array );

  //on supprime les espaces
  $str = trim(preg_replace('/\s+/', '', $str));  

  //on supprime les tirets
  $str = trim(preg_replace('/\-+/', '', $str));  
  
  // on retourne le resultat et on met tout en minuscule :
  return strtolower($str);
}


Textes identiques
//Donc reprenons ton exemple :
$text1 = "Commentcamarche";
$text2 = "comment Ca Marche";

//on va supprimer les espaces et les éventuels tirets
$text1 = cleanStr($text1);
$text2 = cleanStr($text2);

//on fait la comparaison :
if($text1==$text2){
  echo "Les texts sont identiques";
}else{
  echo "Texts différents !";
}

echo "<br>Text1 " . $text1;
echo "<br>Text2 " . $text2;
echo "<hr>";
  


Avec des texts différents

//------- TEST 2 , chaines différents --------//
//Donc reprenons ton exemple :
$text1 = "Commentcamarche.net";
$text2 = "comment-Ca- Marche";

//on va supprimer les espaces et les éventuels tirets
$text1 = cleanStr($text1);
$text2 = cleanStr($text2);

//on fait la comparaison :
if($text1==$text2){
  echo "<br>1Les texts sont identiques";
}else{
  echo "<br>Texts différents !";
}

echo "<br>Text1 " . $text1;
echo "<br>Text2 " . $text2;
echo "<hr>";


?>

Bonjour,
Merci pour ta réponse ca m'as aider un peu
il me reste comment faire pour verifier ca dynmiquement vu que j'affiche les results depuis une BDD avec une boucle donc comment je fais pour verifier chaque enregistrement

Merci d'avance
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103 > Remote
Et bien.. comme tu le dis... dans une boucle ....
Voici le code que j'ai la :

$sql = "SELECT *  from client ";
     $sqlso = "SELECT * FROM societe"; 
     $res=$con->query($sql);
   $result = mysqli_query($con, $sql);
   $r=mysqli_query($con,$sqlso);

   $datas =array();
   if (mysqli_num_rows($result) > 0) 
   {
    $row_count = mysqli_num_rows($result);
    $row_count1 = mysqli_num_rows($r);
    $remaining_rows = min($row_count, $row_count1);
    $data = mysqli_fetch_row($result);
    $data1 = json_encode($data[2]);
    $cleanStr = cleanStr($data1);
    $sqlso="SELECT * FROM societe WHERE nomsociete LIKE'%$cleanStr%'";
    $x = mysqli_query($con,$sqlso);
    
    while($remaining_rows-- > 0)
       {
           $row = mysqli_fetch_assoc($result);
           $row1 = mysqli_fetch_assoc($x);
          
           if($row["nomsociete"] == $row1["nomsociete"])
           {
               echo ' Nom 1:  '.$row1["nomsociete"] ;
               echo ' & Nom 2:  '.$row["nomsociete"].' <br/> ';
           }
           else{
            echo ' ce nom   '.$row["nomsociete"].' n\'est pas identique a '.$row1["nomsociete"].' <br/> '   ;
           }
       }

EDIT : AJOUT DES BALISES DE CODE

Merci d'y penser à l'avenir !
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Il te suffit donc, pour faire la comparaison, de remplacer ton if
 if($row["nomsociete"] == $row1["nomsociete"])

par le code que je t'ai donné....
> jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020

Bonjour,
Donc voila mnt vu que jai ce resultat j'ai constater qu'il faut verifier chaque enregistrement de la table par tous ceux dans la 2eme table:
exp: la valeur "commentcamarch" sur la table 1 faut que ca se verifie sur toute la table 2 apres ca passe la 2eme valeur... et ca continue je crois qu'il faut une autre boucle pour faire ca nn?
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103 > Remote
oui
> jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020

Bonjour,
je suis debutant sur ca j'ai l'idée mais il me faut d'aide pour l'appliquer

Merci
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Qu'as tu essayé ?
Sur quel point bloques tu exactement ?

Voici de quoi t'aider à avancer
//requete sur la table client
$sql = "SELECT *  from client ";
$qClient = mysqli_query($con, $sql);
$row_count_client = mysqli_num_rows($qClient);

//requete sur la table societe
$sqlso = "SELECT * FROM societe"; 
$qSoc = mysqli_query($con,$sqlso);
$row_count_societe = mysqli_num_rows($qSoc);

$datas =array();

if ($row_count_client > 0){
  //boucle sur les clients  
  while($C = mysqli_fetch_array($qClient, MYSQLI_ASSOC)){
    //boucle sur les societes
    while($S = mysqli_fetch_array($qSoc, MYSQLI_ASSOC)){
      
      //...
      //ici ton code pour la comparaison
      // ...
          
    }
  }
}else{
  echo " Aucun client trouvé !";
}

ca verifie juste les enregistrement de la table societe avec le premier enregistrement de la table client
j'ai louper quelque chose je pense
jordane45
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103 > Remote
non pas que les premiers...
ça compare chaque enregistrement de ta table client avec chaque enregistrement de ta table société... c'est bien ce que tu nous a demandé ?!

qu'as-tu mis comme code pour effectuer la comparaison au milieu de la boucle que je t'ai donné ?
oui normalement

j'ai ajouter la condition de verification

if(cleanStr($S["nomsociete"])==cleanStr($C["nomsociete"]))
{
echo $C["nomsociete"] ;
echo ' est identique a : '.$S["nomsociete"].' <br/> ';
}
else
{
echo $S["nomsociete"].' n\'est pas identique a '.$C["nomsociete"].' <br/> ' ;
}


Voici resultat:
coke n'est pas identique a coca
coca est identique a : coca
cokiLa n'est pas identique a coca
Lacoki n'est pas identique a coca
corki n'est pas identique a coca
telus n'est pas identique a coca
Telus Holding n'est pas identique a coca
coka n'est pas identique a coca
Messages postés
27547
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 février 2020
2 103
Avec ce script, tu n'auras que les sociétés qui sont présentes dans la table "client" et qui existeraient également dans la table société.

//requete sur la table client
$sql = "SELECT DISTINCT nomsociete  from client ORDER BY nomsociete";
$qClient = mysqli_query($con, $sql);
$row_count_client = mysqli_num_rows($qClient);

//requete sur la table societe
$sqlso = "SELECT DISTINCT nomsociete FROM societe ORDER BY nomsociete"; 
$qSoc = mysqli_query($con,$sqlso);
$row_count_societe = mysqli_num_rows($qSoc);

$datas =array();

if ($row_count_client > 0){
  //boucle sur les clients  
  while($C = mysqli_fetch_array($qClient, MYSQLI_ASSOC)){
    $ns_client = $C["nomsociete"];
    echo " <br><b> nomsociete de CLIENT : </b>" . $ns_client;
    //boucle sur les societes
    while($S = mysqli_fetch_array($qSoc, MYSQLI_ASSOC)){
      $ns_societe = $S["nomsociete"];  
      echo " <br>nomsociete de SOCIETE : " . $ns_societe;  
      if(cleanStr($ns_client)==cleanStr($ns_societe)){
        echo "IDENTIQUES";
      }else{
        echo "différents";
      }
          
    }
  }
}else{
  echo " Aucun client trouvé !";
}


Mais si c'est juste pour avoir la liste des sociétés "uniques"... qu'elles soient présentes ou non dans les deux tables, tu peux faire un truc encore mieux je pense...
un truc du genre :
$sql = "
        SELECT DISTINCT nomsociete  
        FROM (
          SELECT nomsociete
          FROM client 
          UNION
          SELECT nomsociete
          FROM societe 
         ) T
        ORDER BY nomsociete";
        
$qAll = mysqli_query($con,$sql);  

$prec = NULL;
$cur = NULL;

$datas = array();

while($R = mysqli_fetch_array($qAll, MYSQLI_ASSOC)){
  $cur = $R['nomsociete']; 
  if(cleanStr($cur) == $prec ){
    //identiques !
    echo $cur . " (" . cleanStr($cur) .") ". "  existe déjà !<br>";
  }else{
    //"nouvelle" société
     $datas[] = $cur; //on la stocke dans l'array $datas
  }
    
  $prec = cleanStr($cur);
}

echo "<br>Liste des societés 'uniques' <pre>";
print_r($datas);
echo "</pre>";



NB : Merci à l'avenir d'utiliser correctement les balises de code (en y précisant le LANGAGE ) afin que l'on ait la coloration syntaxique, l'indentation et le numéro de lignes.
Comme les codes que je te postes....