Quelles sont les bases pour créer un site dynamique?

WRInaute passionné
Bonjour,

J'essaye depuis près de 2 semaines de me créer un site web dynamique géré uniquement avec php+ base de données.

Malgré plusieurs tentatives, je me retrouve toujours bloqué au niveau de la transmission de variable par l'url. Sinon dit, soit à cause du titre de la page, soit à cause du nom de la catégorie.
Celles si sont stockés en bd et contient forcément des caractères accentués, des apostrophes, des espaces ou autre lettre comme le "ç"... bref le résultat est que je finit toujours par obtenir des url pourrit avec des (r%E9f%E9) et j'en passe :x !
J'ai tenté le rewriting mais sans grand succès et de toute façon vue le titre transmit, il m'est impossible de récupérer les données par la suite.
Par exemple pour un titre transmit qui serait "création d'un site dynamique" je vais obtenir une url du genre .../page.php?titre=cr%C3%A9ation+d'un+site+dynamique
Je fait comment après, je case des str_replace() partout :?:
Et pour rewriter sa .. c'est possible :?:
Bon je suppose qu'il me manque quelque chose mais je ne sais pas quoi !!
----------------------------------------------------------------------------------

Pour continuer:
Supposons une page nommé page_site.php .
Je transmet l'id par url soit page_site.php?id=2427 qui fait correspondre au titre "Création d'un site dynamique".
Un coup de rewrite:
Code:
RewriteRule -s([0-9]*)\.html$  page_site.php?id=$1 [L]
L'url obtenue donne alors ../creation-d-un-site-dynamique-s2427.html

Qu'est ce qui fait que j'obtient le titre dans l'url de la page alors que je transmet uniquement l'id :?:

J'aimerais vraiment comprendre pour avancer ...merci.
 
WRInaute accro
Ben, le lien qui fait appel doit surement etre de la forme
Code:
<a href="/creation-d-un-site-dynamique-s2427.html ">blalabla</a>
... non ?
 
WRInaute passionné
Heuuuu .. c'est blindé de fonction que je ne comprend pas !!
Ce que je ne pige pas:
Quand on transmet une seule info par url soit l'id "page_site.php?id=2427" pour trouver les informations du site, comment peut on se retrouver ensuite après rewriting avec 2 infos soit le titre+l'id dans l'url ? L'id, ok puisqu'elle est transmise mais le titre ... ? On ne peut rewriter que ce qui est transmit ..non ?

Et pour la première partie, une solution, une suggestion ?
Merci
 
WRInaute accro
oui, on ne peut réécrire que ce qui est transmis, donc le titre de la page est transmis par le bout de code qui crée ton lien HTML.

Pour la première partie, fais des recherches sur url_encode() en php
 
WRInaute passionné
nickargall a dit:
oui, on ne peut réécrire que ce qui est transmis, donc le titre de la page est transmis par le bout de code qui crée ton lien HTML.

Pour la première partie, fais des recherches sur urlencode() en php
J'ai regardé cette fonction qui dit que sa remplace les caractères non alpha-numériques en % suivi de deux chiffres hexadécimaux et les espaces par des +.
Code:
$titre=urlencode($titre);
Donc si je transmet le titre "création d'un site dynamique" par url avec cette fonction soit page.php?titre=cr%C3%A9ation+d'un+site+dynamique, je vais pouvoir récupérer ensuite mon titre telle qu'il l'est au point de départ soit "création d'un site dynamique" avec la fonction urldecode() ?
D'autre part, peut on rewriter ce genre d'url sachant que sa donnera un truc du genre
Code:
...
<a href="'.$titre.'.php">blalabla</a>
...
Qui donnera:
<a href="cr%C3%A9ation+d'un+site+dynamique.php">blalabla</a>
:?: :?:

webmasterlamogere a dit:
le plus simple est de récupérer le titre à partir de l'id dans la base de données.
Je veux bien que tu m'explique parce que la je suis largué..
Sa sous entend qu'il faut récupérer le titre de la page pour ensuite pouvoir le transmettre :?:
Merci
 
WRInaute accro
Bon on reprend :

- ta page A affiche un lien
Code:
<?php
echo '<a href="'.$titredelanews.'-".$iddelanews".">lablabla</a>';
?>
Pour que $titredelanews passe bien dans l'URL, faut y virer ou remplacer tout caractère spécial et accents au préalable (et les tirets aussi, on a besoin qu'y en ait qu'un pour la suite) .

Ensuite, ta règle de réécriture:
Code:
RewriteRule  ^(.*)-([0-9]*)\.html$  page_site.php?id=$2 [L]
...fera que ta page B de destination récupérera l'id passé dans l'argument, ce qui te suffira à trouver le contenu correspondant.
En bref, on se moque de récupérer le $titredelanews dans l'URL, on récupere que $2 qui correspond à la variable php $iddelanews.

Ce que Lamogere veut dire, c'est qu'il ne faut pas essayer de récupérer le titre de la news depuis celui qui est passé par l'URL, mais faire sur la page B une requete SQL sur l'id de la news (que tu récupères facilement) pour ressortir le titre du contenu que tu cherches.

Il te reste plus qu'à trouver une fonction qui enlèvera tous les caractères pas beaux dans le code qui écrit le lien de la page A.

C'est plus clair ?
 
WRInaute passionné
il faut une table avec comme clé id et contenant une colonne titre
ainsi l'url un-url-avec-un-titre-01.html est rewritée en affiche_id.php?id=01 avec la règle :
Code:
RewriteRule ^(.*)-([0-9]*)\.html$ /affiche_id.php?id=$1 [L]
le script affiche_id.php récupère le titre dans la table a partir de l'id en paramètre et fait ensuite ce que tu veux.
 
WRInaute passionné
Je vous remercie pour vos réponses mais je dois avoué avoir du mal, alors je teste, je teste ...et j'ai mal au crane ^^.

Question peut être conne mais question quand même:
Peut on tester sa avec juste 3 fichiers sans passer par sql genre index.php contenant :
Code:
<?php
$titre="création d'un site dynamique";
$id="2477";
echo'<a href="page.php?titre='.$titre.'&id='.$id.'">'.$titre.'</a><br>';
echo'<a href="'.$titre.'-'.$id.'.php">'.$titre.'</a>';
?>
Une page "page.php" pour recup les données et le htaccess avec la règle:
Code:
RewriteRule  ^(.*)-([0-9])+\.php$  page.php?id=$2 [L]
:roll: :roll: :roll:
 
WRInaute discret
Salut,

Ne serait-ce pas plus simple de mettre dans la base un champs contenant un identifiant textuel qui n'aurait alors ni accents ni caractères spéciaux ?
 
WRInaute passionné
phpmikedu83 a dit:
mais un passage par là :

http://www.siteduzero.com/tuto-3-4-0-un ... c-php.html

ne serait pas si mal... Il ne faut pas être rebuté par le nom du site... Malheureusement, on ne naît pas en sachant programmer en PHP+MySQL
Houuu, je sent un ton narcissique la dessous :lol: ^^.
Je connais ce site et il est très bon... cependant il ne répond pas à mon interrogation. Moi ce qui me gène c'est le passage de variable contenant des accent,espace et autre caractère...
Si je fais un lien depuis mon menu:
Code:
$titre="création d'un site dynamique";
echo'<a href="page.php?titre='.$titre.'">'.$titre.'</a>';
Puis dans ma page de destination un truc du style $titre=$_GET["titre"]; et dans ma requête de récupération je fait un ("SELECT $titre FROM mon_champs WHERE titre=$titre") je me retrouve forcément n*ké puisque je vais me retrouvé avec des caractères bizarre dans l'url !
J'ai l'impression de ne pas me faire comprendre .. c'est le cas ?
J'ai beau utiliser urlencode et tout ce qui sens suis, mon titre transmit par url n'ai jamais le bon :? .
Bon, suite à sa, je veux passer une couche de rewriting pour obtenir une zolie url !
La seule solution que j'ai trouvé est d'ajouter un nouveau champ qui enregistre le titre en remplacent tout ce qui m'ennuie avec la fonction str_replace() de façon à obtenir un titre du genre creation_d_un_site_dynamique .

