2009-06-29 10 views
8

私は変数stringをquery string.Phpにdotをunder scoreで置き換えています。だから私は名前にドットを持っている変数名を保持することができますどのように変数名のドット

http://localhost/sample.php?one.txt=on&two.txt=on

をsample.php

$ RET = $ _ REQUEST [ 'one.txt']; //動作していない

+3

はここでGETソリューションよりも多くのユーザーのために、おそらくトリッキーであるだけでなくPOST変数のためのソリューションです。 – Sampson

+3

単にクエリのパラメータにドットを配置するOpenIDと統合しようとしているのであれば? – defines

答えて

27

PHPが変数名をone.txtからone_txtに変換しているのは、変数名にドットが有効でないためです。詳細については

PHP Documentationを見て:

変数名は、PHPの他のラベルと同じルール に従ってください。有効な 変数名は、文字または のアンダースコアで始まり、その後に任意の数の の文字、数字またはアンダースコアが続きます。 正規表現として、それは は、このように表現することになります。 '[-ZA-Z_ \ x7f- \ XFF] [-ZA-Z0-9_ \ x7f- \ XFF] *'

をあなた変更(._)を考慮して$_REQUEST['one_txt']をチェックするか、HTMLフォームが有効な変数名を渡すようにすることができます。

編集:

マイケルBorgwardtさんのコメントのフォローアップをするには、ここにPHP's documentation about handling variables from external sourcesからのテキストです:外部変数名通常

ドットは、PHPはの 名前を変更しません変数には がスクリプトに渡されます。ただし、 は、ドット(期間、 フルストップ)は のPHP変数名の有効な文字ではないことに注意してください。それで理由から、 外観:今

<?php 
$varname.ext; /* invalid variable name */ 
?> 

は、どのようなパーサが見ることはdoesnのbarestring(すなわち 引用符で囲まれていない文字列が続く 文字列連結演算子、 続く、 という名前の変数の$ VARNAMEです一致するキーは です。 'ext'です。明らかに、これには意図した結果が ありません。

このため、 には、PHPが自動的に の変数 のドットをアンダースコアで置き換えることが重要であることに注意してください。

実際にはPHP固有のものです。

+4

識別子のPHPの規則がどのようなクエリ文字列キー名が有効であるかは、私には分かりません。何かがある場合、これはregister_globals機能のために存在するPHP固有の規約です。恐ろしいことに誰も使用しないでください。 –

+2

@Michael Borgwardt:確かにあなたは有効なポイントを作る。これはPHP固有のもので、おそらくregister_globalsがデフォルトの時代からの遺産です。私はもう誰も使用していないことを願っています:) –

6

使用$ _SERVER [ 'QUERY_STRING']

$get = array(); 
foreach(explode('&', $_SERVER['QUERY_STRING']) as $part) 
    { 
    $part = explode('=', $part); 
    if($key = array_shift($part)) 
     { 
     $get[ $key ] = implode('', $part); 
     } 
    } 
print_r($get); 

結果ご例えば アレイ

+0

作品。 PHPが点在するパラメータを許可しないことを狂ってしまいます。 –

4

([one.txt] =>上の[two.txt] =>上の)PHP開発者これを実装してregister_globals()をサポートしましたが、1秒以上ポーズして結果を検討すると、$ _POST自体ではなく、グローバル変数名前空間にインポートされた名前のみが変更されました。要求変数自体を変更する理由はありません...標準的なフォームの提出をPHPが処理できないようにすることを除けば、そうではありません。あなたの変数名にドットを入れないでください

function post_data(){  
    $data=explode('&',file_get_contents("php://input")); 
    $post=array(); 
    foreach ($data as $var){ 
     list($key,$value)=explode('=',$var,2); 
     $post[$key]=urldecode($value); 
    } 
    return $post; 
} 
関連する問題