sandrinoo Posté 27 Février 2014 Posté 27 Février 2014 Bonjour à toutes et à tous, je voudrais quand j'appelle ma base de données mysql, remplacer tous les espaces par rien . J'ai donc créé une fonction php : function fct($string){ $find = " "; $replace = ""; return(strtr($string,$find,$replace)); } que j'utilise comme ceci dans mon script php (notez que je ne souhaite pas intervenir directement sur la base avec phpmyadmin) : mysql_connect("$serv", "$user", "$mp"); mysql_select_db("$db"); $reponse = mysql_query('SELECT champs, fct(champs) FROM matable'); while ($resultat = mysql_fetch_array($reponse) ) { echo $resultat['champs'];} Cela ne modifie rien du tout. Où est le problème ? Merci d'avance si une personne se penche sur mon problème... sandy.
captain_torche Posté 27 Février 2014 Posté 27 Février 2014 Tu ne peux pas appliquer de fonction PHP dans une requête SQL. Il faudrait que tu modifies ton code comme ceci : mysql_connect("$serv", "$user", "$mp"); mysql_select_db("$db"); $reponse = mysql_query('SELECT champs, champs FROM matable'); while ($resultat = mysql_fetch_array($reponse) ) { echo fct($resultat['champs']);} Ou alors, comme il s'agit d'une fonction simple, tu pourrais écrire ta requête comme ceci : SELECT champs, REPLACE(champs, ' ', '') AS champs FROM matable
sandrinoo Posté 27 Février 2014 Auteur Posté 27 Février 2014 Merci une fois de plus Captain_torche ! Cela fonctionne nickel quand c'est un caractère style : SELECT champs, REPLACE(champs, 'u', '') AS champs FROM matable mais pas quand on veut traiter un espace blanc : SELECT champs, REPLACE(champs, ' ', '') AS champs FROM matable Pourtant quand j'affiche les données de ma base de données c'est bien un espace blanc qui sort dans le champs (idem quand je vais en direct sur la bd avec phpmyadmin).
Portekoi Posté 27 Février 2014 Posté 27 Février 2014 Tu dois le voir comme un caractère blanc alors que c'est surement un caractère "invisible" qui apparait comme un caractère blanc. Fais un copier/coller dans Notepad++ puis "View> Show Symbol > View all characters"
sandrinoo Posté 27 Février 2014 Auteur Posté 27 Février 2014 Merci d'apporter une réponse Portekoi. J'ai fait ce que tu m'as dit. Copier dans la BD mysql phpmyadmin le champs avec un espace puis coller dans notepad++ View> Show Symbol > View all characters Mais toujours un espace blanc. J'ai découvert que le champs était enregistré avec la fonction mysql_real_escape_string Peut-être est-ce à cause de cela ? Mais comment faire alors mon replace ?
captain_torche Posté 27 Février 2014 Posté 27 Février 2014 Que te donne cette requête dans ta base de données ? SELECT REPLACE('test de texte', ' ', '')
sandrinoo Posté 27 Février 2014 Auteur Posté 27 Février 2014 Captain, j'ai copié dans le sql de phpmyadmin ce que tu m'as donné, j'ai fait executer et j'obtiens bien testdetexte comprends pas pourquoi cela ne marche pas avec mon champs à partrir du php ?
sandrinoo Posté 28 Février 2014 Auteur Posté 28 Février 2014 (modifié) J'ai tout testé, comprends vraiment pas : - Les champs qui contiennent un espace blanc m'interdisent de faire un REPLACE dessus (à parir de mon script php) - même si je veux changer avec le replace un autre caractère que l'espace blanc (par exemple une lettre) - alors que sur les autres champs sans espace blanc, je peux changer n'importe quel caractère avec un replace Et curieusement un Update replace permet de changer l'espace blanc sur la base de données Phpmyadmin Quelqu'un voit la solution. Car moi je vais abandonner... PS : ah oui et même problème avec l'apostrophe ' Modifié 28 Février 2014 par sandrinoo
Portekoi Posté 28 Février 2014 Posté 28 Février 2014 Quel est l'encodage du champ dans ta base de données?
sandrinoo Posté 28 Février 2014 Auteur Posté 28 Février 2014 Merci Portekoi, voilà les données concernant ma base de données : MySQL connection collation : utf8_unicode_ci parametre affichage : francais table : type : MyISAM interclassement : latin1_swedish_ci
Portekoi Posté 28 Février 2014 Posté 28 Février 2014 Honnêtement, je ne vois pas pourquoi... Faudrait à limite que tu fasse un export de cette table des données dedans pour que je puisse tester. Mais c'est très bizarre.
sandrinoo Posté 28 Février 2014 Auteur Posté 28 Février 2014 (modifié) Portekoi, peut-être dois-je antislasher quand il y a un espace blanc dans le champ de ma BDD ? Ou un truc de ce genre ? Qu'en penses-tu ? Modifié 28 Février 2014 par sandrinoo
Portekoi Posté 28 Février 2014 Posté 28 Février 2014 Non non, l'espace n'est pas un caractère gênant. Pour moi, cela vient de tes données et de son type mais pourquoi, je ne sais pas. Pour ça que si tu peux, exporter la structure de ta table et les données qui ne fonctionnent pas, que je test...
sandrinoo Posté 28 Février 2014 Auteur Posté 28 Février 2014 Peut-être le type varchar ? champs varchar(90) latin1_swedish_ci (NULL)Oui (defaut)NULL
b0b0 Posté 5 Mars 2014 Posté 5 Mars 2014 Salut, le mieux serait que tu fasses un copier coller du contenu du "champs" qui te pose problème (celle de la base de données, dans laquelle tu cherches à remplacer l'espace par rien). Par exemple, si tu as une chaine de texte où tu vois que ton remplacement ne se fait pas, colle là ici b0b0
Anonymus Posté 6 Mars 2014 Posté 6 Mars 2014 Bonjour, Pour savoir quel est ce caractère, il faut que tu décomposes ta chaine de caractères, comme ceci par exemple : Pour une table 'toto' select right( toto, 1); puis select right( toto,2); etc, jusqu'à ce que tu arrives à afficher une lettre avant cet espace.A ce moment là, il faut que tu utilises les fonctions mysql 'ORD' (ou ASCII, peut être) pour décomposer ce qui reste comme caractères. Une fois que tu as le code ASCII du caractère qui t'embetes, alors tu refais ton REPLACE en appelant la fonction 'CHAR()' ! A ne pas oublier, ta table est encodée en latin, mais peut être que les données à l'intérieur ont été enregistrées en utf8 ( ou autre.. ) Et en utf, les caractères comptent double Voilà !
sandrinoo Posté 12 Mars 2014 Auteur Posté 12 Mars 2014 (modifié) Je pensais qu'en laissant reposer, je trouverais la soluce. Mais rien à faire. Bon je résume maintenant clairement la situation actuelle : 1. un replace (par le script php) sur un caractère normal de la bdd mysql fonctionne correctement (style changer le "a" en "e") 2. Mais impossible de faire un replace (par le script php) sur le moindre accent de la bdd mysql (style changer le "é" en "e") 3. alors qu'un "replace" accents directement via phpmyadmin marche nickel 4. pas de caractère "invisible" (test fait avec : Notepad++ puis "View> Show Symbol > View all characters") Je comprends pas. Donc je vous donne ci-dessous le script php : <?php mysql_connect("$serveur", "$user", "$mdp"); mysql_select_db("$db"); $reponse = mysql_query("SELECT prenom, REPLACE(prenom, 'é', 'e') AS prenom FROM XXXXXX "); while ($result = mysql_fetch_array($reponse) ) {echo $result['prenom']."<br>"; } ?> et la table avec le champ associé : -- http://www.phpmyadmin.net -- -- Version du serveur: 5.1.66 -- Version de PHP: 5.3.8 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- Base de données: `XXXXXXX` -- -- -------------------------------------------------------- -- -- Structure de la table `XXXXXXX` -- CREATE TABLE IF NOT EXISTS `XXXXXXXX` ( `prenom` varchar(90) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `XXXXXX` -- INSERT INTO `XXXXXXXX` (`prenom`) VALUES ('stéphane'); Si il y avait une âme charitable qui voudrait bien se pencher sur mes problèmes... En fait je cherche à éradiquer tous les accents. Modifié 12 Mars 2014 par sandrinoo
Dan Posté 12 Mars 2014 Posté 12 Mars 2014 A mon sens, ta table étant en "latin1", ton script php doit bosser en UTF-8 ... ce qui fait que les caractères accentués ne sont pas reconnus. Essaie avec ceci pour forcer la conversion de 'é' de UTF-8 vers iso Latin: $reponse = mysql_query("SELECT prenom, REPLACE(prenom, '". utf8_decode("é") ."', 'e') AS prenom FROM XXXXXX ");
sandrinoo Posté 12 Mars 2014 Auteur Posté 12 Mars 2014 Mon sauveur ! Viens là que je t'embrasse Dan ! Ca fonctionne ! C'est vrai que j'aurais pu y penser quand même... Et pour tous les accents en même temps, je fais un code du style : REPLACE(REPLACE(prenom, 'é', 'e') , 'ê', 'e') et ainsi de suite pour tous les accents... Tu connais Dan, une solution plus pratique et moins lourde que celle-là ?
Dan Posté 12 Mars 2014 Posté 12 Mars 2014 SI tu as iconv installé, tu peux transcrire une chaîne d'un jeu de caractère vers un autre, très facilement
Dan Posté 12 Mars 2014 Posté 12 Mars 2014 Et selon ta version de php (>=5.2.3) tu peux définir le jeu de caractères utilisé pour ta connexion avec mysql-set-charset() http://www.php.net/manual/en/function.mysql-set-charset.php C'est abandonné avec Php 5.5, mais dans ce cas tu devrais utiliser soit PDO_mysql soit mysqli
sandrinoo Posté 12 Mars 2014 Auteur Posté 12 Mars 2014 Je connaissais pas cette fonction et visiblement je l'ai. J'ai essayé plein de trucs du style : setlocale(LC_CTYPE, 'fr_FR.UTF-8'); $reponse = mysql_query("SELECT prenom, iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', prenom) AS prenom FROM XXXXX "); Mais ca fonctionne pas. Je sais que la base ICONV est bonne car ça fonctionne avec un echo si c'est pas mis dans un select.
Nicolas Posté 12 Mars 2014 Posté 12 Mars 2014 Bonjour, Il faut mettre 'fr_FR.utf8' comme valeur dans le setlocale (sous linux)
sandrinoo Posté 12 Mars 2014 Auteur Posté 12 Mars 2014 Merci Nicola, de mon côté, j'insert dans mon script cela : setlocale(LC_CTYPE, 'fr_FR.UTF-8'); echo iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'éèê'); // résultat : eee et cela fonctionne : les accents disparaissent. En fait mon problème est l'implémentation dans un select...
Nicolas Posté 12 Mars 2014 Posté 12 Mars 2014 Effectivement avec "fr_FR.UTF-8" cela fonctionne aussi. Désolé je pensais que ton problème venait de là ;-) Pourquoi tu ne ferais pas un select puis une conversion du résultat ensuite ?
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant