2009-06-29 14 views
8

Przekazuję zmienną kropkę w ciągu zapytania.Php zastępuje kropkę podrzędnym wynikiem. Więc jak mogę zachować nazwę zmiennej, która jest o kropkę w nazwiekropka w zmiennej nazwa

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

sample.php

$ ret = $ _ REQUEST [ 'jeden.txt'];

// Nie działa
+3

Nie umieszczać kropki w swoich nazwach zmiennych. – Sampson

+3

Co, jeśli po prostu próbujesz zintegrować się z OpenID, który umieszcza kropki w swoich parametrach zapytania? – defines

Odpowiedz

27

Powód, dla którego PHP konwertuje twoją nazwę zmiennej z one.txt na one_txt, ponieważ kropki nie są poprawne w nazwach zmiennych.

Aby uzyskać więcej informacji, należy spojrzeć na PHP Documentation:

Nazwy zmiennych przestrzegać tych samych zasad jak inne etykiety w PHP. Poprawna nazwa zmiennej rozpoczyna się od znaku podkreślenia litery lub , po którym następuje dowolna liczba liter, cyfr lub znaków podkreślenia. Jako wyrażenia regularnego, byłoby wyrażony następująco: '[a-zA-Z_ \ x7f- \ xff] [a-zA-z0-9_ \ x7f- \ xff] *'

Ty może uwzględnić zmianę (. do _) i sprawdzić pod kątem $_REQUEST['one_txt'] lub sprawić, aby formularz HTML przekazał poprawną nazwę zmiennej.

Edit:

Aby follow-up na komentarz Michaela Borgwardt jest, oto tekst z PHP's documentation about handling variables from external sources:

Kropki w przychodzących nazw zmiennych

Zazwyczaj PHP nie zmienia nazwiska zmienne, gdy są przekazywane do skryptu. Należy jednak zauważyć, że kropka (kropka, kropka ) nie jest poprawną nazwą w nazwą zmiennej PHP. Z tego powodu, spojrzenie na to:

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

Teraz, co widzi parser jest zmienna o nazwie $ varname, a następnie operator konkatenacji ciągów znaków, następnie pusty (tj cytowane smyczkowy, który nie robi 't pasuje do dowolnego znanego klucza lub słów zastrzeżonych) ' ext '. Oczywiście nie ma to zamierzonego rezultatu.

Z tego powodu ważne jest, aby pamiętać, że PHP automatycznie zastąpi kropki w nazwach zmiennych przychodzących za pomocą podkreśleń.

To rzeczywiście jest specyficzna dla PHP.

+4

Nie widzę, w jaki sposób reguły PHP dla identyfikatorów są odpowiednie dla nazw kluczy kluczy ciągów zapytań. Jeśli już, to jest to konwencja specyficzna dla PHP, która istnieje z powodu funkcji register_globals, której nikt nie powinien używać, ponieważ jest to bardzo niebezpieczne. –

+2

@Michael Borgwardt: Rzeczywiście robisz ważny punkt. Jest to rzecz specyficzna dla PHP, prawdopodobnie spuścizna z czasu domyślnie rejestr_globals. I mam nadzieję, że nikt już nie używa :) –

6

Zastosowanie $ _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); 

Wynik za przykładem Array ([jeden.txt] => na [dwa.txt] => na)

+0

Działa. Szalony, że PHP nie zezwala na przerywane params. –

4

Twórcy PHP zaimplementowano to w celu obsługi register_globals(), ale jeśli zatrzymali się na dłużej niż jedną sekundę, aby rozważyć konsekwencje, zmieniliby tylko nazwy zaimportowane do przestrzeni nazw zmiennych globalnych, a nie same $ _POST. Nie ma żadnego powodu, aby zmieniać same zmienne żądania ... cóż, poza tym, że PHP nie jest w stanie obsłużyć standardowych formularzy.

Oto rozwiązanie dla zmiennych POST, jak również, co jest prawdopodobnie trudniejsze dla większej liczby użytkowników niż roztwór GET:

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; 
} 
Powiązane problemy