AccueilFAQBlogRechercherMembresGroupesS'enregistrerConnexion

Partagez | 
 

 Lifaen ? J'ai mal au PHP...

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Lifaen ? J'ai mal au PHP...   Ven 13 Juin - 21:07

Je code mon site en PHP, n'utilisant qu'une seule et unique page, stockant tout dans une BDD. J'avance bien, pourtant 2 questions me taraudent depuis toute la journée...


Premier problème

Toutes mes pages sont stockées dans les champ d'une table, et les 2 valeurs de chaque champ sont la version française et anglaise de la page. Aussi un lien pour naviguer d'une page à l'autre serait :
Code:
<a href="index.php?page=cible&amp;langue=fr">Ce lien mène à la page "Cible" en langue française.</a>
Cela dit je possède un bouton dont l'objectif est de pouvoir, à tout moment, changer la langue du site. J'aimerais que changer de langue ne ramène pas automatiquement à la page d'accueil, mais à la page actuelle.
Code:
<a href="index.php?page=?????&amp;langue=en">Ce lien en forme de drapeau du Royaume-Uni mène à la page actuelle en anglais.</a>
Qu'est-ce que je peux mettre à l'emplacement du tas de points d'interrogation ? $page ? Une balise <?php echo $page; ?> ? Autre-chose ? Je n'ai pas encore suffisamment avancé pour tester les deux premières options, mais ça m'aiderait vraiment d'avoir déjà la réponse quand j'y arriverai.


Deuxième problème

Mes pages étant stockées dans une BDD, ma manière de demander le champ d'une page précise est :
Code:
         <?php
         mysql_connect('localhost', 'root', '');
         mysql_select_db('nom_de_la_base');
         
         $requete = mysql_query('SELECT * FROM nom_de_la_table WHERE id=1') or die(mysql_error());
         $donnees = mysql_fetch_array($requete);
         
         if ($langue == 'fr')
         {echo $donnees['page_fr'];}
         elseif ($langue == 'en')
         {echo $donnees['page_en'];}
         
         mysql_close();
         ?>
