URL rewriting et point d'interrogation

Nouveau WRInaute
Bonjour,

Je réécris les URL de certaines pages mais j'ai un bug quand il il y un point d'interrogation dans le texte. Du genre: wwv.monsite.fr/le-saviez-vous ?.html

Sur le lien qui appelle ce texte, j'ai remplacé le ? par un autre symbole avec un str_replace et sur la page qui s'ouvre, je remplace le symbole par le ? après le GET et avant la requête SQL.

Du coup, contrairement à avant, je n'ai plus d'erreur 404 et j'arrive bien sur la bonne page avec, dans l'url "propre" le symbole à la place du ? .

Mais mon texte de s'affiche pas.

Pourtant, grâce à la commande ECHO, la commande str_replace me remplace bien le ? .

Si quelqu'un avait une idée ? :)

Merci.
 
WRInaute accro
Si tu as un "?" dans l'URL ex: "test?.html", ".html" sera envoyé en query string donc c'est normal.
 
Nouveau WRInaute
Mieux vaut des exemples:

J'affiche sur ma page index.php, 10 brèves depuis une BDD.

Chaque brève est cliquable et amène à la page breve.php avec une récupération GET.

Ca fonctionne, sauf quand il y a un point d'interrogation dans la brève.

Par ex: "Le saviez-vous ? il faut blablabla"

Comment faire ? :(
 
Nouveau WRInaute
Mieux vaut des exemples:

J'affiche sur ma page index.php, 10 brèves depuis une BDD.

Chaque brève est cliquable et amène à la page breve.php avec une récupération GET.

Ca fonctionne, sauf quand il y a un point d'interrogation dans la brève.

Par ex: "Le saviez-vous ? il faut blablabla"

Comment faire ? :(
 
Nouveau WRInaute
C'est ce que j'ai fait. :)

Je remplace une 1ere fois le ? sur le lien sur la page index.php et sur la page de résultat brève.php, ou il y a le GET, je remets le ? .
C'est sur cette même page que la commande ECHO me montre que le remplacement est bien effectué mais à priori, ça ne convient pas ma requête SQL. :?
 
WRInaute accro
Le point d'interrogation est un caractère spécial en MySQL. Faudrait voir où il se trouve dans la requête.

Jean-Luc
 
Nouveau WRInaute
J'suis pas sûr de bien comprendre. Ma requête est juste conditionnée avec un WHERE et une variable.
C'est cette variable qui récupère la brève.
 
WRInaute discret
dans ta requête SQL, tu fais un like ou un = ?
pour le like, c'est normal que le point d'interrogation ne passe pas, en revanche avec un test d'égalité ça ne poserait aucun problème
 
Nouveau WRInaute
Un =

Sur la page brève.php:

Code:
$sql = "SELECT auteur.nom, auteur.prenom,  auteur.id, breves.breve, breves.id, breves.idauteur FROM auteur LEFT JOIN breves ON auteur.id = breves.idauteur WHERE breves.breve='".$breve. »’ »;

Avec avant ce requête:
Code:
if(isset($_GET['breve']))
{
$breve1 = $_GET['breve'];
//remplacement de tirets par des espaces suite à l'inverse sur la page index.php pour l url rewriting
$breve2 = str_replace("-"," ",$breve1); 
//encodage pour les caracteres speciaux
$breve3 = utf8_decode($breve2);
//Remplacement du symbole § par ? suite à l'inverse sur la page index.php
$breve = str_replace('§', '?', $breve3);

Et si pour mes recherches, j'affiche les variables:

Code:
echo $breve3;
echo $breve;

ça donne en exemple:

Le saviez vous §
Le saviez vous ?

Puisque le ? est correctement remis, pourquoi ça ne satisfait pas ma requête ?
 
Nouveau WRInaute
Comme ça ?

Code:
if(isset($_GET['breve']))
{
$breve1 = mysql_real_escape_string($_GET['breve']);
//remplacement de tirets par des espaces suite à l'inverse sur la page index.php pour l url rewriting
$breve2 = str_replace("-"," ",$breve1); 
//encodage pour les caracteres speciaux
$breve3 = utf8_decode($breve2);
//Remplacement du symbole § par ? suite à l'inverse sur la page index.php
$breve = str_replace('§', '?', $breve3);

Et si dans la variable il y a un ' . :?
 
Nouveau WRInaute
Et si dans la variable il y a un ' . :?

Sinon après peut importe. Je ne suis pas spécialiste en codage et c'est certainement pour ça que je ne prétend pas stocker des données sensibles. Maintenant, s'il y a un pirate un peu bras cassé pour perdre temps à hacker à ch'ti site comme le mien, tant pis pour moi ! :D

Sinon, concernant mon problème de ? ?
 
WRInaute discret
Non mais c'est ta façon de faire qui ne convient pas du tout.

Soit tu met un id dedans (/5-mon-rewrite/) et tu ne prends en compte que le 5 (tu fais gaffe à avoir le rewrite tjrs identique après coup, via une redirection 301 si elle n'est pas identique).

Soit tu enregistres en dure ton rewrite dans ton champ en rendant le titre propre (et donc en ne laissant QUE des caractères alphanumerique et les tirerts), dans quel cas, tu peux avoir /mon-rewrite/ et tu cherches dans un champ unique "mon-rewrite".

Mais ta façon de faire actuel, c'est du bricolage, imagine que tu souhaiterai mettre un apostrophe simple ou double dans ton titre ? tu vas faire comment pour le savoir en partant du "rewrite" pour cherche ton titre (vu que ton rewrite ne peux pas en contenir, tout comme le point d'interrogation) ?

Bref, recommence de zéro ta façon de faire.
---------------
Créé un champ unique "rewrite" par exemple (unique est indispensable !)

Tu fais une petite boucle sur tes titres de ta table, tu fais le traitement du titre propre (ça se trouve sur le net, pour retirer tous les caractères non alpha, proprement) et tu updates la table avec le rewrite. Tu verifies que l'update à marcher (en cas de titre identique, tu ajoutes un "-2" par exemple ...)

Et ensuite, au lieu de chercher sur "breve", tu cherches sur "rewrite".

Bon courage :)
 
Discussions similaires
Haut