Nous ne répondons seulement qu'aux sujets dont l'auteur a complété sa signature [Lire]



Vous avez des soucis avec votre Opencart v1.5.x, nous pouvons résoudre vos problèmes,
contactez le Bureau France !

par tel: 0 891 690 175 ou par
email

Fonction PHP MySql = UCFIRST / UCWORDS

Soutien général pour les problèmes techniques avec OpenCart

Fonction PHP MySql = UCFIRST / UCWORDS

Messagepar LIVING » 04 Juil 2014, 12:43

Bonjour,

Je sèche sur cette variable PHP qui dans une requête MySql n'est pas reconnue.
Il s'agit de "UCFIRST" qui doit permettre de mettre dans une chaine de caratère une Majuscule à chaque mot., dont ma requête est formulée comme suit :

UPDATE oc_product_description SET name = UCFIRST(name);

Mais cela me répond :

ERROR #1305 - FUNCTION xxxxxx_eshop.ucfirst does not exist

Comment dois je formuler la requête pour arriver à mes fins ?

Merci de votre aide.

Jean Marc
Image

Sieù Nissart Men Bati - Nissa La Bella !
Opencart Version 1.5.6.1 - cKeditor V4.0
POLISHOP - Responsive Theme
Modules : vQmod V2.3.2 / Blog Manager V 1.3.2 / FrenchColissmo / French Chronopost / Paiement ATOS Sipps - Société Générale.
Exploitation : Version Apache 2.2.24 / Version PHP 5.3.25 / Version PERL 5.10.1
Hébergement : VPN via DECAD.fr Nice
Avatar de l’utilisateur
LIVING
Contrôleur
Contrôleur
 
Messages: 151
Inscription: 16 Juil 2013, 16:46
Localisation: Nice (06)

Re: Fonction PHP MySql = UCFIRST

Messagepar villagedefrance » 04 Juil 2014, 16:02

Salut JM,

UCFIRST est correct pour MySql, mais pas pour PHP apparement ... aprés avoir fait une petite recherche rapide sur le sujet.

UCFIRST est une fonction pour mettre en capitales le premier terme de la requête SQL, mais pas les suivant (UCFIRST = UpperCase First).

Pour PHP il semblerait que CAP_FIRST soit correct:
Code: Tout sélectionner
UPDATE users SET name = CAP_FIRST(name);


J'ai pas testé donc il te faudra vérifier si c'est bon.
Image
Site Web (en Anglais) : http://villagedefrance.net
Extensions pour Opencart, toutes versions, en Anglais et en Français.
Boutique basée sur Opencart v1.8.1 Overclocked Edition.
Site hébergé chez http://www.compila.com (UK)
Avatar de l’utilisateur
villagedefrance
Administrateur
Administrateur
 
Messages: 338
Inscription: 05 Avr 2013, 19:03
Localisation: Grande Bretagne

Re: Fonction PHP MySql = UCFIRST

Messagepar LIVING » 04 Juil 2014, 16:33

villagedefrance a écrit:Salut JM,

UCFIRST est correct pour MySql, mais pas pour PHP apparement ... aprés avoir fait une petite recherche rapide sur le sujet.

UCFIRST est une fonction pour mettre en capitales le premier terme de la requête SQL, mais pas les suivant (UCFIRST = UpperCase First).

Pour PHP il semblerait que CAP_FIRST soit correct:
Code: Tout sélectionner
UPDATE users SET name = CAP_FIRST(name);


J'ai pas testé donc il te faudra vérifier si c'est bon.


Non, non c'est bien dans mySQL que je formule ma requête.
Nan, C'est pas Bon... I Keep on searching....
Image

Sieù Nissart Men Bati - Nissa La Bella !
Opencart Version 1.5.6.1 - cKeditor V4.0
POLISHOP - Responsive Theme
Modules : vQmod V2.3.2 / Blog Manager V 1.3.2 / FrenchColissmo / French Chronopost / Paiement ATOS Sipps - Société Générale.
Exploitation : Version Apache 2.2.24 / Version PHP 5.3.25 / Version PERL 5.10.1
Hébergement : VPN via DECAD.fr Nice
Avatar de l’utilisateur
LIVING
Contrôleur
Contrôleur
 
