8795 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je suis confronté à un problème un peu particulier.
J'ai une page PHP sur laquelle je veux afficher une constante qui a été définie auparavant :

define('CST', 'ma constante');


Pour l'afficher, un simple echo suffit, pas de problème jusque là :
echo CST; //Affiche "ma constante"


Maintenant, je voudrais que le texte à afficher sur ma page soit stocké dans une base de données (MySQL). Dans l'idél, je voudrais donc avoir un enregistrement avec simplement 2 champs, par exemple :

name | value
-----  ------------
test | Ceci est CST


Si j'ai une fonction PHP get_value($name) qui me permet d'obtenir le champ "value" de l'enregistrement dont le champ "name" est $name, j'aimerais alors pouvoir avoir le résultat suivant :

echo get_value("test"); //Affiche "Ceci est une constante"


Je n'arrive pas à obtenir ce résultat : je n'arrige qu'à afficher soit "Ceci est " soit "Ceci est CST"...

Avez-vous une idée de comment procéder pour obtenir ce résultat ?

Merci d'avance.

A+
Modifié par Alomon (18 Jun 2012 - 22:19)
xirt a écrit :
j'ai rien compris Smiley biggrin


J'ai pas osé le dire de peur qu'à la fin on me traite de rabat-joie. Smiley lol

Une règle à retenir :

Moi même a écrit :

Si tu n'arrives pas à exprimer ce que tu veux faire, tu n'arrivera jamais à le coder.

Modifié par jb_gfx (19 Jun 2012 - 00:58)
Oups, désolé, je pense que je suis trop plongé dans le truc, du coup je me suis certainement mal exprimé... Je vais tout reprendre ^^

J'ai une page include.php :

<?php
define ('CONSTANTE',"blabla');
?>


À côté, une autre page index.php :

<?php
require('include.php');
echo "Ma constante vaut : ".CONSTANTE;
?>


Déjà, là je pense qu'on est d'accord sur le fait qu'index.php affiche :

Ma constante vaut : blabla


=============================================================

On va maintenant un peu plus loin.
Le but est de ne pas afficher dans index.php un texte brut, mais un texte qui serait dans une base de données. Cependant, je veux toujours utiliser ma CONSTANTE.
J'ai donc une table Mysql définie comme précédemment (je pense que c'est clair, dites-moi si ce format de présentation ne convient pas) :

MaTable :

name | value
-----  --------------------
test | Ma constante vaut : CONSTANTE


Dans include.php, j'ajoute alors une fonction qui permet de taper dans la table :

<?php
define ('CONSTANTE','blabla');

get_value($name)
{
$query = mysql_query("SELECT value FROM MaTable WHERE name = '$name'");
return mysql_result($query, 0);
}
?>


Enfin, je modifie index.php pour utiliser cette fonction :

<?php
require('include.php');
echo get_value("test");
?>


Il est évident que index.php affichera simplement le texte :

Ma constante vaut : CONSTANTE


La question : comment faire pour qu'il affiche :


Ma constante vaut : blabla


en remplaçant "CONSTANTE" par sa valeur fixée dans include.php ?

J'ai essayé d'utiliser la fonction constant() notamment, sans succès...

