supprimer espaces et sauts de ligne

Eléphanteau du PHP | 34 Messages

24 janv. 2009, 08:38

Bonjour,

J'ai un formulaire comportant plusieurs champs dont un textarea pour des commentaires. Je récupère tout ça et le mets ensuite dans une bd mysql.

Mon problème est que si l'utilisateur met plusieurs espaces entre les mots et/ou des sauts de ligne dans son texte, ceci se retrouve dans ma bd ce qui me pose problème plus tard, quand je récupère ce champs. J'aimerai donc supprimer tous ces espaces et sauts de ligne. J'imagine qu'il faut que je fasse cela *avant* de l'insérer dans la bd. Or je ne vois pas comment faire cela *simplement*.

Avez-vous une idée ?

Merci d'avance

Eléphant du PHP | 447 Messages

24 janv. 2009, 09:08

situsupprimestouslesespacesçavafairecommeça...c'estpastrèspratique,non?
Probably (only a) Human Problem?

Eléphanteau du PHP | 34 Messages

24 janv. 2009, 09:27

Bien vu ;-)

J'ai évidemment oublié de préciser que je voulais supprimer tous les espaces *en trop*. Donc je veux une longue chaîne de mots séparés par *un* espace et plus de saut de ligne.

Va mieux comme ça ?

Eléphant du PHP | 447 Messages

24 janv. 2009, 09:40

tu pourrais montrer ton code d'insertion dans ta bdd?
Probably (only a) Human Problem?

Eléphanteau du PHP | 34 Messages

24 janv. 2009, 09:46

Tout bête :

Code : Tout sélectionner

$sql = "insert INTO ar_order ( ID_AR_ORDER, ORDER_DATE, AR_QUANTITY, REMARK, ID_CLIENT, USER_ID ) values ( '', '".$date."', '".$ar_qty."', '".$remark."', '".$id_client."', '".$user_id."' ) ";

Eléphant du PHP | 447 Messages

24 janv. 2009, 11:22

J'imagine que le champ qui te pose problème est REMARK, issu d'un textarea sans doute (c'est à partir d'un formulaire?)?! tu ne fais aucun traitement sur ce champ ?

tu peux montrer le reste du code?
Probably (only a) Human Problem?

Mammouth du PHP | 991 Messages

24 janv. 2009, 11:49

Essaye un trim(), ca devrait normalement t'aider ou du moins te lancer sur une piste ;)

Source : http://fr.php.net/manual/fr/function.trim.php

Bye Hawk
DevOps, Symfony4, Hoa

Eléphanteau du PHP | 34 Messages

24 janv. 2009, 15:28

J'imagine que le champ qui te pose problème est REMARK, issu d'un textarea sans doute (c'est à partir d'un formulaire?)?! tu ne fais aucun traitement sur ce champ ?
Exact. Et non je ne fais aucun traitement pour le moment (c'est toute la question justement).

J'ai remarqué en testant que dans la bd (via phpmyadmin), le champ remark (varchar(255)) est entré exactement comme dans le textarea, ce qui ne me va pas car plus loin dans le code, je fais une requête sur cette table pour en extraire ces champs et les mettre dans un tableau qui doit pouvoir ensuite être traité dans un tableur. Et avec ce champs remark, le problème est que dès qu'il y a un saut à la ligne ça décale les colonnes (j'ai du texte par exemple dans la colonne quantity). Et évidemment ça ne va pas comme ça. Il faudra que je mette des guillemets pour séparer les champs mais même en faisant ça, ça ne changera pas le problème des espaces supplémentaires et des sauts de ligne. Tout ce dont j'ai besoin pour ce champ remark est un texte qui se suit sans rien de bizarre dedans. PLus tard, si nécessaire je pourrais toujours traiter cette chaîne.

Entre-temps j'ai essayé avec une regex avant d'insérer dans la bd :

$remark = preg_replace('/\s\s+/',' ', $remark);


J'ai fait quelques tests et ça semble presque marcher. Parfois j'ai une erreur de syntaxe dont je n'ai pas encore compris la source, mais on se rapproche. Je vais voir si trim() m'aide un peu plus ou pas.
tu peux montrer le reste du code?
Je pense que c'est inutile vu les explications données ci-dessus.

Merci d'avance

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 170 Messages

24 janv. 2009, 16:26

Bonjour,
<pre>
<?php
$txt = 'aaa bbb           ccc ddd eee          


    fff     ggg';

$txt = preg_replace('/  +/', ' ', $txt);
$txt = preg_replace('/[\r\n]+/', "\n", $txt);

echo $txt;

?>
</pre>

( Lorsqu'on insère des données dans une table, penser aussi aux "injections SQL" )

Eléphanteau du PHP | 34 Messages

25 janv. 2009, 08:50

Bonjour Blof et merci pour la suggestion. J'ai juste remplacé le "\n" par un espace ' ' car je ne veux pas de newline dans mon champ.

Ensuite j'ai fait quelques tests, plusieurs ont passé sans problème mais le dernier me sort l'erreur suivante :

Code : Tout sélectionner

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'espace un deux trois \b \n en encore du texte \n ici du text ', '69', ' at line 15
J'y ai mis un \b (pour voir hein) et un \n. A la ligne 15, je ne vois pas où se trouve le problème... ça doit être la ligne 15 "ailleurs"...

Et en ce qui concerne les injections SQL, j'ai "sanitarizé" tous les champs d'entrée par une regexp. N'étant pas un spécialiste, j'espère que ça suffira.

Merci d'avance

Eléphant du PHP | 170 Messages

25 janv. 2009, 12:50

je ne veux pas de newline dans mon champ.
dans ce cas c'est plus simple :
<?php

// ici la connexion au serveur et la selection de la base de données ( mysql_connect() + mysql_select_db() )

$txt = 'aaa bbb           ccc ddd eee          


    fff     ggg';

$txt = preg_replace('/\s+/', ' ', $txt);
$txt = mysql_real_escape_string($txt);

echo $txt;

?>
Pour éviter les injections SQL, on utilise mysql_real_escape_string().

Eléphanteau du PHP | 34 Messages

25 janv. 2009, 15:19

Merci ça marche très bien. Et merci aussi pour le conseil ; je crois qu'il va falloir repasser dans certaines parties du code ...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 janv. 2009, 15:39

Modération :
boobz, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 34 Messages

25 janv. 2009, 15:53

Voilà, désolé je n'y avais pas pensé.