2010-09-18 42 views
24

Về cơ bản, tiêu đề nói lên tất cả. tôi đã có một đầu vào ẩn trên trang của tôi, nơi tôi muốn đặt tên để "some.major.uber.setting"

ví dụ: <input type="hidden" name="some.major.uber.setting" value="dummy value" />

và khi tôi nhìn vào dữ liệu $ _POST nó chứa " some_major_uber_setting ". Ai có thể giải thích hành vi này

+1

chỉ để được rõ ràng, tôi có thiết lập register_global sang Off – Gabriel

+0

Đó là lý do tại sao tôi đã nói đó là một đang bị diệt vong. Lõi php thay thế dấu chấm với dấu gạch dưới theo mặc định. Hành vi đó phải được giới thiệu với register_globals và không bị ảnh hưởng sau khi xóa nó (hoặc ít nhất là vô hiệu hóa nó theo mặc định). – halfdan

Trả lời

22

Đó có thể là một sự phản đối từ register_global = Thời gian. $ _GET/$ _ Các biến POST đã được biến thành các biến chuẩn ($ _GET ['foo'] đã trở thành $ foo). Tên biến không thể chứa dấu chấm để chúng được chuyển đổi nội bộ.

7

của nó ghi lại trong php.net như:

Dots và khoảng trống trong tên biến được chuyển đổi thành dấu gạch dưới.

+5

OP biết rằng - nó được nêu như một phần của câu hỏi, đó là "Tại sao?" – Quentin

11

Điều này đã có từ original commit to CVS, cách đây hơn 10 năm.

Nó có một bình luận:

/* đảm bảo rằng chúng không có khoảng trắng hoặc dấu chấm trong tên biến (an toàn không nhị phân) */

Tôi không có ý tưởng tại sao nó không phải là "nhị phân an toàn" ... Bạn sẽ phải hỏi Zeev.

liên kết hiện tại: https://github.com/php/php-src/blob/master/main/php_variables.c#L93

+0

http://en.wikipedia.org/wiki/Binary_safe –

+1

Tại sao không? '.' là một toán tử PHP. –

0

Như đã đề cập trong câu trả lời khác của tôi, đây là chức năng điều này khắc phục hành vi đáng tiếc này.

function fix(&$target, $source, $discard = true) { 
    if ($discard) 
     $target = array(); 

    $source = preg_replace_callback(
     '/(^|(?<=&))[^=[&]+/', 
     function($key) { return bin2hex(urldecode($key[0])); }, 
     $source 
    ); 

    parse_str($source, $post); 
    foreach($post as $key => $val) 
     $target[ hex2bin($key) ] = $val; 
} 

Và sau đó bạn có thể gọi chức năng này như sau:

fix($_POST, file_get_contents('php://input')); 
Các vấn đề liên quan