Messages: 151
Inscription: 16 Juil 2013, 16:46
Localisation: Nice (06)

Re: Fonction PHP MySql = UCFIRST

Messagepar LIVING » 04 Juil 2014, 16:49

Bon je viens de faire cette requête qui fonctionne, pratiquement a 100% :

Code: Tout sélectionner
1 UPDATE oc_product_description
2 SET name = INSERT(name,1,1,UPPER(SUBSTRING(name),1,1)))

Je me trouve maintenant, avec le 1er mot dont la 1ere lettre est en majuscule. Sauf que dans ma chaîne j'ai plusieurs mots, qui caractèrisent la description, et que je souhaiterais trouver la fonction qui me permettrait d'en faire autant pour chaque mot dans la phrase .

EXEMPLE

Ce que j'ai à présent :
Shampooing lissant hydratant lipidium

Ce que je souhaite:
Shampooing Lissant Hydratant Lipidium


Conclusion il me faut le reste de la requête SQL pour que chaque 1ere lettre de chaque mot soit en majuscule. :geek:

Je pense être sur la voix du "Title Case SQL Function", told you, I keep on movin"
Image

Sieù Nissart Men Bati - Nissa La Bella !
Opencart Version 1.5.6.1 - cKeditor V4.0
POLISHOP - Responsive Theme
Modules : vQmod V2.3.2 / Blog Manager V 1.3.2 / FrenchColissmo / French Chronopost / Paiement ATOS Sipps - Société Générale.
Exploitation : Version Apache 2.2.24 / Version PHP 5.3.25 / Version PERL 5.10.1
Hébergement : VPN via DECAD.fr Nice
Avatar de l’utilisateur
LIVING
Contrôleur
Contrôleur
 
Messages: 151
Inscription: 16 Juil 2013, 16:46
Localisation: Nice (06)

Re: Fonction PHP MySql = UCFIRST

Messagepar LeorLindel » 04 Juil 2014, 21:35

Je te conseille d'utiliser UCWORDS plutôt que UCFIRST.
UCWORDS (capitalisation de la 1ère lettre des mots) n'étant pas une fonction utilisé par Mysql (mais utilisé par PostgreSQL), il te faut la créer pour ta base de données.

Pour ce faire il te faut injecter via l'onglet SQL cette syntaxe :
Code: Tout sélectionner
CREATE FUNCTION `ucwords`( str VARCHAR(128) ) RETURNS varchar(128) CHARSET latin1
BEGIN
  DECLARE c CHAR(1);
  DECLARE s VARCHAR(128);
  DECLARE i INT DEFAULT 1;
  DECLARE bool INT DEFAULT 1;
  DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';
  SET s = LCASE( str );
  WHILE i < LENGTH( str ) DO
     BEGIN
       SET c = SUBSTRING( s, i, 1 );
       IF LOCATE( c, punct ) > 0 THEN
        SET bool = 1;
      ELSEIF bool=1 THEN
        BEGIN
          IF c >= 'a' AND c <= 'z' THEN
             BEGIN
               SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1));
               SET bool = 0;
             END;
           ELSEIF c >= '0' AND c <= '9' THEN
            SET bool = 0;
          END IF;
        END;
      END IF;
      SET i = i+1;
    END;
  END WHILE;
  RETURN s;
END ||

DELIMITER ;
Tu devrais désormais voir apparaitre dans l'arborescence de ta BDD (menu de gauche), une branche nommée Fonctions où cette fonction va désormais figurer.

Il ne te reste plus ensuite qu'à injecter cette requête, toujours via l'onglet SQL
Code: Tout sélectionner
UPDATE oc_product_description SET name = ucwords (name)


Et Voilou ! ;)
Image
1 - A lire avant de poster un sujet
2 - Politique sur la signature.

Quand le sujet est résolu, pensez à ajouter la petite coche verte Image dans le titre initial en éditant votre premier message et non dans votre dernière réponse.
Merci