J'aimerais que l'id ne soit pas bêtement "1" (ce qui n'est utile que lorsqu'on a qu'une page), mais la valeur d'une variable - en l'occurence mon $page de tout à l'heure. Le problème c'est la valeur de "id" est lue de manière très linéaire en SQL, et que "WHERE id=$page" sera lu "à la ligne dont le n° d'identification est la chaîne de caractères $page", et non pas la valeur de cette variable. Comment puis-je me débrouiller ?


Bref, des trucs rigolos. Merci par avance pour le coup d'oeil que tu vas jeter à mon message, et merci encore plus si tu connais la solution.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Lfaen + PHP = 1   Dim 15 Juin - 19:14

Bonjour,

Désolé de ne pas venir souvent sur ce forum, et je sais que je le devrais, mais bon.
Quoi qu'il en soit, je pense avoir réponse à tes questions...

Premier problème

Pour commencer, j'aimerais que tu me présente la structure complète de ta table pour que je puisse mieux t'aider.

Il est déconseillé d'utiliser la base de données pour contenir des pages complètes. En fait, c'est très très long à s'effectuer. Par exemple, pour une page d'accueil avec des nouvelles (universellement abrégé en "news"), il vaut mieux utiliser une table "news". En plus, entretenir une table qui comprend toutes les pages demande autant d'effort si ce n'est plus, que d'y aller avec ton Html tant chéri ET il n'est pas possible de mettre du PHP dans les pages en question, ce qui est bête. Il existe un moyen très efficace d'obtenir un meilleur résultat en moins d'effort : je t'en reparlerais plus tard, après avoir répondu à tes question...



Petit rappel : pour que le serveur comprenne que tu lui parle en php, il faut mettre les instructions, variable et tout le bazard en dans une balise php. Mettre $variable dans un lien de donnera rien.

Ainsi tu auras :
Code:
<?php
// voici un commentaire sur une ligne

/*Voici
Un commentaire sur plusieurs lignes*/

$variable = 'valeur de la variable';
echo $variable;
echo 'valeur de la variable';
?>
Ou :
Code:
<a href="index.php?page=<?php echo $variable; ?>&amp;langue=en">Ce lien en forme de drapeau du Royaume-Uni mène à la page actuelle en anglais.</a>



Petit rappel n°2 : Pour que le serveur sache que ton fichier contient du php, il faut que le fichier en question ait une extension en ".php". Ça peut paraître bête, mais je suis resté coincé un moment à cause de ce menu détail très important.



Petit rappel n°3 : Ton serveur doit savoir lire le php. Par extension, ton PC ne sais pas le lire. D'ailleurs quand tu demande à Mozilla Firefox de te lire un fichier en php depuis ton propre ordinateur, il te demande si tu veux télécharger le fichier indigeste pour lui. Pour y remédier, il faut un logiciel qui imite un serveur qui sait lire le php. Je cite Wamp et ZMSW.



Bon, je suppose que tu savais déjà tout cela mais un ou deux rappels ne fait jamais de mal.
Je ne sais pas où tu a appris le php mais je ne connais qu'un site valable : le fameux Site du Zer0 !
Il m'a fallu 2 ans pour apprendre le PHP et maitriser vraiment, il ne faut pas être pressé...



Revenons-en à la question...
Si tu mets le nom de la page dans le lien de ta page unique d'une manière qui ne t'est manifestement pas inconnue, tu peux le récupérer avec le php.
Dans une page dont le lien est "index.php?variable1=valeur1&amp;variable2=valeur2", il existera une variable superglobale :
$_GET['variable1'] qui vaut valeur1 et une variable $_GET['variable2'] qui vaut valeur2.
Attention néanmoins, si la valeur est modifiée dans le lien elle l'est aussi dans variable correspondante, source d'une faille que les hacker adorent. Il faut sécuriser les variables.

On va dire que ton lien ressemble à cela : "index.php?page=accueil&amp;langue=fr".
Le fameux bouton que tu veux faire sera :
"<a href="index.php?page=<?php echo $_GET['page']; ?>&amp;langue=en">Page version Anglich</a>.
Je n'ai pas sécurisé car en théorie, il n'y a aucun danger...

Je ne suis pas vraiment doué pour les explications mais tout est détaillé dans le tuto du SDZ. Que je te conseille de relire après avoir terminé de le lire deux fois.
(Et si j'ai oublié quelque chose dis-le moi Rolling Eyes )

Deuxième problème :
En fait tu peux utiliser la concaténation et faire :
Code:
$requete = mysql_query('SELECT * FROM nom_de_la_table WHERE id='. $page .') or die(mysql_error());
Et dans ce cas, $page sera remplacé par sa valeur. C'est tout.

Je vois que tu prends la peine de mettre "or die(mysql_error())", un excellent réflexe que je n'ai pas encore. Voila qui est parfait. Si tu commence comme ça, tu pourras vite me faire le même genre de remarque que je fais à mon frère : "Ferme cette balise, bon sang !" Very Happy

Voili, voilou.

PS: Il nous faudrait un moyen de communication un peu plus rapide si je veux pouvoir t'expliquer ma proposition, en fait le mieux serait de nous rencontrer... Mais je peux me contenter du forum bien sur...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Dim 15 Juin - 20:17

Tiens, voilà une question que je m'étais vaguement posée sans oser croire que la réponse me contrarierait vraiment : "Peut-on remplir les entrées d'une table avec du code php ? Non."

Bon ben inutile de te montrer ma table, je vais revoir l'architecture PHP/SQL de mon site, du coup (le XHTML/CSS est déjà au point, et aux normes du W3C). Je pensais qu'en stockant tout dans une seule BDD, ça m'aurait permi d'avoir les pages, leur titre et contenu (français et anglais) et leur date d'apparition (pour un encart "les 5 dernières MAJ"). Je relis plus en détail ton barda et je reposte. En tout cas, merci de t'être atardé sur mon cas ; c'est cool.


Dernière édition par Paladin le Dim 15 Juin - 20:25, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Le docteur arrive !   Dim 15 Juin - 20:20

Paladin a écrit:
Tiens, voilà une question que je m'étais vaguement posée sans oser croire que la réponse me contrarierait vraiment : "Peut-on remplir les entrées d'une table avec du code php ? Non." Bon ben je vais revoir l'architecture de mon site, du coup. Je relis plus en détail ton barda et je reposte. En tout cas, merci de t'être atardé sur mon cas ; c'est cool.

Atata, avant de confirmer une bétise, je vais verifier... Ok ?

Edit : Je pense que c'est impossible : la commande echo anihile la balise php. Seul le MySQl peut être effectué et seulement dans les bonnes conditions.

Re-Edit : En fait, c'est possible mais le mettre en pratique revient à demander à ton serveur de recalculer le nombre Pi à chaque fois que tu ouvres une page. Je pense que tu peux oublier ça.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Lun 16 Juin - 21:54

Mais je sais ce que ça vaut, Pi !

Ca vaut très exactement Π.

Bref, ce que tu veux dire, c'est que la mort en termes de temps de génération de la page côté client, et ça bouffe plus de bande-passante en Go/mois côté serveur.

Du coup d'après toi, comment fonctionne un site dont les liens affichent : http://www.judgehype.com/index.php?page=articles ? Avec des includes ? Si c'est le cas, l'un des trucs qui m'a freiné (et qui m'a fait utiliser une BDD sans autre forme de procès), c'est que je ne comprends pas encore la différence entre un include bien fait et un qui a une grosse faille de sécurité.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Pifaen   Mar 17 Juin - 15:03

Paladin a écrit:
Mais je sais ce que ça vaut, Pi !

Ca vaut très exactement Π.

Bref, ce que tu veux dire, c'est que la mort en termes de temps de génération de la page côté client, et ça bouffe plus de bande-passante en Go/mois côté serveur.
C'est exactement ça ! Il faudrait demander à ta bdd de te donner la page et de reproduire les instructions php de ta page une à une... Tu reprogramme php avec du php, en somme. Combien y a-t-il d'instructions en tout ? Aucune idée et je m'en tape. Mais en terme de bande passante, ça n'en utilise presque pas. Le problème c'est le temps d'exécution dû à un nombre énorme de vérification.

Paladin a écrit:
Du coup d'après toi, comment fonctionne un site dont les liens affichent : http://www.judgehype.com/index.php?page=articles ? Avec des includes ? Si c'est le cas, l'un des trucs qui m'a freiné (et qui m'a fait utiliser une BDD sans autre forme de procès), c'est que je ne comprends pas encore la différence entre un include bien fait et un qui a une grosse faille de sécurité.

Bien vu, c'est avec les include que les sites dont la structure est invariable fonctionnent. Pour en revenir aux include : mon site, le site du Zer0 et encore judgehype (à plus forte raison, vu que la structure est toujours la même) fonctionnent avec des includes.

"Tout code peut être sécurisé, tout est dans l'art et la manière de faire."
Lifaen

Une inclusion normale est sans danger : "include('fonction.php');". Ce code inclus fonction.php et puis c'est tout.
Une include sécurisée ou une include insécurisée vient du fait que le paramètre de la fonction est variable. "include($page);" est potentiellement dangereux car $page peut avoir plusieurs valeurs ('accueil.php' ou 'bdd.php' ou 'http://www.hack.net/virus.php'), le code inclus le fichier quel qu'il soit.
Je ne veux donc jamais, JAMAIS, JAMAAAAIIIIS voir : "include($_GET[page]);". *ARGH*
Si tu met le code :
Code:
if($_GET['page'] == 'page')
{
include('page.php');
}
Alors il n'y a aucun risque, il inclus page ou il inclus rien. *Ouf*

Et le plus drôle c'est que le code sécurisé est on ne peut plus simple.
Exemple :
Un lien pour un livre d'or : "index.php?page=livredor" et celle d'une page de connexion : "index.php?page=connexion".
Code:
 // Le code qui affiche la page
if($_GET['page'] == 'livredor')
{
include('livredor.php');
}

elseif($_GET['page'] == 'connexion')
{
include('connexion.php');
}

else // Sinon j'affiche la page d'accueil
{
include('accueil.php');
}

C'est aussi bête que ça. Et tu peux y aller ! C'est sécurisé, si tu ne te trompe pas : aucun risque.


Petite parenthèses :

  1. Le lien peut aussi être "?page=livredor", écrire index.php n'est pas nécessaire car si aucun fichier spécifique n'est demandé, c'est lui qui s'affiche.
  2. Le lien peut aussi être "index.php?livredor", c'est plus joli et ça fonctionne aussi avec le code suivant.
    Code:
    if(isset($_GET['livredor']))
    {
    include('livredor.php');
    }

    elseif(isset($_GET['connexion']))
    {
    include('connexion.php');
    }

    else // Sinon j'affiche la page d'accueil
    {
    include('accueil.php');
    }
  3. Tu peux combiner les deux. Personnellement, c'est comme ça que je fais.


Tuto sur les includes sécurisés et infinis !
J'ai une petite question, as-tu déjà vu les boucles (while par exemple) ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mar 17 Juin - 22:58

Ouaip, je vais m'en servir par exemple pour lister les 5 dernières MAJ en page d'accueil, ou effectuer un classement de films par note moyenne de critiques.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mer 18 Juin - 13:21

Paladin a écrit:
Ouaip, je vais m'en servir par exemple pour lister les 5 dernières MAJ en page d'accueil, ou effectuer un classement de films par note moyenne de critiques.

Dans ce cas, essaie donc de faire une boucle qui, à l'aide de ta table page, te permettra de lister les "if($_GET['page] == 'connexion')", pour faire court dans ton code. Je dis ça parce que j'en ai beaucoup des vérifications chez moi.

C'est pas compliqué et ça te fera un petit exercice Very Happy . Si tu n'y arrive pas je te donnerais la solution.

Bonne chance !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mer 18 Juin - 14:23

Sans faire appel à une BDD, c'est ça ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mer 18 Juin - 15:23

Paladin a écrit:
Sans faire appel à une BDD, c'est ça ?
Si, tu utilise ta bdd et ta table page qui contient tous les noms de tables et le nom du fichier correspondant. Tu charge tout et tu fait une boucle. Ensuite tu fais un script pour rajouter (dans la bdd) une page à ton site.

Tant que tu stocke pas la page elle même dans la bdd, y a pas de soucis.

Si tu arrives à faire tout ça, j'ai même un bonus. Il est possible de créer la page depuis le site avec un script, plus besoin de passer par le ftp pour créer la page. Mais chaque chose en son temps.

Bon modifie ta table page comme ceci :
id : auto_increment int 9
nom : varchar 255
chemin : varchar 255

Je suppose que j'ai pas besoin de te faire un dessin...


Dernière édition par Lifaen le Mer 18 Juin - 16:18, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Paladin

avatar

Nombre de messages : 1103
Date d'inscription : 25/05/2008

Feuille de personnage
Nom: Venceslas Iosef
PV:
9/11  (9/11)
Métier: Psychologue

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mer 18 Juin - 15:38

Mhhh, mais à partir du moment où j'appelle la bdd, que je stocke la page dans la table convoquée ou pas ne va plus changer grand chose en termes de temps de génération, si ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.vulgus.net
Lifaen

avatar

Nombre de messages : 42
Age : 24
Date d'inscription : 11/06/2008

Feuille de personnage
Nom: Gwaenael Lebihan
PV:
10/10  (10/10)
Métier: Geek

MessageSujet: Re: Lifaen ? J'ai mal au PHP...   Mer 18 Juin - 16:08

Paladin a écrit:
Mhhh, mais à partir du moment où j'appelle la bdd, que je stocke la page dans la table convoquée ou pas ne va plus changer grand chose en termes de temps de génération, si ?

Je ne te parle pas de stocker la page dans la base de données, mais de créer un fichier dans ton ftp et de l'inclure dans ta page normale. Les instructions php de la page s'exécutent normalement.

Oublie complètement le stockage de pages entière dans une bdd, c'est IRREALISABLE ! Mais il est possible de stocker le nom et l'emplacement de la page dans ta bdd, de créer la page avec un petit script, et de l'inclure en cherchant le nom et l'emplacement de la page dans ta page principale. Mais par pitié oublie ta solution première.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://elouan.p.c.free.fr/
Contenu sponsorisé




MessageSujet: Re: Lifaen ? J'ai mal au PHP...   

Revenir en haut Aller en bas
 
Lifaen ? J'ai mal au PHP...
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
AnswerPlace :: Bienvenue à Geekland :: Hardware, Software y tutti quanti-
Sauter vers: