par
sadeq » 23 juin 2009, 12:03
Bonjour, bon voila, j'ai lu vos interventions et j'ai délimité le problème.
En fait, le souci est que le contenu du champ destinataire de la base de données diffère du contenu $NP1 car il se peut que le nombre d'espaces entre le nom et le prénom ne soit pas le même. C'est pour cela qu'il vaudrait mieux utiliser une expression régulière dans la requête SQL qui permet d'ignorer le trop d'espaces non significatif et ainsi faire une bonne comparaison.
Voici comment :
L'expression régulière qui permet d'ignorer les espaces non significatifs entre 2 mots est de la forme suivante:
trim(champ) REGEXP '^Dupont[[:blank:]]+Jean$'
où :
^ et $ désignent le début et la fin du texte recherché
et
[[:blank:]]+ désignent une ou plusieurs occurrences (+) possibles de l'espace ([[:blank:]])
Le TRIM permet d'éliminer les espaces inutiles qui peuvent exister avant et après le texte.
Cette expression retourne VRAI ou 1 dans le cas où le contenu du champ correspond à la syntaxe du texte recherché (on l'appelle : le filtre de l'expression régulière)
Donc dans ton cas, il faut mettre les variables $nom et $prenom à leurs emplacements dans cette expression régulière et mettre le tout dans la requête SQL. Ce qui donne le code suivant:
$prenom = trim($Tab['prenom']); // trim : enlève les espaces inutiles autour du mot
$nom = trim($Tab['nom']);
// expression régulière pour chercher un nom et prénom quelque soit le nbre d'espaces les séparant
$regexp = '^' . $nom . '[[:blank:]]+' . $prenom . '$'; // expression comme : '^Dupont\s*Jean$'
$query = "SELECT nom_pdf,destinataire,diffusee_par,email1,email2,date FROM a_verifier WHERE TRIM(destinataire) REGEXP '$regexp'";
Et voici, le programme général corrigé:
[NOTA] J'ai aussi re-structuré le bloc de la seconde requête et mis $total >0 (plus logique que == et !=)
<?php
$pseudo = $_COOKIE['monpseudo'];
$select2 = "SELECT nom,prenom FROM membre WHERE pseudo= '$pseudo' ";
$result2 = mysql_query($select2,$db_link) or die ('Erreur : '.mysql_error() );
$total = 0;
if ($Tab=mysql_fetch_array($result2))
{
$prenom = trim($Tab['prenom']);
$nom = trim($Tab['nom']);
// expression régulière pour chercher un nom et prénom quelque soit le nbre d'espaces les séparant
$regexp = '^' . $nom . '[[:blank:]]+' . $prenom . '$'; // expression comme : '^Dupont[[:blank:]]+Jean$'
$query = "SELECT nom_pdf,destinataire,diffusee_par,email1,email2,date FROM a_verifier WHERE TRIM(destinataire) REGEXP '$regexp'";
$resultat = mysql_query($query,$db_link) or die (mysql_error());;
$total = mysql_num_rows($resultat);//donne le nombre de ligne
}
// si on a récupéré un résultat on l'affiche.
if($total >0) {
//debut du tableau
echo'<table bgcolor="#FFFFFF">'."\n";
// première ligne on affiche les titres du tableau nomTA , pseudo , NRDVvalide ,
//NRDVenattente , NRDVannule dans 5 colones
echo '<tr>';
echo '<td bgcolor="#669999"><b><u>Nom_PDF</u></b></td>';
echo '<td bgcolor="#669999"><b><u>diffuser par</u></b></td>';
echo '<td bgcolor="#669999"><b><u>email du diffuseur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>destinateur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>email du destinateur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>date</u></b></td>';
echo '<td bgcolor="#669999"><b><u>état</u></b></td>';
echo '</tr>'."\n";
// lecture et affichage des résultats sur 6 colonnes, 1 résultat par ligne.
while($row=mysql_fetch_array($resultat))
{
echo '<tr>';
echo '<td bgcolor="#CCCCCC"><a href="A_VERIFIER//'.$row["nom_pdf"].'">'.$row["nom_pdf"].'</a></td>';
//echo '<td bgcolor="#CCCCCC"><a href="test4.php">'.$row["nom_pdf"].'</a></td>';
echo '<td bgcolor="#CCCCCC">'.$row["diffusee_par"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["email1"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["destinataire"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["email2"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["date"].'</td>';?>
<td bgcolor="#CCCCCC"><SELECT name="reponse" onChange="alert('Index: ' + this.selectedIndex + '\nValeur: ' +
this.options[this.selectedIndex].value)">'
<option value="valider"> </option>
<option value="valider">valider</option>
<option value="refuser">refuser</option>
</select>
</td>
<?php
echo '</tr>'."\n";
}
echo '</table>'."\n";
// fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';
// on libère le résultat
mysql_free_result($resultat);
?>
<a href="<?php echo $url; ?>">Se déloguer</a>
</body>
</html>
<?php
close();
?>
C'est vrai que les expressions régulières sont très pratiques pour effectuer des recherches dans le texte, mais elles sont à consommer avec modération

car elles consomment plus de ressources que les opérateurs de comparaison normaux.
Pour plus d'infos sur les Regexp de MySQL, voir :
http://dev.mysql.com/doc/refman/5.0/fr/regexp.html
Bonjour, bon voila, j'ai lu vos interventions et j'ai délimité le problème.
En fait, le souci est que le contenu du champ destinataire de la base de données diffère du contenu $NP1 car il se peut que le nombre d'espaces entre le nom et le prénom ne soit pas le même. C'est pour cela qu'il vaudrait mieux utiliser une expression régulière dans la requête SQL qui permet d'ignorer le trop d'espaces non significatif et ainsi faire une bonne comparaison.
Voici comment :
L'expression régulière qui permet d'ignorer les espaces non significatifs entre 2 mots est de la forme suivante:
[b] trim(champ) REGEXP '^Dupont[[:blank:]]+Jean$'[/b]
où :
[b]^ et $[/b] désignent le début et la fin du texte recherché
et [b][[:blank:]]+[/b] désignent une ou plusieurs occurrences (+) possibles de l'espace ([[:blank:]])
Le TRIM permet d'éliminer les espaces inutiles qui peuvent exister avant et après le texte.
Cette expression retourne VRAI ou 1 dans le cas où le contenu du champ correspond à la syntaxe du texte recherché (on l'appelle : le filtre de l'expression régulière)
Donc dans ton cas, il faut mettre les variables $nom et $prenom à leurs emplacements dans cette expression régulière et mettre le tout dans la requête SQL. Ce qui donne le code suivant:
[php] $prenom = trim($Tab['prenom']); // trim : enlève les espaces inutiles autour du mot
$nom = trim($Tab['nom']);
// expression régulière pour chercher un nom et prénom quelque soit le nbre d'espaces les séparant
$regexp = '^' . $nom . '[[:blank:]]+' . $prenom . '$'; // expression comme : '^Dupont\s*Jean$'
$query = "SELECT nom_pdf,destinataire,diffusee_par,email1,email2,date FROM a_verifier WHERE TRIM(destinataire) REGEXP '$regexp'";[/php]
Et voici, le programme général corrigé:
[NOTA] J'ai aussi re-structuré le bloc de la seconde requête et mis $total >0 (plus logique que == et !=)
[php]<?php
$pseudo = $_COOKIE['monpseudo'];
$select2 = "SELECT nom,prenom FROM membre WHERE pseudo= '$pseudo' ";
$result2 = mysql_query($select2,$db_link) or die ('Erreur : '.mysql_error() );
$total = 0;
if ($Tab=mysql_fetch_array($result2))
{
$prenom = trim($Tab['prenom']);
$nom = trim($Tab['nom']);
// expression régulière pour chercher un nom et prénom quelque soit le nbre d'espaces les séparant
$regexp = '^' . $nom . '[[:blank:]]+' . $prenom . '$'; // expression comme : '^Dupont[[:blank:]]+Jean$'
$query = "SELECT nom_pdf,destinataire,diffusee_par,email1,email2,date FROM a_verifier WHERE TRIM(destinataire) REGEXP '$regexp'";
$resultat = mysql_query($query,$db_link) or die (mysql_error());;
$total = mysql_num_rows($resultat);//donne le nombre de ligne
}
// si on a récupéré un résultat on l'affiche.
if($total >0) {
//debut du tableau
echo'<table bgcolor="#FFFFFF">'."\n";
// première ligne on affiche les titres du tableau nomTA , pseudo , NRDVvalide ,
//NRDVenattente , NRDVannule dans 5 colones
echo '<tr>';
echo '<td bgcolor="#669999"><b><u>Nom_PDF</u></b></td>';
echo '<td bgcolor="#669999"><b><u>diffuser par</u></b></td>';
echo '<td bgcolor="#669999"><b><u>email du diffuseur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>destinateur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>email du destinateur</u></b></td>';
echo '<td bgcolor="#669999"><b><u>date</u></b></td>';
echo '<td bgcolor="#669999"><b><u>état</u></b></td>';
echo '</tr>'."\n";
// lecture et affichage des résultats sur 6 colonnes, 1 résultat par ligne.
while($row=mysql_fetch_array($resultat))
{
echo '<tr>';
echo '<td bgcolor="#CCCCCC"><a href="A_VERIFIER//'.$row["nom_pdf"].'">'.$row["nom_pdf"].'</a></td>';
//echo '<td bgcolor="#CCCCCC"><a href="test4.php">'.$row["nom_pdf"].'</a></td>';
echo '<td bgcolor="#CCCCCC">'.$row["diffusee_par"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["email1"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["destinataire"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["email2"].'</td>';
echo '<td bgcolor="#CCCCCC">'.$row["date"].'</td>';?>
<td bgcolor="#CCCCCC"><SELECT name="reponse" onChange="alert('Index: ' + this.selectedIndex + '\nValeur: ' +
this.options[this.selectedIndex].value)">'
<option value="valider"> </option>
<option value="valider">valider</option>
<option value="refuser">refuser</option>
</select>
</td>
<?php
echo '</tr>'."\n";
}
echo '</table>'."\n";
// fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';
// on libère le résultat
mysql_free_result($resultat);
?>
<a href="<?php echo $url; ?>">Se déloguer</a>
</body>
</html>
<?php
close();
?> [/php]
C'est vrai que les expressions régulières sont très pratiques pour effectuer des recherches dans le texte, mais elles sont à consommer avec modération :lol: car elles consomment plus de ressources que les opérateurs de comparaison normaux.
Pour plus d'infos sur les Regexp de MySQL, voir : http://dev.mysql.com/doc/refman/5.0/fr/regexp.html