Je ne suis pas contre un dessin ou un exemple concret :lol:
 
WRInaute accro
Tu ne pourras pas récupérer un zouli titre en le récupérant depuis l'URL, vu que les caracteres spéciaux et les caracteres accentués auront été traités par les fonctions faites pour les modifier. et donc tu ne pourras pas récupérer un article de ta base de données en te basant sur ce titre modifiée passée dans l'URL.

Il te faut donc récupérer le contenu de l'enregistrement voulu dans ta base à partir de l' id que tu transmets par l'URL.

A partir de cet 'id' qui est unique, et que tu récupères facilement par l'URL, ben tu récupères l'enregistrement de la base de données qui correspond à cet ID. Ya pas plus simple.
Code:
$select="SELECT `id`,`titre`, `article`, [... tous les champs que tu veux récupérer...]  FROM ma_table WHERE `id`=$id";
$result=mysql_query($select);
$row=mysql_fetch_array($result);
$titre=$row['titre'];

C'est le contenu de la base de données qui te donnera ton $titre, et non ce qui passe dans l'URL.
Bon bien sur si le titre n'est pas présent dans l'enregistrement de la base de données, c'est rapé.

Précision : Le passage du titre modifié dans l'URL n'a quasiment jamais pour vocation à être récupéré; seulement à être présent dans l'URL de la page (histoire que cette URL comporte des "mots" qui avec un peu de chance sont des mots clés demandés par les internautes...

Mais bon c'est tellement peu important d'avoir des mots clés dans l'URL que tu pourrais t'en passer ... vu les soucis que ça te cause :)

Autre précision : tu parles d'utiliser la réécriture d'URL pour en avoir une jolie (d'URL :roll:), mais ce n'est pas le but de la réécriture d'URL. La réécriture va permettre au serveur de savoir que si tu appelles /une,zoulie,url-1.html ; il devra lui lancer la page /page.php?id=1. Le reste, "une,zouile,url " , tu t'en bats les steacks, comme disent les djeunes de mon patelin.T'as pas à la récupérer en $_GET, ça sert à rien.

d'ailleurs, la règle que je te proposais te permettait pas de récupérer le titre en $_GET, vu que ça sert à rien du tout :

Code:
RewriteRule  ^(.*)-([0-9])+\.php$  page.php?id=$2 [L]
ya qu'un paramètre dans la partie droite de la règle, et c'est l'ID, qui est la seule chose que tu aies besoin de récupérer dans l'URL (bon voilà je l'ai dit 3 fois, ca devrait aller cette fois ci :) )

Et pour finir pour aujourd'hui, un lien sur une discussion abordant la transformation de chaine de caracteres pour virer les accents et caracteres spéciaux :

https://www.webrankinfo.com/forum/t/resolu-str_replace-et-url.83127/

désolé je peux pas faire plus pour toi ... bon courage
 
WRInaute passionné
nickargall a dit:
Tu ne pourras pas récupérer un zouli titre en le récupérant depuis l'URL, vu que les caracteres spéciaux et les caracteres accentués auront été traités par les fonctions faites pour les modifier. ...
Bon au moins comme sa c'est clair!
nickargall a dit:
A partir de cet 'id' qui est unique, qui est relié au titre de l'article, et que tu récupères facilement par l'URL, ben tu récupères le titre associé .. à partir de la base de données.

$select="SELECT `id`,`titre` FROM ma_table WHERE `id`=$id";

C'est le contenu de la base de données qui te donnera ton titre, et non celui passé dans l'URL
Je suis daccord mais je vais me retrouver avec une url pourrit contenant uniquement l'id !

nickargall a dit:
Le passage du titre modifié dans l'URL n'a quasiment jamais pour vocation à être récupéré; seulement à être présent dans l'URL de la page (histoire que cette URL comporte des "mots" qui avec un peu de chance sont des mots clés demandés par les internautes...
Et bien justement, c'est ce que je veux faire. Je préfère avoir une url du style /mes-mot-clef.php que /125.php et forcement, c'est la dessus que je bute .
nickargall a dit:
Mais bon c'est tellement peu important d'avoir des mots clés dans l'URL que tu pourrais t'en passer ... vu les soucis que ça te cause :)
J'ai toujours crus comprendre le contraire ..:!:
nickargall a dit:
Enfin, tu parles de réécriture d'URL pour en avoir une jolie (d'URL :roll:), mais ce n'est pas le but de la réécriture d'URL. La réécriture va permettre au serveur de savoir que si tu appelles /une,zoulie,url-1.html ; il devra lui lancer la page /page.php?id=1.
Oui j'ai bien comprit sa mais je reste butté sur le faite qu'avoir une url contenant des mots clés en rapport avec le contenue de la page est important ...dailleurs sa ma toujours réussit de cette façon :p .
nickargall a dit:
Et pour finir pour aujourd'hui, un lien sur une discussion abordant la transformation de chaine de caracteres pour virer les accents et caracteres spéciaux :
https://www.webrankinfo.com/forum/t/resolu-str_replace-et-url.83127/
Je vais allez lire sa ... après ma nuit de sommeil ^^
nickargall a dit:
désolé je peux pas faire plus pour toi ...
C'est déjà pas mal :wink: , merci.

