Jump to content
sandrinoo

Remplacer en php un élément d'un champs mysql

Rate this topic

Recommended Posts

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.


Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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).


Share this post


Link to post
Share on other sites

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"


Share this post


Link to post
Share on other sites

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 ?


Share this post


Link to post
Share on other sites

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 ?


Share this post


Link to post
Share on other sites

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 '


Edited by sandrinoo

Share this post


Link to post
Share on other sites

Quel est l'encodage du champ dans ta base de données?

Share this post


Link to post
Share on other sites

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


Share this post


Link to post
Share on other sites

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.


Share this post


Link to post
Share on other sites

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 ?


Edited by sandrinoo

Share this post


Link to post
Share on other sites

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...


Share this post


Link to post
Share on other sites

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


Share this post


Link to post
Share on other sites

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à !

Share this post


Link to post
Share on other sites

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.


Edited by sandrinoo

Share this post


Link to post
Share on other sites

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 ");

Share this post


Link to post
Share on other sites

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à ?


Share this post


Link to post
Share on other sites

SI tu as iconv installé, tu peux transcrire une chaîne d'un jeu de caractère vers un autre, très facilement ;)

Share this post


Link to post
Share on other sites

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.


Share this post


Link to post
Share on other sites

Bonjour,



Il faut mettre 'fr_FR.utf8' comme valeur dans le setlocale (sous linux)


Share this post


Link to post
Share on other sites

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...


Share this post


Link to post
Share on other sites

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 ?


Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...