N'hésitez pas à me dire où c'est pas clair (si c'est toujours le cas), je peux encore reformuler Smiley smile

Merci !
Modifié par Alomon (19 Jun 2012 - 02:21)
Sans remettre en cause le fait que ça marcherait peut-être avec une variable (je n'ai pas essayé), je ne vois pas pourquoi il ne faudrait pas utiliser une constante ici : dans l'esprit, "blabla" ne doit être modifié par aucun script, j'ai donc utilisé une constante...

En quoi l'ai-je utilisée "comme une variable" ? Est-il possible de la laisser constante tout en arrivant à mes fins ?
"blabla" c'est pas ta constante, c'est sa valeur. Ou alors tu t'expliques vraiment très mal. Ta constante c'est CONSTANTE et sa valeur est modifiée d'après ce que tu récupères depuis la base de données.
Modifié par jb_gfx (19 Jun 2012 - 02:05)
En effet, blabla est la valeur de la constante. C'est bien la valeur de la constante qui ne peut pas être modifiée, par définition d'une constante... Ce comportement est exactement celui que je souhaite : "blabla" doit rester "blabla" tout au long du script ; autrement dit, "CONSTANTE" doit toujours valoir "blabla".

En revanche, je voudrais utiliser le nom de la constante (donc CONSTANTE) dans du texte qui est en base de données, pour ensuite l'afficher par le biais de PHP.
Franchement c'est difficile de comprendre ta question, tu changes tes noms et tes valeurs à chaque exemple, tu mélanges php, mysql, et tu changes tout ça d'un post à l'autre.

a écrit :

La question : comment faire pour qu'il affiche :

Ma constante vaut : blabla


C'est ça que tu veux faire ?

define('CONSTANTE', 'blabla');

Ma constante vaut : <?php echo constant('CONSTANTE');

// affiche
// Ma constante vaut : blabla

Modifié par jb_gfx (19 Jun 2012 - 02:50)
J'avais lu un article sur ça :

Lors d'une requête sur un fichier php, un des premiers traitements serveur qui est fait est de remplacer les constantes par leurs valeurs déclarées. Seulement après le code php est exécuté (et à ce moment là, il n'en a rien à faire des constantes: il n'en existe plus pour lui). C'est donc normal que ça ne t'affiche que le nom de la constante et pas sa valeur.

A vérifier par les sources (pas le temps de les chercher), mais le comportement de ton code va dans ce sens.
Bonjour,

En effet, si ce comportement est vérifié, ça pourrait être ce qui bloque ici.
La solution serait-elle de passer le texte retourné par la requête dans une fonction eval ?

<?php
require('include.php');
eval(get_value("test"));
?>


Tout en remplaçant, dans ma table :

MaTable :

name | value
-----  --------------------
test | echo 'Ma constante vaut : '.CONSTANTE;


Ça ne me semble pas très propre, mais j'ai pu vérifier que ça fonctionne, ce qui corrobore l'idée d'un traitement des constantes fait en amont.

Merci encore de l'aide.


A+
Modérateur
Bonjour, pour stocker une variable dans une string, le mieux est d'utiliser printf/sprintf:

MaTable :

name | value
-----  --------------------
test | Ma constante vaut : %s


<?php

printf(get_value("test"), CONSTANTE);
?>
Bonjour,

En effet, cette méthode fonctionnerait aussi, mais il faut connaître a priori le nombre de constantes dans la chaîne ainsi que leurs positions, ce qui n'est pas mon cas : le texte en base de données pourra être modifié librement par un utilisateur via un formulaire de saisie.

C'est d'ailleurs ce principe qui me refroidit à l'idée d'utiliser eval() : étant donné que le texte sera libre, l'utilisateur pourrait facilement attaquer le site en entrant un code viral.
Modérateur
Dans ce cas, la seule solution est de définir ta syntaxe, puis de faire des remplacements à l'aide de str_replace ou une expression régulière.
Ouep, c'est aussi l'idée que j'ai en tête.
L'idéal serait de pouvoir remplacer directement toutes les constantes. Est-ce que PHP fournit un tableau contenant toutes les constantes définies ? Je n'en ai pas trouvé l'existence, mais sait-on jamais...

Sinon, ce que je pense faire, c'est, en gros :

- include.php
<?php
function add_constant($name, $value)
{
define(''.$name.'',''.$value.'')
array $CONSTANT_NAMES[] = $name;
array $CONSTANT_VALUES[] = $value; //À ce stade, je ne suis pas sûr de la syntaxe, mais l'idée est de lister le nom et la valeur de toutes mes constantes dans des tableaux
}

get_value($name)
{
$query = mysql_query("SELECT value FROM MaTable WHERE name = '$name'");
return mysql_result($query, 0);
}

add_constant('CONSTANTE','blabla');
?>


-index.php :
<?php
require('include.php');

$value = get_value("test");
$value = str_replace($CONSTANT_NAMES, $CONSTANT_VALUES, $value);

echo $value; //Devrait afficher "Ma constante vaut : blabla"
?>


Qu'en pensez-vous ?
De rien. Par contre, tu peux expliquer le but de ce que tu essais de faire ? Pour l'utilisateur j'entends. Parce qu'en fait ça me fait penser à un système de template ou tu proposes des valeurs prédéfinies. C'est ça ?
Le formulaire sera sur une partie Administration du site, donc réservé à ses administrateurs. Le but est de leur permettre de personnaliser ce qui est affiché sur une des pages du site (qui, elle, sera publique), tout en leur mettant à disposition des constantes prédéfinies.

Par exemple, lorsqu'un utilisateur se logge sur le site, je définis une constante appelée NAME qui contient son nom. Elle ne doit pas être modifiée, au risque de perdre la relation avec les données le concernant.

Je veux alors donner la possibilité aux administrateurs de pouvoir faire apparaitre la valeur de cette constante sur la page qu'il personnalise.

Edit : en gros, oui, c'est comme un système de template avec des valeurs prédéfinies. Si tu as d'autres techniques plus efficaces pour arriver au même résultat, je suis preneur Smiley cligne
Modifié par Alomon (19 Jun 2012 - 16:48)
Modérateur
Alomon a écrit :
Par exemple, lorsqu'un utilisateur se logge sur le site, je définis une constante appelée NAME qui contient son nom. Elle ne doit pas être modifiée, au risque de perdre la relation avec les données le concernant.

Oh, ce sont donc des constantes dynamiques. Mais pourquoi utiliser des constantes???
Au final tu souhaites mettre en place un système de placeholder. On préfixe les placeholder dans un texte généralement par des symboles incongrus: ( :MAVAR, $MAVAR, %MAVAR, #[MAVAR], etc.) Pour limiter les risques que l'utilisateur désires introduire un texte qui se trouve être un placeholder:
a écrit :

NOM: NOM

En fait dans ton code, tu n'en a plus vraiment besoin des constantes:
// define(''.$name.'',''.$value.'') cette ligne horrible ne sert à rien! (initialiser une constante avec une variable, c'est le comble!
array $CONSTANT_NAMES[] = $name;
array $CONSTANT_VALUES[] = $value;
Pages :