Aller au contenu
sandrinoo

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

Noter ce sujet :

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.


Partager ce message


Lien à poster
Partager sur d’autres 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

Partager ce message


Lien à poster
Partager sur d’autres 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).


Partager ce message


Lien à poster
Partager sur d’autres 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"


Partager ce message


Lien à poster
Partager sur d’autres 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 ?


Partager ce message


Lien à poster
Partager sur d’autres 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 ?


Partager ce message


Lien à poster
Partager sur d’autres 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 '


Modifié par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres 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


Partager ce message


Lien à poster
Partager sur d’autres 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.


Partager ce message


Lien à poster
Partager sur d’autres 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 ?


Modifié par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres 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...


Partager ce message


Lien à poster
Partager sur d’autres 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


Partager ce message


Lien à poster
Partager sur d’autres 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à !

Partager ce message


Lien à poster
Partager sur d’autres 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.


Modifié par sandrinoo

Partager ce message


Lien à poster
Partager sur d’autres 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 ");

Partager ce message


Lien à poster
Partager sur d’autres 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à ?


Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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


Partager ce message


Lien à poster
Partager sur d’autres 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.


Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,



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


Partager ce message


Lien à poster
Partager sur d’autres 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...


Partager ce message


Lien à poster
Partager sur d’autres 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 ?


Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×