Mảng bí ẩn $ _POST


21

Tôi có trang HTML / PHP sau:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

Như bạn có thể thấy, biểu mẫu sẽ gửi và đầu ra dự kiến ​​là một mảng POST với một mảng trong đó chứa các giá trị được điền và một mục "hành động" với giá trị "Go" (nút). Tuy nhiên, bất kể giá trị nào tôi nhập vào các trường; kết quả luôn là:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

Bằng cách nào đó, mảng có tên là test được làm trống, biến "hành động" thực hiện được.

Tôi đã sử dụng tiện ích mở rộng Live HTTP Headers cho Firefox để kiểm tra xem các trường POST có được gửi hay không và chúng có hoạt động không. Thông tin liên quan từ Tiêu đề HTTP Trực tiếp (với a, b và c được điền dưới dạng giá trị trong hộp văn bản):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

Có ai có bất kỳ ý tưởng như tại sao điều này đang xảy ra? Tôi đang bối rối về điều này, nó đã làm tôi mất rất nhiều thời gian rồi ...

Cập nhật:

Chúng tôi đã thử điều này trên các máy chủ khác nhau, trên các hộp Windows nó hoạt động, trên máy chủ Ubuntu có phiên bản PHP 5.2.4 (với Suhosin), thì không. Nó thậm chí hoạt động trên một máy chủ khác, cũng với Ubuntu và cùng phiên bản PHP, cũng được cài đặt Suhosin.

Tôi đã khác hai tệp, đây là đầu ra ( diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

Trong phps.ini này là một từ máy chủ mà nó hoạt động và php.ini là máy chủ hiện tại. Hình như không có vấn đề gì ở đây, phải không?


4
Suhosin có thể được.
Đại tá mảnh đạn

Ya, suhosin nghe có vẻ là một ứng cử viên có khả năng
SeanJA

Bạn có thể cho thêm một số thông tin? Suhosin được cài đặt trên máy chủ, tôi có nên tắt nó không? Tôi có nên thay đổi cài đặt?
rael_kid

3
Hãy thử điều này, nó sẽ đăng nhập nếu đó là một vấn đề sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation

Tôi đã thử bật chế độ mô phỏng. Các mảng vẫn còn trống. Tôi dường như không thể tìm thấy các tệp nhật ký tuy nhiên ...
rael_kid

Câu trả lời:


2

Nó hoạt động mà không có các chỉ số rõ ràng? Thử:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

Không, cũng không hoạt động.
rael_kid

Không đặt các chỉ mục cho mảng thử nghiệm - chúng làm rối phát hiện biến POST
adam

2
Được rồi, tôi có thể để chúng ra ngoài. Nhưng nó không giải quyết được vấn đề của tôi.
rael_kid

2

Có một số lý do có thể khiến mảng bài đăng có thể trống - rất có thể nó quay trở lại lỗi của con người / nhà phát triển. Tôi đã gặp vấn đề chính xác này khi nâng cấp từ PHP 5.2 lên 5.4, thật đơn giản nhưng phải mất hàng giờ để khắc phục lỗi. Trong tệp config.php của chúng tôi, chúng tôi đã có câu lệnh dưới đây để xử lý các mảng $ _POST:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

Các trích dẫn ma thuật đã từng xuất hiện và trong các phiên bản PHP lên tới 5.2, các phiên bản trên đã hoạt động tốt nhưng mọi thứ ở trên phiên bản 5.2 nó sẽ không xử lý và một mảng trống được trả về.

Nếu bạn chưa error_reporting()bật, tôi khuyên bạn nên làm như vậy và tôi chắc chắn bạn sẽ có thể khắc phục sự cố.

Bạn cũng nên kiểm tra các tính năng hệ thống không dùng nữa, như " magic_quotes" vì sử dụng chúng đơn giản là không trả về kết quả. Tôi hi vọng cái này giúp được. May mắn nhất. JCS :)


1

Có các báo cáo lỗi về vấn đề này hoặc tương tự trong trình sửa lỗi của PHP:

Thật không may, nó không đề cập đến một giải pháp, nhưng bạn có thể thử đặt một CONTENT_TYPE khác hoặc không có loại nội dung nào cả.