J'insiste un peut:Comment font alors les annuaires pour obtenir le titre du site dans la page alors qu'uniquement l'id est transmise ??
 
WRInaute impliqué
Code:
function filter($in) {
		$search = array ('@[B]@i','@[D]@i','@[F]@i','@[G]@i','@[H]@i','@[J]@i','@[K]@i','@[L]@i','@[M]@i','@[N]@i','@[P]@i','@[Q]@i','@[R]@i','@[S]@i','@[T]@i','@[V]@i','@[W]@i','@[X]@i','@[Y]@i','@[Z]@i','@[éèêëÊËE]@i','@[àâäÂÄA]@i','@[îïÎÏI]@i','@[ûùüÛÜU]@i','@[ôöÔÖO]@i','@[çC]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
		$replace = array ('b','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z','e','a','i','u','o','c','_','');
		return preg_replace($search, $replace, $in);
	}
Ca te permet de virer les caractères spéciaux et les majuscules ;)

Après pour tes url il te suffis de faire :
Code:
<a href="'.$data['id'].'-'.filter($data['titre']).'.php">
et hop, ça roule! (C'est le système mis en place sur mon www ;))
 
WRInaute accro
Argh tu fais exprès !

Dans la page d'arrivée, la récupération de l'ID permet SEULE d'aller trouver dans la base le titre de l'article ...

Et tu peux passer ton titre remodelé en propre ET l'identifiant dans l'URL ... mais tu n'auras besoin de récupérer QUE de l'identifiant pour afficher ton contenu sur ta page de destination ...

Je peux pas faire plus clair !
 
WRInaute accro
webmasterlamogere a dit:
C'est une caméra cachée?

Tu es sur de ta "Localisation: Planete terre"

j'ai un seul conseil : laisse tomber le rewriting

Non je sais, c'est un recruteur pour centre de formation en PHP pour les autodidactes repentants, il cherche à trouver le profil du gars qui peut expliquer clairement 5 fois la même chose sans s'énerver.

J'ai échoué :)
 
WRInaute passionné
Merci darkjukka :D , j'ai testé ton code et j'ai constaté que si le titre utilise une apostrophe genre "création d'un site", sa collait le mot au lieu de le séparer (creation-dun-site)..normal ou j'ai merdé ?

nickargall: j'en revient à cette petite phrase:
T'as pas à la récupérer en $_GET, ça sert à rien
Comment sa sa sert à rien? Si je transmet le titre+l'id par url, il faut bien que ma page "page.php" est quelque chose à récupérer pour pouvoir faire une SELECT * FROM ma_base WHERE id=$id ensuite... nan ?
Dans ce cas, il me faut bien un $id=$_GET["id"] pour fouiner dans la base ...ou je me suis encore planté 8O :?:
bon voilà je l'ai dit 3 fois, ca devrait aller cette fois ci Smile
Heuuu c'est pas sure sa :lol:

Pour le moment:
J'ai fais un petit teste en partant toujours du même titre (création d'un site dynamique) sur lequel j'utilise une fonction de transformation de chaine de caractères et un htacess de cette forme et sa fonctionne pour la page rewrité et non rewrité.
Code:
RewriteEngine on 

