8798 sujets

Développement web côté serveur, CMS

Bonjour, voilà je vous expose mon problème que j'ai cité dans un autre topic, mais apparement mieux vaut que j'en créé un nouveau... Alors pour faire simple :


J'ai une base de donnée avec une table "personnes" contenant comme données : "nom", "prénom", etc...

J'ai fait une page "personnes.php", et je souhaiterais que quand on tape "personne.php?nom=alsa&prenom=roger" on tombe sur la personne "Alsa Roger" avec sa fiche personnalisée (nom, prénom, détails...).

Le seul problème étant que je n'arrive pas à réaliser cette étape... Premièrement, je n'arrive pas à réécrire l'url dans mon script php, et deuxièmement je ne sais pas comment afficher sur ma page le "nom", "prénom" et "détails" correspondant à la personne affichée dans l'URL.

Quelqu'un pour m'aider ??


Merci. Cordialement, Smiley biggrin
Salut termi et bienvenue Smiley cligne ,

un petit exemple de comment faire :
<?php
$requete_effectuee = false;
if (!empty($_GET)) { // si les variables existent dans l'url
	$nom = isset($_GET['nom']) ? $_GET['nom'] : ''; // si le nom est renseigné on le récupère, sinon on met $nom à vide
	$prenom = isset($_GET['prenom']) ? $_GET['prenom'] : ''; // si le prenom est renseigné on le récupère, sinon on met $prenom à vide
	if ((!empty($nom)) && (!empty($prenom))) { // si les 2 variables sont renseignées
		require_once('tests/connexion.php'); // on se connecte à la bdd mysql
		if(get_magic_quotes_gpc()) {  // On annule les éventuels magic_quotes_gpc si ON.
			$nom = stripslashes($nom);
			$prenom = stripslashes($prenom);
		} 
		// On exécute la requête sécurisée
		$requete_effectuee = true;
		$sql = sprintf("Select id_personne, nom, prenom, details from personnes where nom = '%s' and prenom = '%s'",
					mysql_real_escape_string($nom),
					mysql_real_escape_string($prenom));
		$result = mysql_query($sql) or die(mysql_error());
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>test</title>
</head>
<body>
<?php
if ($requete_effectuee) { // Si la requête a été effectuée on affiche les éventuels résultats
	if (mysql_num_rows($result) > 0) {
		echo '<p>';
		while($personne = mysql_fetch_assoc($result)) {
			echo "Nom :\t".$personne['nom']."<br />\n";
			echo "Prénom :\t".$personne['prenom']."<br />\n";
			echo "Détails :\t".$personne['details']."<br /><br />\n";
		}
		echo '</p>';
	} else { // aucun résultat
		echo "Aucune personne ne s'appelle $nom $prenom.<br />\n";
	}
} else { // sinon on affiche le formulaire ?> 
<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<p>
<label for="nom">Nom :</label>
<input type="text" name="nom" id="nom" value="<?php echo $nom; ?>" />
<label for="prenom">Prénom :</label>
<input type="text" name="prenom" id="prenom" value="<?php echo $prenom; ?>" />
<input type="submit" />
</p>
</form>
<?php } ?> 
</body>
</html>

Si quelques fonctions te sont inconnues, tu peux aller regarder sur php.net. Comme par exemple mysql_real_escape_string.

A+ Smiley smile
Génial ! Smiley lol Effectivement j'ai appris pas mal de requêtes que je ne connaissait pas... Mais l'ensemble est clair, j'arrive à comprendre l'ensemble! Vraiment merci beaucoup!

La seule chose, c'est qu'au lieu d'afficher un formulaire, je préfèrerais afficher l'ensemble des personnes. Enfin ça c'est vraiment plus un problème!


Le seul problème qui me reste à règler, c'est le rewriting... Car évidement, j'aimerais maintenant que mes URL soient "www.monsite.com/personnes/NOM-Prénom/" donc je vais devoir toucher au fichier ".htacess".

J'ai essayé de marquer ce script :

RewriteRule ^personnes/([^-]*)-([^/]*)/$ personnes.php?nom=$1&prenom=$2 [L]


Mais ça ne marche pas... Je me suis trompé quelque part ?? Smiley confus
termi a écrit :
Je me suis trompé quelque part ?? Smiley confus
Pourtant ça semble correct Smiley rolleyes ...

Tu as bien Options +FollowSymlinks et RewriteEngine on avant ?

Sinon sur certains serveurs il faut noter
RewriteRule... [b][#blue]/[/#][/b]personnes.php?...
Tu pourrais aussi effectuer une recherche sur RewriteBase.

Et autresinon, personnellement j'aurais plutôt fais des url sous la forme www.monsite.com/personnes/NOM/Prénom/ pour ne pas louper les noms composés du genre Martin-Dupond Smiley murf !
Voilà mon fichier .htacess

ErrorDocument 500 /error.php
...

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^personnes/([^-]*)-([^/]*)/$ personnes.php?nom=$1&prenom=$2 [L]

Je comprends vraiment pas pourquoi ça ne marche pas... J'ai testé de cette manière

RewriteRule ^personnes/([^-]*)-([^/]*)/$ [b]/[/b]personnes.php?nom=$1&prenom=$2

Mais rien à faire... Ca ne marche pas!

Pourtant, les pages Errors sont bien redirigés donc si je ne me trompe pas ça vient pas d'une quelquonc invalidité du fichier .htaccess ?? C'est bien une erreur de script ??

Arf une erreur bête que je ne vois pas ? Smiley biggol Une autre erreur ? Ca m'embête tout ça!
Je ne connais pas la fonction RewriteBase... Comment dois-je l'utiliser ??

Sinon quand je tape "www.monsite.com/personnes/NOM-Prénom/" (avec un exemple concret et après avoir enlever les redirections d'erreurs dans le .htacess), je m'aperçois que la page me marque "Error 404 - The requested URL ...........public/www/personnes.php was not found on this server."

Pourtant cette page existe belle et bien évidement puisque c'est elle qui interprête mes variables! Bizarre, je suis perdu là! Smiley sweatdrop
termi a écrit :
Je ne connais pas la fonction RewriteBase... Comment dois-je l'utiliser ??
par exemple
...
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^personnes/([^-]*)-([^/]*)/$ personnes.php?nom=$1&prenom=$2 [L]

termi a écrit :
"Error 404 - The requested URL ...........public/www/personnes.php was not found on this server."
Euh... personnes.php est bien à la racine du site ?
Smiley eek Ah ben ça y'est, ça marche avec le RewriteBase / ! Et bien j'aurais jamais trouvé sans ton aide! Encore une fois, merci beaucoup!

Juste pour information, c'est quoi cette balise ? C'est une interprétation différente selon les srveurs ou ca va beaucoup plus loin ?... Car en checkant sur le net ça a l'air pour des trucs plus complexes que ça quand même no?!
termi a écrit :
Smiley eek Juste pour information, c'est quoi cette balise ? C'est une interprétation différente selon les srveurs ou ca va beaucoup plus loin ?... Car en checkant sur le net ça a l'air pour des trucs plus complexes que ça quand même no?!
Ben le mieux que je peux faire c'est de donner le lien vers la doc Apache car en fait je n'en ai encore jamais eu besoin sur OVH Smiley lol !
Dis donc ! Tu serais pas du genre tatillon Smiley biggol ?

Il me semble qu'il faut faire ça en 2 fois (faire une sauvegarde du htaccess avant Smiley lol !) :
...
Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !^monsite\.com [NC]
RewriteRule (.*)  http://monsite.com/$1  [QSA,R=301,L]
RewriteRule  ^fr/(.*)$ $1 [QSA,R=301,L]
RewriteRule ^personnes/([^-]*)-([^/]*)/$ personnes.php?nom=$1&prenom=$2 [L]

A+


Edit: sinon au sujet de RewriteBase je pense que c'est en rapport avec le chapitre "Attention aux répertoires virtuels" de cette page.
Modifié par Heyoan (05 Jun 2008 - 02:45)
Smiley biggrin Oui c'est vrai que j'suis très tatillon, merci beaucoup ! J'aime bien apprendre en fait !

D'ailleurs je suis en train de tester une dernière chose avec le rewriting... Je veux réécrire une seule variable en autorisant toutes les lettres (A à Z dont les minuscules et majuscules), tous les chiffres (0 à 9) et même les tirets (-). J'ai écris ça sous plusieurs formes, dont celle ci-dessous, mais ça ne marche pas.

RewriteRule ^articles/(-[a-z]*)/$ articles.php?url=$1 [L]


Là, je demande l'autorisation des tirets, puis des lettres, à l'infini. Mais même une variable du genre "ma-news" ne marche pas, comme "NEWS", ça ne marche pas, pourquoi ?? J'ai essayé aussi avec ce code :

RewriteRule ^articles/([^-]*)/$ articles.php?url=$1 [L]


Mais ça n'interprête pas les variables avec tirets, logique. Mais j'trouve pas la solution, faut dire que je suis pas un expert du language peerl. Que faut-il faire pour interpréter toutes sortes de lettres/chiffres/tirets ??

Merci encore pour ton aide promis après j'arrête avec ça! Smiley lol
termi a écrit :
Smiley biggrin Oui c'est vrai que j'suis très tatillon, merci beaucoup ! J'aime bien apprendre en fait !
Joli défaut Smiley ravi !

D'ailleurs grâce à toi je me suis sérieusement remis aux expressions régulières depuis hier et j'ai retrouvé ce tuto de mediabox qui est pour moi le top et ceux de webmaster-hub sur le htaccess ! Alors Merci Smiley cligne !

Pour ta question, le tiret (-) étant l'un des caractères spéciaux, il faut l'échapper comme ceci : \- et pour que la recherche ne tienne pas compte de la casse il faut mettre [NC]. Comme par exemple [NC, L]

Je verrais bien quelque chose comme :
RewriteRule ^articles/([^\s\/]*)/$ articles.php?url=$1 [L]
qui devrait ( Smiley langue ) autoriser tous les caractères sauf le slash / et les caractères d'espacement...

A+
Merci beaucoup ! Ca le fait ! Smiley biggol

Et c'est vrai que le tuto de mediabox c'est la grande classe! Sur Webmaster HUB on trouve aussi des trucs sypa mais je n'avais pas pensé à aller jeter un coup d'oeil... Merci encore! Smiley cligne
Hello Heyoan,

je reviens vers toi car je constate un problème surprenant dans le script ci-dessous...

RewriteRule ^articles/([^\s\/]*)/$ articles.php?url=$1 [L]


Je me retrouve avec des variables du genre "ARTICLE-Exclusif" qui fonctionne, et d'autres variables du même genre "NEWS-Divers" qui ne fonctionne pas. Je tombe un peu des nuages là ?? Comment est-ce possible ?? Comment résoudre ce problème ??

Désolé pour toutes ces questions... J'espère que tu pourras m'aider... Smiley ohwell Merci encore, ciao!
Modifié par termi (09 Jun 2008 - 11:11)
Je prends un exemple concret...

Les variables "Charle" (ou Mister-Charle ou Charle-Power) vont marcher parfaitement, mais les variables "Charles" (ou Mister-Charles ou Charles-Power) ne vont pas marcher. Une simple petite lettre en plus, et rien ne marche. Enelever cette lettre, et tout est parfait.

Comment est-ce possible ?? Une erreur dans le script .htaccess ?? Quelqu'un pour m'aider svp car ça m'ennuie énormément ?? Smiley decu
Modifié par termi (11 Jun 2008 - 14:33)
termi a écrit :
Comment est-ce possible ?? Une erreur dans le script .htaccess ?? Quelqu'un pour m'aider svp car ça m'ennuie énormément ?? Smiley decu
Ben pour une raison que j'ignore le \s n'est pas interprété comme un caractère d'espacement Smiley rolleyes !?! Dans ce cas précis je n'ai pas l'impression qu'il soit indispensable donc tu n'as qu'à le supprimer ! Et si tu trouves le pourquoi ça pas marche... ça m'intéresse Smiley langue !


Edit: après relecture de cette page je dirais juste que les expressions régulières sont plus limitées dans le .htaccess et donc il me semble que le code suivant devrait suffire :
RewriteRule ^articles/([^/]+)/$ articles.php?url=$1 [L]

Modifié par Heyoan (11 Jun 2008 - 22:44)
Oui c'est vraiment étrange cette interprétation... Surtout que bon, pour une variable divers ça va, mais quand c'est un nom ou prénom qui est accroché à cette variable, c'est plus gênant d'enlever des lettres!

Je vais continuer de chercher sur ce problème si je trouve quelque chose je te tiens au courant... Merci pour ton aide... Smiley cligne
Modifié par termi (12 Jun 2008 - 13:00)