Những lỗi này tương tự, nhưng không giống như của tôi. Tôi đã thử đặt loại nội dung (như bạn có thể thấy trong đoạn mã trong câu trả lời ban đầu của mình). Nếu tôi không đặt loại nội dung nào cả thì nó cũng không hoạt động ...
rael_kid

1

Có một vấn đề khá giống nhau. Chà, trước hết tôi phải mất khá nhiều thời gian để đến bài viết này. Để tìm ra tên của vấn đề của tôi, tôi đã phải cài đặt bảng điều khiển PHP, tìm ra cách sử dụng nó. Gỡ lỗi mã mà tôi không biết gì về. Tìm đến gốc rễ của vấn đề và vẫn còn bối rối.

Giải pháp thực sự khá đơn giản. Trong Chrome, nhấn F12 để đến công cụ dành cho nhà phát triển, chọn Mạng, thử đăng biểu mẫu của bạn. Theo dõi yêu cầu bài viết, nhìn vào trạng thái. Nếu nó là 301 (hoặc bất cứ thứ gì khác ngoài 200) - bạn đang gặp vấn đề chính xác tương tự mà tôi gặp phải cho đến gần đây!

Nhà cung cấp máy chủ mới của tôi đã chuyển hướng http://my_site.com sang http://www.my_site.com , tất cả những gì tôi phải làm là thay đổi một số cài đặt như một phần của CMS của tôi (cách của bạn có thể khác nhưng tương tự theo cách)

$Configuration['BASE_URL'] = 'http://my_site.com'

đến

$Configuration['BASE_URL'] = 'http://www.my_site.com'

Và voila, ma thuật và cầu vồng và kỳ lân và trang web của tôi cuối cùng đã hoạt động!

PS Lộn xộn với cài đặt lưu trữ của bạn cũng có thể giải quyết vấn đề của bạn ... Nếu vấn đề của bạn tương tự như của tôi tất nhiên ...


Chết tiệt. Chuyển hướng cũng là vấn đề của tôi!
Aman Alam

0

Tôi không chắc nhưng có

name="test[1]"

vv có thể nhầm lẫn php. Tôi sẽ thay đổi tên đầu vào thành test_1, test_2 và xem điều gì sẽ xảy ra.


7
@haavee: Không, PHP quảng cáo sử dụng này: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

Tôi đã thử điều này, theo cách đó các biến hoạt động, nhưng chúng không nằm trong một mảng.
rael_kid

@haavee: Nah, ký hiệu không gây nhầm lẫn cho PHP, đó là cách sử dụng chuẩn của các biểu mẫu PHP +. Xem liên kết của Boldewyn. :)

Vâng, cảm ơn! đã học được một cái gì đó mới ngày hôm nay.

1
@adam: "Bạn cũng có thể gán các khóa cụ thể cho mảng của mình".

0

Trong PHP cơ sở, tôi chỉ có thể nghĩ ra một tùy chọn cấu hình có thể phá vỡ điều này, đó là post_max_sizekiểm tra php.ini và các tệp liên quan của bạn để đảm bảo rằng giá trị này là lành mạnh và không được đặt thành 0 hoặc giá trị không hợp lệ như ký tự chữ cái .

Suhosin làm cho nó có thể chặn các biến bài trên nhiều điều kiện khác nhau, bao gồm cả những thứ như độ dài mảng và độ dài tên biến. Tìm các tệp php.ini của bạn cho 'suhosin' để xem có bất kỳ cài đặt nào không, đặc biệt là mọi thứ bắt đầu với 'suhosin.post'. (Xem http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth để biết thêm chi tiết về các tham số tôi nghĩ đến.)

Thật không may, việc chặn một trục trặc chính trong cấu hình đặt một số giá trị thành một hoặc không, mã của bạn (và các biến) đủ ngắn để đây là một thứ gì đó lâu dài. Nếu điều đó trở nên trống rỗng, đề xuất tiếp theo của tôi sẽ là sao lưu các cấu hình Apache và PHP của bạn, nuke các thư mục của chúng, lọc các gói, cài đặt lại và bắt đầu đặt các khối cấu hình trở lại cho đến khi mã ngừng hoạt động trở lại (thay vào đó, bắt đầu cập nhật máy chủ đó đang hoạt động với các cấu hình từ máy chủ không hoạt động cho đến khi cả hai đều bị hỏng). Vì máy chủ cùng hệ điều hành PHP hoạt động chính xác, đây gần như chắc chắn là một lỗi cấu hình trên máy chủ bị trục trặc ở đâu đó, nhưng đó là một đống cỏ khá lớn để tìm kiếm.

