Page 1 sur 1

Pb de comparaison de données d'une textarea avec un champSQL

Posté : 13 août 2013, 00:05
par niconiconico
Bonjour,

J'ai un probleme, j'arrive a enregistrer des donnees provenant d'une textarea dans ma base. Pas de soucis...

Mais lorsque que je compare en php, les données de ma textarea avec celles d'une table MySQL qui contient exactement les memes donnees*, la comparaison me dit que les données ne sont pas identiques.

* = (meme en copiant collant les données rentrées dans une autre table)

Par la je voudrais éviter de rentrer plusieurs fois les memes données.

PS: Lorsque je supprime les retours a la ligne partout(Champ MySQL + donnees de la textarea), cela fonctionne. Donc c'est evident que le probleme vient des retours a la ligne mais je ne sais pas pk.

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 00:38
par moogli
salut,

sans le code ni un exemple de données on ne peux pas vraiment t'aider (PHP et SQL dont le create table)

Cela peux être du à une conversion des sauts de ligne (remplacement de \r\n par \n par exemple).
est ce que tu utilise un nl2br() avant la comparaison ? (ou l'inverse un htmlentities ?).

@+

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 12:58
par niconiconico
OK

Alors ce texte est dans ma BDD MySQL -> table "originaux" :
------------------------------------------------------------------------------------------------------
Bonjour mon nom est Nicolas,

Je fais des tests mais j'ai un problème de saut de lignes dans ma base....

Voilà le texte en question.
------------------------------------------------------------------------------------------------------
Je rentre dans phpmyadmin, je copie le texte ci-dessus dans mon presse papier, je le colle dans une <textarea> sur ma page insert.php, et j appuie sur le bouton qui rentre les données dans un autre table "apports".
mysql_query("SET NAMES 'UTF8'");// car mon champ mysql est un longtext en UTF8_unicode_ci
mysql_query("INSERT INTO apports.message VALUES('".addslashes($page)."') or die(mysql_error());//$page est la variable du contenu de ma textarea
Enfin quand je fais un script qui compare ces deux entrées de ma table pour savoir si il sont identiques, il me dit non.... Alors que sous phpmyadmin ils ont l'air bien identiques
$sql="SELECT * FROM apports WHERE id = 392";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
{
echo $row['message'];
echo "<br /><br /><br /><br /><br /><br /><br /><br />";
}

$sql="SELECT * FROM originaux  WHERE id = 3";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
{
echo $row['texte'];
echo "<br /><br /><br /><br /><br /><br /><br /><br />";
}

if ($row['message'] = $row['texte'])
{ echo "OUI";}
else
{ echo "NON";}
Ici l article apport.messages qui a l'ID 392 et l'article originaux.texte qui a l'ID 3 sont parfaitement identiques dans phpmyadmin

J'ai essayé avec nb2lr mais ca ne rajoute que des <br /> à la place des sauts de lignes. J'ai essayé de comparer les memes champs qui ont tous les deux des <br />, la comparaison me dit qu'ils ne sont pas identiques non plus.
------------------------------------------------------------------------------------------------------
Bonjour mon nom est Nicolas,<br />
<br />
Je fais des tests mais j'ai un problème de saut de lignes dans ma base....<br />
<br />
Voilà le texte en question.
------------------------------------------------------------------------------------------------------

PS: Si j'enlève tous les sauts de lignes ainsi que tous les <br />, cela fonctionne.

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 18:48
par moogli
Le code fait que le est toujours vrai car tu as mis un égale (affectation toujours vrai).
Si tu remplace par un double égale tu aura une comparaison.

De plus ton code écrase le premier résultat de la requête SQL. Change le nom de la variable dans le second while (par exemple $row2 et tu devrais avoir moins de problème

Tu met addslashes a l'insertion utilise plutôt mysql_real_escape_string.


@+

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 20:11
par niconiconico
Merci Moogli pour ta réponse...

Mais maintenant il me dit que c'est toujours égal !? Je ne comprends plus

Ce que je fais maintenant, pour supprimer d'autres erreurs potentielles(insertion...etc...), c'est tester 2 champs de deux tables différentes, et je m'amuse avec phpmyadmin a mettre plusieurs choses dedans pour tester. Du coup quand ca marchait j'etais content mais pour valider je mets du texte completement différent et la comparaison me mets toujours oui ?
$con = mysql_connect('localhost', 'root', 'motdepassebidon');
if (!$con)
  { die('Could not connect: ' . mysql_error()); }

mysql_select_db("bdd", $con);
//mysql_query("SET NAMES 'utf8'");
$sql="SELECT * FROM apports WHERE id = 396";

$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
  {

echo $row['message'];
echo "<br /><br /><br /><br /><br /><br /><br /><br />";

  }

$sqldeux="SELECT * FROM originaux  WHERE id = 6";
$resultdeux = mysql_query($sqldeux);
while($rowdeux = mysql_fetch_array($resultdeux))
  {
echo $rowdeux['texte'];
}
echo "<br /><br /><br /><br /><br /><br /><br /><br />";

if ($row['message'] == $rowdeux['texte'])
{echo "oui";}
else 
{echo "non";}
Je ne comprends plus ...

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 20:13
par xTG
Utilises la fonction var_dump() pour afficher tes deux variables.
Cela te donneras le contenu mais aussi le type et dans le cas d'une String le nombre de caractères (affichages ou non).

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 20:16
par niconiconico
Je viens d'essayer le var_Dump()

Il m'affiche les deux strings avec un nombre different, mais ma comparaison me dit toujours "oui" c'est a dire que les chaines sont pareilles... enfin je crois ?

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 20:18
par xTG
Quelles sont les deux chaînes que tu testes ?
Essaies avec la fonction strcmp sinon.

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 13 août 2013, 20:33
par niconiconico
Je viens d'essayer strcmp()

Les chaines que j utilise pour l exemple, je viens d'essayer celui la, car j'ai des problemes de saut de ligne :
--------------------------------------------------------------------------------------------------------------------------------
Bonjour mon nom est Nicolas,

Je fais des tests mais j'ai un problème de saut de lignes dans ma base....

Voilà le texte en question.
--------------------------------------------------------------------------------------------------------------------------------

Via Phpmyadmin j'ai mis le meme texte dans mes deux champs qui sont des "longtext" en UTF8_unicode_ci...

Le strcomp me sort tout le temps 0.... Cette fois-ci meme si j'enleve les sauts de lignes

Re: Pb de comparaison de données d'une textarea avec un cham

Posté : 14 août 2013, 07:04
par moogli
Bon allé j'arrête de faire le boulet.

Oui c'est toujours vrai car tu utilise un while sur le mysql_fetch_assoc.
Dans ton cas le jeux de résultat ne contient qu'un tuple mais le while execute la condition deux fois.
Le while c'est "tant que".
Donc la tant que l'évaluation de ($data = mysql_fetch_assoc($result)) != false j'effectue ce qu'il y a dans la boucle.
La première fois tu les données du résultat ensuite, autre évaluation mysql_fetch_assoc n'a pas d'autre résultat elle retourne false du coup $data === false.
Le phénomène est le même sur les deux boucles donc au final tu compare false avec false ce qui est toujours vrai ;)

Donc la solution c'est de virer les whiles qui n'ont aucun intérêt vu que tu ne récupère qu'un seul tuple a chaque fois.
Au final tu garde juste les deux mysql_fetch_assoc (fetch_array c'est le même comportement sauf que tu a les indexs numériques en plus).

Sinon, comme l'indique xTG, lorsqu'il se passe quelque chose que tu ne comprend pas il faut débogguer.
Pour cela, basiquement, tu ajoute des var_dump un peux partout là où tu souhaite connaître la valeur d'une ou plusieurs variables.

La solution de compete c'est d'utiliser un deboggueur (par exemple xdebug) avec un IDE (éclipse, netbeans etc). La tu auras accès a toutes les variables c'est extrement pratique.

@+