Obtenez PHP pour arrêter le remplacement des caractères '.' dans $_GET ou $_POST tableaux?
Si je passe des variables PHP avec .
dans leurs noms via $_GET PHP auto-remplace avec _
caractères. Par exemple:
<?php
echo "url is ".$_SERVER['REQUEST_URI']."<p>";
echo "x.y is ".$_GET['x.y'].".<p>";
echo "x_y is ".$_GET['x_y'].".<p>";
... résultats suivants:
url is /SpShipTool/php/testGetUrl.php?x.y=a.b
x.y is .
x_y is a.b.
... ma question est la suivante: est-il tout façon je peux obtenir ce à arrêter? Ne peut pas pour la vie de moi ce que j'ai fait pour mériter cela
La version de PHP, je suis en cours d'exécution avec est 5.2.4-2ubuntu5.3.
.. Pourquoi ne pas vous venez de convertir tous les points à un type de jeton, comme, par exemple, à (~#~) et puis après? Lors de la réception de la rva vous pouvez ensuite convertir en arrière.. C'est parce que parfois nous avons BESOIN de poster souligne.. et nous lâche si la reconversion de tous les "_"".". s...
À partir de la retriving requête elle-même, vous pouvez concate la user_name comme "concat(prenom,'_',nom) user_name.
Marie ... la base de données est configuré pour avoir des colonnes nom d'utilisateur et le statut et les noms d'utilisateur sont stockées sous la forme prénom.nom donc je ne peux pas utiliser n'importe concat dans sql comme ils sont alreaddy concat-ed avec un .
Merci pour le commentaire! (en) Rob problème intéressant
Pourquoi n'est-il pas supprimer le commentaire? 🙂
À partir de la retriving requête elle-même, vous pouvez concate la user_name comme "concat(prenom,'_',nom) user_name.
Marie ... la base de données est configuré pour avoir des colonnes nom d'utilisateur et le statut et les noms d'utilisateur sont stockées sous la forme prénom.nom donc je ne peux pas utiliser n'importe concat dans sql comme ils sont alreaddy concat-ed avec un .
Merci pour le commentaire! (en) Rob problème intéressant
Pourquoi n'est-il pas supprimer le commentaire? 🙂
OriginalL'auteur | 2008-09-16
Vous devez vous connecter pour publier un commentaire.
Voici PHP.net'explication de pourquoi il le fait:
C'est à partir de http://ca.php.net/variables.external.
Aussi, selon ce commentaire ces autres caractères sont convertis en caractères de soulignement:
Il semble que vous êtes coincé avec elle, de sorte que vous aurez à convertir le souligne retour à points dans votre script à l'aide de dawnerd la suggestion de (je venais d'utiliser str_replace.)
bonne explication de pourquoi? Je suis à l'aide de PHP 5.4 et PHP est encore en train de faire cela. J'aimerais également savoir pourquoi ses pas obsolète encore. Je ne vois que deux raisons pour le garder; register_globals (obsolète depuis 5.3), et pour la commodité dans les ~faire ce que register globals n'manuellement (dans ce cas, la charge de la personne qui à plan du var noms façon dont ils l'entendent de l'OMI).
Rétro-compatibilité, je suppose? Bon point, avec register globals le chemin du dodo cet étrange "fonctionnalité" pourrait aller de même.
Avec php7, register globals déjà roulé vers le soleil couchant, mais le problème est toujours présent.
OriginalL'auteur Jeremy Ruten
Depuis longtemps répondu à la question, mais il est en fait une meilleure réponse (ou contourner). PHP permet à la raw flux d'entrée, de sorte que vous pouvez faire quelque chose comme ceci:
qui vous donnera le $_POST gamme dans la chaîne de requête format, les périodes qu'ils devraient l'être.
Vous pouvez ensuite d'analyser si vous en avez besoin (comme par POSTer un commentaire)
Très utile pour OpenID paramètres, qui contiennent à la fois '.' et '_', chacun avec un certain sens!
file_get_contents("php://input")
avec$_SERVER['QUERY_STRING']
.Et vous pouvez faire de même pour les biscuits à l'aide d'
$_SERVER['COOKIES']
C'est un bon début, mais il ya un couple de problèmes avec elle. Il ne gère pas les valeurs de tableau (par exemple toto.bar[]=blarg ne vais pas finir comme un tableau, il va finir comme une variable scalaire appelé foo.bar[]). Elle a aussi beaucoup de frais généraux que c'retraite toutes les valeurs, indépendamment de savoir si il y a une période ou non.
Voir ma solution ci-dessous, qui résout des problèmes avec la république de Corée de la mise en œuvre.
Pour une raison quelconque $query_string = file_get_contents('php://input'); retourne une chaîne vide pour moi.
OriginalL'auteur crb
Mettant en évidence une réponse réelle par Johan dans un commentaire ci - dessus je vient de terminer mon post entier à un niveau supérieur tableau qui ignore totalement le problème avec aucun traitement lourd nécessaire.
Dans le formulaire, vous ne
au lieu de
et dans le poste de gestionnaire, juste déballer:
Pour moi, c'était un deux-changement de ligne, que mon point de vue ont été entièrement modélisé.
FYI. Je suis à l'aide de points dans mes noms de champs à modifier des arbres de données groupées.
Merci @robinmitra
OriginalL'auteur scipilot
Le travail de cette fonction est un génie de la bidouille que j'ai trouvé pendant mes vacances d'été en 2013. Je vais écrire un billet de blog à ce sujet un jour.
Ce correctif fonctionne universellement et a un grand tableau à l'appui, par exemple
a.a[x][b.a]=10
. Il utiliseparse_str()
derrière les coulisses avec certains de prétraitement.Et puis vous pouvez appeler cette fonction comme celle-ci, selon la source:
Pour PHP 5.4 ci-dessous: utilisation
base64_encode
au lieu debin2hex
etbase64_decode
au lieu dehex2bin
.profonde tableaux de faire le travail.
a[2][5]=10
produitarray(1) { ["a"]=> array(1) { [2]=> array(1) { [5]=> string(2) "10" } } }
.Oh je l'ai eu il, elle, en effet, que, juste testé. Php ne permet pas de convertir des points etc à l'intérieur d'index de tableau, seul le haut niveau de nom de tableau est troublé: php_touches_this[nochangeshere][nochangeshere]. Grand. Merci.
Je serais ravi de voir vos critères de référence qui ne conflit avec les tests que j'ai fait il y a quelques mois. Aussi, je viens de courir à travers la situation où j'ai besoin de manipuler des périodes posté champs de fichier, pas de réponses encore d'adresse; des idées?
Vous verrez assez tôt, n'ont pas le temps, mais vous pouvez présenter le vôtre. * Les téléchargements de fichiers nécessitent multipart/form-data type, ce qui ne veut pas se passer de php://input. Donc, c'est encore très hackish à faire. Voir: stackoverflow.com/questions/1361673/get-raw-post-data
OriginalL'auteur Rok Kralj
Cela se produit parce que la période est un caractère non valide dans le nom d'une variable, la raison de très profond dans la mise en œuvre de PHP, donc il n'y a pas de solutions faciles (encore).
En attendant, vous pouvez contourner ce problème en:
php://input
pour publier des données ou$_SERVER['QUERY_STRING']
pour OBTENIR les donnéesCi-dessous la fonction de conversion (PHP >= 5.4) code pour les noms de chaque paire clé-valeur dans une représentation hexadécimale et effectue régulièrement
parse_str()
; une fois fait, il revient à la hexadécimal noms de retour dans leur forme originale:Ou:
J'ai ajouté de la sortie en fonction de votre question, il fonctionne comme prévu, parce que je ne touche pas les traits de soulignement.
solution élégante, je vous remercie beaucoup monsieur, je l'apprécie vraiment
Note: Ceci est une modification de la solution qui, plus tard, de copier mon code et mon idée (voir le journal des modifications). Il devrait être supprimé par les modérateurs.
Apparemment, il a été assez bon pour vous de prendre l'
bin2hex()
idée de la mienne, donc, peut-on tout laisser tomber, cette vaine querelle?OriginalL'auteur Ja͢ck
Cette approche est une version modifiée de la république de Corée Kralj, mais avec quelques ajustements pour le travail, pour améliorer l'efficacité (évite les rappels, d'encodage et de décodage sur affectée clés) et à gérer correctement la matrice de touches.
Un gist avec des tests est disponible et tous les commentaires ou suggestions sont les bienvenus ici ou là.
Je tiens à préciser si les valeurs entrent en qui n'ont pas d' %20 entités qui sont déjà en place, tels que "Certains de Clé=Valeur", puis la sortie de cette fonction est "Some_Key=Valeur', peut-être que l'expression régulière pourrait être modifié?
L'expression régulière peut être ajustée pour attraper des nations unies url-encodé espaces... mais si votre source n'est pas une url encodée, puis il y aura probablement d'autres problèmes, comme la manipulation toujours décode et encode les cordes, puis les
parse_str
appel sera de nouveau urldecode. Qu'essayez-vous ot analyser ce n'est pas encodée?Merci pour la mention de la source. Cependant, je pourrais avertir que votre code peut effectuer le pire, car les Postes sont généralement de quelques centaines d'octets. Je préfère ici, la simplicité.
Avez-vous d'obtenir ces données de référence quelque part? Je suis curieux de voir quels sont les scénarios qui il est plus lent, comme tout ce que j'ai testé, il variait entre la même vitesse que le vôtre et deux fois plus rapide. Je crois que la différence est dans le type de choses qu'il a été testé sur 🙂 Vous pouvez facilement ajouter un peu de timing des contrôles à mon gist à voir comment il va, pourquoi ne pas comparer les vôtres contre le même en entrée et en publier les résultats et de temps?
OriginalL'auteur
La raison à cela est parce que PHP vieux register_globals fonctionnalité. L' . ce caractère n'est pas un caractère valide dans un nom de variable, de sorte que PHP se transforme en un trait de soulignement afin de vous assurer de la compatibilité.
En bref, c'est pas une bonne pratique pour faire des périodes variables d'URL.
register_globals est en fait hors tension, comme c'est le défaut en PHP5. > Le . ce caractère n'est pas un caractère valide dans un nom de variable Malheureusement, je ne suis pas à la recherche de l'utiliser comme un nom de variable (je le garde comme un élément clé dans le $_GET dictionnaire), de sorte que cette "réflexion" dans le PHP n'ajoute pas de valeur 🙁 Ah bien...
Il n'a pas d'importance si register_globals est à on ou off. PHP effectue toujours les remplacements.
OriginalL'auteur Jeremy Privett
Si vous cherchez tout façon de littéralement obtenir PHP pour arrêter le remplacement des caractères '.' dans $_GET ou $_POST tableaux, alors un tel moyen est de modifier PHP à la source (et dans ce cas, il est relativement simple).
Attention: la Modification du PHP source C est une option avancée!
Aussi voir ce PHP rapport de bug qui suggère la même modification.
À explorer que vous aurez besoin de:
.
chèque de remplacementLe changement de source en lui-même est trivial et implique la mise à jour juste la moitié d'une ligne dans
main/php_variables.c
:Remarque: par rapport à l'original
|| *p == '.'
a été commentéExemple De Sortie:
donné une QUERY_STRING de
a.a[]=bb&a.a[]=BB&c%20c=dd
,l'exécution de
<?php print_r($_GET);
maintenant produit:Notes:
parse_str()
et (si disponible) automne-retour à un ralentissement des méthodes.OriginalL'auteur humbletim
Ma solution à ce problème a été rapide et sale, mais je l'aime toujours. Je voulais simplement publier une liste des noms de fichiers qui ont été cochée sur le formulaire. J'ai utilisé
base64_encode
pour encoder les noms de fichiers dans le balisage et puis juste décodé avecbase64_decode
avant de les utiliser.OriginalL'auteur Jason
Après avoir regardé de Rok solution je suis venu avec une version qui corrige les limitations dans ma réponse ci-dessous, le crb a au-dessus et de Rok solution. Voir un ma version améliorée.
@crb réponse de au-dessus est un bon début, mais il ya un couple de problèmes.
La solution ci-dessous les adresses de ces problèmes maintenant (à noter qu'il a été mis à jour depuis posté). C'est environ 50% plus rapide que ma réponse ci-dessus lors de mes tests, mais ne seront pas gérer les situations où les données ont la même clé (ou une clé qui est extrait de la même, par exemple toto.bar et foo_bar sont les deux extraits que foo_bar).
%20
est aussi un caractère spécial qui est converti en un trait de soulignement. 2. Votre code preproceses toutes les données, depuispreg_match_all
a de tout analyser, même si vous dites que vous n'avez pas. 3. Votre code ne fonctionne pas à des exemples comme ceci:a.b[10]=11
.Vous avez raison à propos de l'espace, merci. Mon explication indique déjà que mon approche ne prend pas en charge les tableaux, donc je ne suis pas tout à fait sûr de savoir pourquoi vous êtes souligné.
preg_match_all
a de "processus" une chaîne de caractères, pas d'extraire et de valoriser tous les innocents de clés et de valeurs, donc, vous êtes un peu à côté de la piste. Cela dit, votre approche avecparse_string
ressemble une approche intéressante qui, avec un peu de peaufinage, peut-être mieux 🙂Vous dites que vous extraire uniquement les clés concernés, mais en termes de complexité de calcul, vous n'avez pas. Vous dites que vous avez eu une sorte d'accès aléatoire pour récupérer uniquement les clés concernés, mais même si il n'y a pas affecté les touches, vous avez accès à l'ensemble de la mémoire. Si vous avez un poste à 100 mégas de données, il n'a pas d'importance ce que vous extrayez, les deux approches sont linéaires,
O(n)
. En fait, vous faites de la complexité pire, à l'aide de lain_array()
fonction, comme indiqué ci-dessus.Je suis à la recherche par le biais de la 100megs une fois, pas de le diviser en dehors (qui a tout de suite double de la mémoire), puis de le diviser de nouveau (doublement de nouveau), comme dans l'crb est la méthode que j'étais en comparant ce trop. Big O la notation n'est pas de prendre en compte l'utilisation de la mémoire, et cette mise en œuvre n'utilisez pas
in_array
de toute façon. Aussi, si vous vous souciez de faire quelques tests, vous remarquerez que le ci-dessus est encore beaucoup plus rapide; pas de O(n) vs O(n^2), mais une approche linéaire, peut-être encore plus vite que l'autre... et c'est un moment 😉A mise à jour à la version qui fonctionne aussi avec la matrice de touches.
OriginalL'auteur El Yobo
Bien, la fonction que j'ai inclure ci-dessous, "getRealPostArray()", n'est-ce pas une jolie solution, mais elle gère des tableaux et prend en charge les noms de: "alpha_beta" et "alpha.bêta":
alors que var_dump($_POST) produit:
var_dump( getRealPostArray()) produit:
La fonction, pour ce que ça vaut:
OriginalL'auteur ChrisNY
À l'aide du crb ai voulu recréer la
$_POST
tableau d'ensemble mais gardez à l'esprit que vous devrez toujours vous assurer que vous faites de l'encodage et de décodage correctement à la fois sur le client et le serveur. Il est important de comprendre que lorsque le personnage est vraiment invalide et il est vraiment valide. En outre, les gens devraient encore et toujours échapper des données du client avant de l'utiliser avec tout commande de base de données sans exception.Je recommande d'utiliser ce seulement pour des cas particuliers seulement, désinvolte, je ne suis pas sûr que sur les points négatifs de mettre en haut de votre premier fichier d'en-tête.
OriginalL'auteur John
Ma solution actuelle (basée sur le précédent sujet, les réponses):
OriginalL'auteur sasha-ch