Kiểm soát phiên bản của / etc rất được khuyến khích trước khi bạn bắt đầu điều này - xem xét gói etckeeper. (Trên thực tế, tôi khuyên bạn nên sử dụng nó, thời gian. Trình tiết kiệm vệ sinh chính, đặc biệt là trên một máy có nhiều người truy cập root.)


Post_max_size của tôi là 8 triệu, tôi nghĩ thế là đủ. Php.ini của tôi không chứa bất kỳ mục nào có suhosin trong đó, vì vậy đó có thể là một vấn đề ... Liệu suhosin có tập tin conf riêng không?
rael_kid

Không phải theo mặc định, nhưng cài đặt cho bất kỳ mô-đun PHP nào cũng có thể được đặt bởi bất kỳ tệp nào trong /etc/php5/conf.d trên hệ thống Debian và do đó tôi cũng đoán là hệ thống Ubuntu. Như tôi đã nói, đây là một cái gì đó dài. Tuy nhiên, tôi sẽ bắt đầu bằng cách phân biệt từng tệp cấu hình so với hệ thống đang hoạt động.
Zed

0

Tôi gặp lỗi khi gửi biểu mẫu ở mọi nơi kể từ khi tôi nâng cấp lên "thử nghiệm" Debian từ "ổn định". Dường như apache2 hoặc php5 không xử lý nhiều mục trong bài gửi có cùng tên. Ví dụ; biểu mẫu của bạn có hai tên đầu vào "mo". Trước đây, chỉ có một trong các giá trị cho "mo" sẽ vượt qua. Bây giờ biểu mẫu dường như bỏ tất cả dữ liệu sau lần xuất hiện đầu tiên của khóa trùng lặp. Chưa chắc lắm. Vẫn đang cố để giải quyết.


0

Hãy thử sao chép php.ini từ máy chủ hoạt động sang máy chủ này (trước tiên hãy sao lưu php.ini của máy chủ không hoạt động). Nếu có, đó là một cái gì đó trong đó (có lẽ là biến_order, hoặc có thể là bộ nhớ, cả hai đều không có khả năng).


0

Hãy thử đổi tên nút gửi của bạn thành một cái gì đó ngoài hành động. Tôi đã có một số vấn đề với điều này trong quá khứ. Có một đầu vào có tên 'hành động' dường như là vấn đề.


0

Những điều sau đây KHÔNG nên giúp bạn. Nó chống lại mọi thứ tôi biết về Cấu hình PHP:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

Cái này nhảy vào tôi. Superglobals của bạn đang được đăng ký theo thứ tự khác nhau. Đây không phải là một vấn đề vì bạn không sử dụng register_globalsvà không dựa vào chúng, nên không nên thay đổi thứ tự các biến thứ tự đang được xử lý.

Nhưng bạn chắc chắn nên thử và thay đổi thứ tự của các biến.


0

Mặc dù OP đó khá cũ, nhưng hôm nay tôi gặp phải một vấn đề tương tự.

Sau khi dành vài giờ để kiểm tra hàng triệu thứ khác nhau, cuối cùng đã phát hiện ra rằng sau lần cập nhật cuối cùng lên phiên bản PHP 5.6.17 trong cPanel của chúng tôi tại các cài đặt mặc định của PHP, http không được chọn.nhập mô tả hình ảnh ở đây

Và sau khi cài đặt thành chọn - mọi thứ trở lại bình thường :-)

nhập mô tả hình ảnh ở đây

Hy vọng nó sẽ giúp bất kỳ độc giả trong tương lai


0

Nếu điều này có thể giúp bất cứ ai khác ... Tôi chỉ mất hàng giờ để khắc phục sự cố tương tự và vấn đề là giới hạn max_input_vars = "1000" của php.ini. Hãy chắc chắn kiểm tra các giá trị php.ini của upload_max_filesize, post_max_size và max_input_vars. Vượt quá một kết quả sẽ có một mảng $ _POST trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.