#Rewrite des pages
RewriteRule  ^(.*)-(.*)\.php$  /site/teste/page.php?titre=$1&id=$2 [L]
Par contre si j'ajoute un ligne pour des catégories:
Code:
RewriteEngine on 

#Rewrite des pages
RewriteRule  ^(.*)-(.*)\.php$  /site/teste/page.php?titre=$1&id=$2 [L] 

#Rewrite des catégories
RewriteRule  ^(.*)-(.*)\.php$  /site/teste/categorie.php?categorie=$1&id=$2 [L]
..bhin la version rewrité de la catégorie ne fonctionne pas!
Si je vous saoule .. sorry :lol: !
 
WRInaute accro
tryan a dit:
Merci darkjukka :D , j'ai testé ton code et j'ai constaté que si le titre utilise une apostrophe genre "création d'un site", sa collait le mot au lieu de le séparer (creation-dun-site)..normal ou j'ai merdé ?

nickargall: j'en revient à cette petite phrase:
T'as pas à la récupérer en $_GET, ça sert à rien
Comment sa sa sert à rien? Si je transmet le titre+l'id par url, il faut bien que ma page "page.php" est quelque chose à récupérer pour pouvoir faire une SELECT * FROM ma_base WHERE id=$id ensuite... nan ?

Relis moi :
"Le reste, "une,zouile,url " [...]T'as pas à la récupérer en $_GET, ça sert à rien. "
Je parlais tu $titre uniquement. Bien sur que tu dois récupérer l'ID. Je le dis avant.

Par contre si j'ajoute un ligne pour des catégories:
Code:
RewriteEngine on
#Rewrite des pages
RewriteRule  ^(.*)-(.*)\.php$  /site/teste/page.php?titre=$1&id=$2 [L]
#Rewrite des catégories
RewriteRule  ^(.*)-(.*)\.php$  /site/teste/categorie.php?categorie=$1&id=$2 [L]

..bhin la version rewrité de la catégorie ne fonctionne pas!
Ben évidemment, comment veux tu qu'il fasse la différence entre tes deux règles dont la partie "reconnaissance de l'URL appelée" est identique...

^(.*)-(.*)\.php$ (regle 1)
et
^(.*)-(.*)\.php$ (regle 2)

Ton serveur ne peut pas savoir si il doit envoyer vers la page catégorie ou la page article .. il te faut des schémas d'URL différents selon ce que tu veux appeler..
Un conseil, achète un bouquin, ou revois les bases de la réécriture avant de la tenter sur un site (je te cite ):
blindé de fonction que je ne comprend pas !!
 
WRInaute passionné
nickargall a dit:
Argh tu fais exprès !

Dans la page d'arrivée, la récupération de l'ID permet SEULE d'aller trouver dans la base le titre de l'article ...
J'aimerais bien faire exprès ... au moins j'aurai comprit!
Ceci dit, pour recup. les infos à partir de l'id, j'avais comprit.
nickargall a dit:
Et tu peux passer ton titre remodelé en propre ET l'identifiant dans l'URL ... mais tu n'auras besoin de récupérer QUE de l'identifiant pour afficher ton contenu sur ta page de destination ...
Ce que je ne pigeais pas, c'était comment obtenir en plus le titre proprement dans l'url ... maintenant c'est bon .. du moins presque.
webmasterlamogere a dit:
j'ai un seul conseil : laisse tomber le rewriting
Nannnnnn je veux pas :D , j'y arriverais, na!
 
WRInaute impliqué
tryan a dit:
Merci darkjukka :D , j'ai testé ton code et j'ai constaté que si le titre utilise une apostrophe genre "création d'un site", sa collait le mot au lieu de le séparer (creation-dun-site)..normal ou j'ai merdé ?
C'est normal, après tu dois pouvoir le modifier un peu pour qu'il te mette un "_" à la place, perso je l'ai pas fait car cela ne me gène pas outre mesure ;)
 
WRInaute occasionnel
Aaaahwaawwaaa le topic qui fait mal à la tête juste en le survolant. <<

Nickargall est vraiment patient, et sur le Site du zéro si tu fouilles dans leurs forums tu trouveras forcément ta solution.
Vu que tu avais répondu que tu ne trouvais pas la réponse à ton problème, c'est que tu ne dois pas l'attaquer dans le bon sens (ton problème).

Le plus simple quand t'as une difficulté, c'est hyper technique et je le fais à chaque fois que j'ai un problème : prendre une feuille de papier, un stylo, poser son cul dans une pièce en dehors de celle du PC et écrire son problème pour ensuite chercher une solution à ce problème.
Cela fonctionne à chaque fois, tu peux même faire des flèches pour montrer où vont tes donner, leurs intéractions entre elles, tout ça tout ça.

Prendre un peu de temps pour poser ces problèmes sur une feuille permet d'en éviter un bon paquet par la suite. :wink:
 
WRInaute passionné
Salut ^^, j'en remet une couche ...
darkjukka a dit:
Code:
function filter($in) {
		$search = array ('@[B]@i','@[D]@i','@[F]@i','@[G]@i','@[H]@i','@[J]@i','@[K]@i','@[L]@i','@[M]@i','@[N]@i','@[P]@i','@[Q]@i','@[R]@i','@[S]@i','@[T]@i','@[V]@i','@[W]@i','@[X]@i','@[Y]@i','@[Z]@i','@[éèêëÊËE]@i','@[àâäÂÄA]@i','@[îïÎÏI]@i','@[ûùüÛÜU]@i','@[ôöÔÖO]@i','@[çC]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
		$replace = array ('b','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z','e','a','i','u','o','c','_','');
		return preg_replace($search, $replace, $in);
	}
Ca te permet de virer les caractères spéciaux et les majuscules ;)

Après pour tes url il te suffis de faire :
Code:
<a href="'.$data['id'].'-'.filter($data['titre']).'.php">
et hop, ça roule! (C'est le système mis en place sur mon www ;))

J'ai un petit soucis avec cette fonction. Si j'utilise un mot comme "créer" il me renvoit soit 3 "e" soit un seul.
Selon le type d'encodage sa me donne:
cr&eacute;er donne "crer"
créer donne "crer"
cr&Atilde;&copy;er donne "creeer"

J'ai également testé la fonction présente ici https://www.webrankinfo.com/forum/t/resolu-str_replace-et-url.83127/ et la mes "é" sont remplacés par des "b", pourquoi svp ?
Merci
 
WRInaute impliqué
Euh ben là je ne peux pas t'aider, ce code marche sans aucun problème chez moi donc je ne vois pas d'où ce soucis pourrait venir :s
 
WRInaute passionné
Harggg , pas cool ^^ :( !
Chose bizarre, quelque que soit la fonction de ré écriture que j'essaye, j'ai le même soucis 8O donc sa vient d'autre part .. mais ou ?
 
Discussions similaires
Haut