Aller au contenu

$_GET avec plusieurs '?'


Sujets conseillés

Posté

Bonjour à tous,

Au menu aujourd'hui une nouvelle question tordue :D !

Dans un script, je passe en variable dans l'url une autre url . Je m'explique :

Ma page1.php est appellée par exemple par google :

Ma page1.php à donc un referrer du type :

http://www.google.fr/search?q=mes+mots+clés.

Dans ma page1.php, je recupère ce referrer, et je le passe par l'url à ma page2.php.

L'url affichée dans ma page2.php est donc :

page2.php?var=http://www.google.fr/search?q=mes+mots+clés

Je me trouve donc avec 2 '?' dans mon url.

et je veux récuperer 'mes+mots+clé'.

Je fait donc bètement un $_GET[q].

globalement, ça marche, mais dans 5 à 10% des cas, $_GET[q] est vide, alors que les données sont bien présentes dans l'url.

Je vois pas trop l'origine de l'erreur, sauf à dire que $_GET aime pas les dubles '?', mais encore une fois, ça marche dans 90% des cas...

Posté

*Toujours* faire des échappements.

Tu envoies des données en SQL ? addslashes, mysql_real_escape_string() ou l'équivalent dans ton SGBD.

Tu envoies des données en HTML ou XML ? htmlspecialchars()

Tu envoies des données dans une URL ? urlencode()

Tu envoies des données dans un fichier texte brut ? probablement un iconv() pour gérer les jeux de caractères

Si tu as ce genre d'erreur c'est que tu as envoyé une chaîne de texte directement en sortie sans la transformer ou lui appliquer un échappement. Tu ne devrais jamais faire ça.

Ici tu as des URL, c'est un codage qui se fait avec urlencode(). La fonction inverse (que tu ne devrais quasiment jamais appeler vu que PHP gère ça tout seul) est urldecode().

Posté

Merci Ganf,

j'utilisais en fait :

$url=utf8_decode(urldecode($_GET[q]));

Sans plus de succès.

Par contre, c'est vrai que les données n'étaient pas encodées au départ. Du coup, un autre souci (mais à voir sur un autre forum), c'est que l'url est générée en Javascript.

Et je ne sais pas si on peut encoder en JS...

Posté

Sauf que le décodage est déjà fait par PHP, ce qu'il te faut faire c'est l'encodage.

On doit pouvoir encoder en js, au pire par une expression rationnelle sortie des tiroirs, mais là pour le coup je n'ai pas de pistes à te donner.

en PHP ça serait quelque chose comme

$url = 'xxxxx?var='.urlencode($oldUrl) ;

Posté

Une info de plus : le problème ne se pose qu'avec google.

Pour les autres moteurs, $_GET fonctionne sans problème.

On m'avait (un fois de plus !) dépanné sur ce forum, c'est pour ça que je rajoute un utf-8, puisque il semble que Google utilise ce truc (je sais pas exacetement ce que c'est...).

J'ai commencé à grenouiller sur les forum JS, mais manifestement, ça l'fait pas :boude:

Posté
Une info de plus : le problème ne se pose qu'avec google.

Le problème va se poser avec toutes les url qui contiennent un caractère interprétable (en l'occurence un "&"). Il se trouve que tes URL google en ont, que visiblement tes autres URL de test n'en ont pas, mais ça n'a rien de spécifique à google. En gros tout ce qui est à partir le premier "&" dans l'ancienne URL ne sera pas récupéré (parce que PHP interprétera ça comme un nouveau paramètre de l'url actuelle et pas comme la suite de l'ancienne URL)

Posté

Merci Ganf,

En effet, finalement, d'autres moteurs sont parfois concernés.

J'ai contourné le problème en traitant la chaine de caractère. Je trouve ça pas propre et plus long, mais bon, on fait ce qu'on peut !

Je reste ouvert aux suggestions :)

Posté

Tu devrai regarder du coté de la superglobale $_SERVER, notamment $_SERVER["QUERY_STRING"]

Qui te retourne pour cet exemple page2.php?var=http://www.google.fr/search?q=mes+mots+clés la chaine de caractere var=http://www.google.fr/search?q=mes+mots+clés.

A toi ensuite de traiter la chaine de caractere pour récupérer les infos que tu souhaite.

Posté (modifié)

Ouep c'est plus long. Mais au moins t'es tranquille :)

Modifié par Jok

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...