Toutes les extensions commerciales (templates ou modules payants) ne peuvent pas faire l'objet d'ouverture de sujet, prière de bien vouloir s'adresser au concepteur en cas de problème ou demande de renseignements.

Seul, on avance plus vite, à plusieurs on avance plus loin.
Avatar de l’utilisateur
LeorLindel
Administrateur
Administrateur
 
Messages: 4227
Inscription: 19 Fév 2010, 13:44
Localisation: Lutéce

Re: Fonction PHP MySql = UCFIRST

Messagepar LeorLindel » 04 Juil 2014, 23:21

Tu peux aussi créer la fonction INITCAP ( Cette fonction permet transformer en majuscule la première lettre de chaque mot d'une chaine de caractères) :
Code: Tout sélectionner
DELIMITER $$
DROP FUNCTION IF EXISTS `initcap`$$
CREATE FUNCTION `initcap`(x varchar(255)) RETURNS varchar(255) CHARSET utf8
DETERMINISTIC
begin
set @out_str='';
set @l_str='';
set @r_str='';

set @pos=LOCATE(' ',x);
SELECT x into @r_str;
while (@pos > 0) DO
SELECT SUBSTRING(@r_str,1,@pos-1) into @l_str;
SELECT SUBSTRING(@r_str,@pos+1) into @r_str;
SELECT concat(@out_str,upper(substring(@l_str,1,1)),lower(substring(@l_str,2)),' ') into @out_str;
set @pos=LOCATE(' ',@r_str);
END WHILE;
SELECT concat(@out_str,upper(substring(@r_str,1,1)),lower(substring(@r_str,2))) into @out_str;
return trim(@out_str);
end$$

DELIMITER ;
Et l'utiliser avec cette requête :
Code: Tout sélectionner
UPDATE oc_product_description SET name = initcap (name)


PS : Certains hébergeurs ne t'offre pas le privilège de créer des fonctions dans ta base de données.
Image
1 - A lire avant de poster un sujet
2 - Politique sur la signature.

Quand le sujet est résolu, pensez à ajouter la petite coche verte Image dans le titre initial en éditant votre premier message et non dans votre dernière réponse.
Merci


Toutes les extensions commerciales (templates ou modules payants) ne peuvent pas faire l'objet d'ouverture de sujet, prière de bien vouloir s'adresser au concepteur en cas de problème ou demande de renseignements.

Seul, on avance plus vite, à plusieurs on avance plus loin.
Avatar de l’utilisateur
LeorLindel
Administrateur
Administrateur
 
Messages: 4227
Inscription: 19 Fév 2010, 13:44
Localisation: Lutéce

Re: Fonction PHP MySql = UCFIRST

Messagepar LIVING » 05 Juil 2014, 06:13

Hola Marco, tu es plus rapide que moi j'ai effectivement créé une UDF (User Define Function) je vais corriger ce que j'ai fait en utilisant ta seconde requête.

Ci-dessous ce que j'ai injecté :
Code: Tout sélectionner
CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN

DECLARE @Index          INT
DECLARE @Char           CHAR(1)
DECLARE @PrevChar       CHAR(1)
DECLARE @OutputString   VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 1

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
    BEGIN
        IF @PrevChar != '''' OR UPPER(@Char) != 'S'
            SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
    END

    SET @Index = @Index + 1
END

RETURN @OutputString

END
GO


Merci pour votre aide toujours aussi précieuse.

Jean Marc
Image

Sieù Nissart Men Bati - Nissa La Bella !
Opencart Version 1.5.6.1 - cKeditor V4.0
POLISHOP - Responsive Theme
Modules : vQmod V2.3.2 / Blog Manager V 1.3.2 / FrenchColissmo / French Chronopost / Paiement ATOS Sipps - Société Générale.
Exploitation : Version Apache 2.2.24 / Version PHP 5.3.25 / Version PERL 5.10.1
Hébergement : VPN via DECAD.fr Nice
Avatar de l’utilisateur
LIVING
Contrôleur
Contrôleur
 
Messages: 151
Inscription: 16 Juil 2013, 16:46
Localisation: Nice (06)


Retourner vers Soutien Général

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron