8792 sujets

Développement web côté serveur, CMS

Pages :
Bonjour.

J'ai un petit probleme d'ordre technique.

Je suis en train de me faire un petit script qui me permet d'afficher un texte via une base de donnée (systeme de news ou Posts de forums).

J'ai une page index qui fait appel a ma fonction get_text($id) [récupère mon texte avec mon id= $id].

Jusque là aucun soucis, tout fonctionne; le language html est correctement interprété.

Maintenant si j'essayer d'apeller une fonction get_code($id) dans mon texte (donc dans la base donnée), la fonction get_code($id) ne fonctionne pas.

Les deux fonctions font a peu pres la meme chose, seulle la table où on récupère les données change.

J'en ai déduis qu'il n'interprétais pas le php via ma fonction get_text($id).

Si quelqu'un a une idée, je bloque dessus depuis hier soir.
Modifié par cazsan (02 Apr 2007 - 12:05)
Là difficile de répondre
il faut le code
il peut y avoir n'importe quoi derrière les fonctions

apparemment dans les 2 cas il s'agit de requête select
Modifié par alexiase (01 Apr 2007 - 13:40)
salut,
euuuuh, comme ça, sans voir comment tu stockes l'appel de la fonction, plusieurs petite choses

- n'aurais-tu pas un petit htmlentities ou specialchars qui transformerais tes caractères spéciaux genre <?php en &lt;?php auquel, côté serveur, rien n'est interprêté

-dis-toi que si tu va chercher ce qui est dans la base au moment de servir la page, ta fonction se retrouve côté client et ne fonctionnera donc pas... php fonctionnant côté serveur.

- si tout se passe bien côté serveur, es-tu sûr d'avoir bien entouré l'appel de ta fonction en plein texte des balises idoines <?php et ?> histoire que php sache qu'on a besoin de lui sur ce coup-là ?

etc, etc, le plus simple serait quand même un poil de code et de ton contenu à zieuter pour comprendre

have swing
Page index(sans l'entête html)

<?php 
include('geshi.php'); 
include('function.lib.php'); 

if (!isset($_GET['page']))
	{
		$page = '1';
	}
else
	{
		$page = $_GET['page'];
	}
get_text($page);
prev_next($page);
?>


Page function.lib.php

<?php
function get_text($id='')
	{
		require ('array.lib.php');
		connexion(''.$connexion[0].'', ''.$connexion[1].'', ''.$connexion[2].'', ''.$connexion[3].'');
		
		$requete = mysql_query("SELECT title, text FROM text WHERE id = $id") OR die('Erreur de requête MySQL');
		
		mysql_close();
		
		while ($resultat = mysql_fetch_row($requete))
			{
				$title = $resultat['0'];
				$text = $resultat['1'];
			}
		
		echo '<div id="titre">'.$title.'</div>';
		echo '<hr />';
		echo '<hr />';
		echo '<div id="milieu">';
		echo $text;
		echo '</div>';
		echo '<hr />';
		echo '<hr />';
	}
function get_code($id='')
	{
		require ('array.lib.php');
		connexion(''.$connexion[0].'', ''.$connexion[1].'', ''.$connexion[2].'', ''.$connexion[3].'');
		
		$requete = mysql_query("SELECT language, code FROM sources WHERE id = $id") OR die('Erreur de requête MySQL');
		
		mysql_close();
		
		while ($resultat = mysql_fetch_row($requete))
			{
				$language = $resultat['0'];
				$code = $resultat['1'];
			}
		
		echo '<div id="code">';
		echo '<span id="language">'.$language.'</span><br />';		
		geshi_highlight($code, $language);
		echo '</div>';
	}
function prev_next($id='')
	{
		require ('array.lib.php');
		connexion(''.$connexion[0].'', ''.$connexion[1].'', ''.$connexion[2].'', ''.$connexion[3].'');
		
		$id_m = $id-1;
		$id_p = $id+1;
		
		$requete = mysql_query("SELECT id, title FROM text WHERE id = $id") OR die('Erreur de requête MySQL');
		$requete_prev = mysql_query("SELECT id, title FROM text WHERE id = $id_m") OR die('Erreur de requête MySQL');
		$requete_next = mysql_query("SELECT id, title FROM text WHERE id = $id_p") OR die('Erreur de requête MySQL');
		
		mysql_close();
		
		while ($resultat = mysql_fetch_row($requete))
			{
				$id = $resultat['0'];
				$title = $resultat['1'];
			}
		while ($resultat_p = mysql_fetch_row($requete_prev))
			{
				$id_prev = $resultat_p['0'];
				$title_prev = $resultat_p['1'];
			}
		while ($resultat_n = mysql_fetch_row($requete_next))
			{
				$id_next = $resultat_n['0'];
				$title_next = $resultat_n['1'];
			}
		if (isset($id_next))
			{
			$link_n = '<a class="menu" href="index.php?page='.$id_next.'">suivant <span>Titre : '.$title_next.'</span><a>';
			}
		else
			{
			$link_n = '';
			}
		if (isset($id_prev))
			{
			$link_p = '<a class="menu" href="index.php?page='.$id_prev.'">précédent <span>Titre : '.$title_prev.'</span><a>';
			}
		else
			{
			$link_p = '';
			}
		
		echo '<div id="pied">';
		echo '<table width="60%">';
		echo '<tr><td>';
		echo $link_p;
		echo '</td></tr>';
		echo '<tr><td>';
		echo $link_n;
		echo '</td></tr>';
		echo '</table>';
		echo '</div>';
	}
?>


texte id=1

Voilà comment récupérer des informations dans une base de donnée et les afficher.
<br />
<br />
<?php get_code('1'); ?>


source id=1 language=php

		//Connection à la base de donnée//
		$connexion = mysql_connect("host", "login", "password") OR die("Erreur de connexion"); 
		//Selection de la base//
		mysql_select_db("nom_de_la_base_de_donnée") OR die("Sélection de la base impossible");
		$requete = mysql_query("SELECT une_colone, une_autre_colone FROM la_table_voulue") OR die("Erreur de la requête MySQL");
		//On arrete la connexion//
		mysql_close();


Voilà mes pages. l'include geshi.php sert seullement à colorer ma syntaxe.

Aparament, mon texte issue de get_text($id) passe coté utilisateur et plus serveur... le seul probleme est que je ne vois pas comment le garder coté serveur Smiley ohwell .
Modifié par cazsan (01 Apr 2007 - 14:25)
Euh... le but c'est 1) de récupérer du code PHP stocké sous la forme de texte dans une BDD et 2) d'exécuter le code en question ?

C'est possible ce genre de chose ? Smiley sweatdrop
(Si oui, j'aurai appris un truc aujourd'hui moi... Smiley murf )
Vérifie si la requête est OK pour get_code


pour ça tu peux remplacer temporairement le valeur $id
par un entier dont tu es sur que la valeur est bien dans la table
sources.

pour vérifier le résultat de la requête tu peux utiliser

juste avant le while tu fais

echo"<br />";
var_dump($resultat);
echo"<br />";

tu veras le contenu de $resultat.

de plus:
vérifie bien que le type de champ correspond bien à la forme utilisé dans ta requête.

exemple:
si id est du type char ou varchar (dans mysql) et que tu attaques la base avec un entier (ce qui est ton cas)
tu auras une erreur

Donc le type de id dans la table sources doit etre INTEGER

si ce n'est pas le cas

ta requete doit être du type

"SELECT language, code FROM sources WHERE id = \"$id\""
au lieu de
"SELECT language, code FROM sources WHERE id = $id"
Modifié par alexiase (01 Apr 2007 - 15:53)
Le champ id dans mes tables est un smallint.
Les fonctions une à une fonctionnent(dans l'index).

Si j'execute la fonction get_text('1'); il m'affiche mon texte hormis <?php get_code('1'); ?> et n'execute pas la fonction dite.

Si j'execute la fonction get_code('1'); il m'affiche mon code source correctement formatté.

En gros il veux pas executer la fonction get_code('1'); de la fonction get_text('1'); car la variable $text est passée coté utilisateur.

Le but de mon systeme est de pouvoir insérer x fois la fonction get_code('x'); dans une fonction get_text('1');[qui signifierai ici un article]

Par exemple :
Mon texte id=1
affichage du code id 1
on continue le meme texte
affichage du code id 2
Je termine mon article toujours avec mon text id=1

Le tout en ayant mes text id et code id dans deux tables séparées.
Modifié par cazsan (01 Apr 2007 - 16:42)
En clair
il faudrait un formulaire coté user pour récupérer les paramêtres
id pour get_code()?

cela dit
le get_text() est executer coté serveur

si ton get_text apele get_code et que le code ressort pas c'est que tu aurais besoin d'un renvoi user de valeur pour déclencher les get_code
auquel cas t'as structure n'est pas bonne si un seul get_text doit appeler plusieur get_code sans intervention ou avec un seul id qui a été transmit au get_text.
Les fonctions get_code('x') dans le texte id1 par exemple seront apellées par l'utilisateur. Je veux dire par là que c'est moi qui apelle certains id pour get_code(par exemple je vais ecrire : get_code('1'); mon texte get_code('2'); .L'id du texte n'apelle pas automatiquement certains id de code.

Tu me dis qu'il faut que je j'ai besoin d'un revoi user de valeur, mais comment faire ?
Modifié par cazsan (01 Apr 2007 - 18:24)
get_code c'est du code php ou code page (html) appelé en fonction de l'id que tu injectes par un echo ou un eval() ??
Si tu regardes dans les sources : get_code() est une fonction php.
L'attribut entre parenthèses permet de renseigner sur l'id à aller chercher dans la base de donnée.
La fonction affiche une table formatée contenant le code ainsi que son language(php/css/html/JavaScript/c/c#...).

echo '<div id="code">';
echo '<span id="language">'.$language.'</span><br />';		
geshi_highlight($code, $language);
echo '</div>';

geshi_highlight($code, $language); affiche le code selon le language.
Modifié par cazsan (01 Apr 2007 - 18:40)
Modérateur
bonjour,

..si ce que tu recupere dans la base de donnée est du code et que tu souhaite que ce code soit interpreté par le serveur il faut que tu passe par la case "fichier phisique ! ".

Ce qu'il faut que tu fasse alors , c'est de creer un fichier ou d'utiliser un fichier dedié a cette operation en lui injectant le resultat de ta requete , puis de le sauvegardé et ensuite de l'inclure avec un include() ou un require() afin qu'il soit interpreté par le serveur et integré a ton "ensemble" de script.
Une fois le script executé et devenu "obsolete ou inutile" il faut de preference editer/effacer le fichier .
ok
en clair tu passes 1 seul parametres
ensuite le get_text() pour avoir les code
il semblerai que si get_code est un "fils" de get_text donc get_code depend de get_text et que pour 1 id (get_text correspond plusieurs get_code) il faudrai faire un requete en une seule fois
avec des jointures

comme tu envoi 1 seul paramètre par formulaire
tu dois tout traitter en une seule fois
tu n'as donc le droit qu'a 1 seul traitement de plusieurs requetes si tu veux

sino tu dois renvoyer des info au serveur
par un formulaire ou en ajax (ce qui est pareil en realité)
Modifié par alexiase (01 Apr 2007 - 18:49)
La réponse de gcyrillus m'a l'air d'être la solution. Je vais de ce pas essayer ça.

Je vais créer un fichier temporaire qui contient le texte pour ensuite l'inclure avec un include().
ouaip sauf que ça deviens lourd

dans ce cas on utilise la fonction eval si elle est autorisée par l'herbergeur

donc genre

$a=get_code($id='');
eval($a);

en clair tu génères une chaine de caractère (string)

que tu execute grace a eval

sans pour autant créer de fichier sur le serveur et le detruire....
Modifié par alexiase (01 Apr 2007 - 19:11)
Je ne comprends pas tout a fait la fonction eval().

Pour ce qui est de créer un fichier temportaire et le supprimer par la suite, c'est ok et ça fonctionne.

fonction modifiée :

function get_text($id='')
	{
		require ('array.lib.php');
		connexion(''.$connexion[0].'', ''.$connexion[1].'', ''.$connexion[2].'', ''.$connexion[3].'');
		
		$requete = mysql_query("SELECT title, text FROM text WHERE id = $id") OR die('Erreur de requête MySQL');
		
		mysql_close();
		
		while ($resultat = mysql_fetch_row($requete))
			{
				$title = $resultat['0'];
				$text = $resultat['1'];
				touch("temp.php");
				$fp = fopen("temp.php","r+");
				fwrite($fp, $text);
				fclose($fp);
			}
		
		
		echo '<div id="titre">'.$title.'</div>';
		echo '<hr />';
		echo '<hr />';
		echo '<div id="milieu">';
		include ("temp.php");
		echo '</div>';
		echo '<hr />';
		echo '<hr />';
		unlink("temp.php");
	}


Avec ça, aucun soucis d'affichage; appel de fonctions illimité...

Je vais essayer de voir pour eval(), ça peut etre utile.
regarde ici

http://fr3.php.net/manual/fr/function.eval.php

eval — Exécute une chaîne comme un script PHP

eval(string);

ou string est une chaine de caractère
par exemple le contenu que tu mets dans temp.php


au lieu de créer un fichier contenant ton code
tu créés une variable contenant ton code
ensuite tu "execute ta variable" grace à eval


il faut juste verifier que ton herbergeur accepte la fonction eval


exemple:

echo"Hello world";

devient

eval("echo\"Hello world\";");

Travailler en mémoire plus rapide que d'intervenir sur le disque dur
sans compter que si deux personnes appelent le fichier en même temps que fais tu???

la mémoire est partitionnée en session mais pas le disque dur

si tu maintien la version fichier il faut utiliser la valeur de la session genre SID dans ton nom de fichier sinon deux appels à temp.php en même temps et zou une erreur



compréhensible??
Modifié par alexiase (01 Apr 2007 - 19:33)
Je vais essayer ce soir.

Je vais me pencher fortement sur ta solution meme si elle ne sera pas forcement utile dans mon cas (usage personnel).
Si je veux modifier mon script ce sera toujours utile. Je vous tiens au courrant dès que j'ai solutionné (ou non) la chose.

Merci pour les informations.
Modifié par cazsan (01 Apr 2007 - 19:39)
Après plusieurs essais non fructueux, je me résouds a demander à nouveau de l'aide.

mon erreur : Parse error: parse error in l:\web\mytutopage\function.lib.php(75) : eval()'d code on line 1

while ($resultat = mysql_fetch_row($requete))
	{
	$title = $resultat['0'];
	$text = $resultat['1'];
	$texte = eval ($text);
	}
		
	echo '<div id="titre">'.$title.'</div>';
	echo '<hr />';
	echo '<hr />';
	echo '<div id="milieu">';
	echo $texte;
	echo '</div>';
	echo '<hr />';
	echo '<hr />';


Une idée pour me guider? Car là, je sèche...
Modifié par cazsan (02 Apr 2007 - 00:11)
Pages :