2012-07-12 11 views
5

Một thời gian ngắn trước đây, tôi đã hỏi một câu hỏi về việc sử dụng cùng tên đầu vào/tên ẩn nhiều lần trong một trang và nhận được câu trả lời không làm việc vì nó gợi ý tôi phải sử dụng để đặt dấu ngoặc vuông sau tên trường, như partno[].Có cách nào trong PHP để nắm bắt TẤT CẢ thông tin được truyền bằng cách sử dụng phương thức POST

Tôi không thể sử dụng điều này trong biểu mẫu của tôi vì giỏ hàng đang được gửi để chỉ nhận ra một số tên trường như: partno, item, price, qty, v.v. (Tôi không thể sử dụng partno[], item[], v.v.) để có thể nhận tất cả các giá trị cho mỗi tên trường giống nhau được sử dụng nhiều lần. Khi tôi sử dụng phương thức GET, nó sẽ hiển thị tất cả các giá trị cho mỗi tên trường được sử dụng trong thanh địa chỉ. Bạn có thể thử this và gửi biểu mẫu. Nhìn vào url trong thanh địa chỉ.

Câu hỏi mới của tôi là: Có cách nào trong PHP để nắm bắt tất cả thông tin được chuyển bằng phương pháp POST không? (như những gì hiển thị trong thanh địa chỉ trong ví dụ trên nhưng sử dụng POST, không phải GET). Tôi có thể phân tích nó nếu tôi có thể tìm ra cách để nắm bắt nó.

Cảm ơn, Kelly

+0

chỉ sử dụng 'method =" post "' trong biểu mẫu của bạn? – cweinberger

+0

@harakiri op sử dụng cùng một thông số nhiều lần, 5x PartNo v.v. như bạn có thể thấy trong url mẫu của mình. Điều này sẽ không hoạt động với việc nhận và đăng bài. bạn vẫn cần một tên duy nhất cho mỗi đầu vào. – 32bitfloat

+1

Giới hạn này và cú pháp 'name =" ngoặc vuông [] "' hoàn toàn là một điều PHP, nó hoàn toàn hợp pháp để có nhiều đầu vào có cùng tên. –

Trả lời

2

Bạn chỉ cần sử dụng $_POST thay vì $_GET.

Vì vậy, nếu bạn đang sử dụng get theo cách sau:

?something=somevalue 

Và đã bắt nó với $_GET['something'], bạn sẽ sử dụng tại $_POST['something'].

+0

Tôi tin rằng điểm của câu hỏi của OP là truy cập vào các giá trị của các trường có tên giống nhau, bằng cách sử dụng ký hiệu ngoặc đơn như 'name =" items [] "', Chuyển từ bài/nhận sẽ không tạo sự khác biệt. OP đã hỏi làm thế nào để làm điều này với 'POST', vì vậy tôi không thể nhìn thấy câu trả lời này là gì. Tôi biết có xu hướng trả lời câu hỏi hơn là đọc toàn bộ câu hỏi. –

+0

Câu trả lời của tôi không có anh ta sử dụng định dạng 'tên =" mục [] "'. Bạn rõ ràng là không hoàn toàn hiểu được phương pháp ban đầu mà anh ta đang cố gắng, vì nó hoàn toàn khác với câu trả lời tôi đã cung cấp. Tôi khá chắc chắn anh ấy cũng là người đầu tiên bỏ phiếu cho câu trả lời của tôi, vì vậy vâng. – Valjas

+0

Cẩn thận đọc lại câu hỏi (ngoài ra, người dùng mới không thể upvote cho đến khi họ đạt được 15 đại diện và từ tiểu sử tôi thấy 0 phiếu bầu). –

1

Vì POST trong PHP không gì khác ngoài mảng, chỉ cần lặp qua nó.

foreach($_POST as $k => $v) { 
    echo($k . ': '. $v . '<br>'); 
} 
+0

Vấn đề với điều này là nhiều đầu vào có cùng tên sẽ ghi đè lên giá trị trước đó khi '$ _POST' được tạo ra, trừ khi bạn sử dụng các tên' bracketed [] ', mà OP nói rằng chúng không thể thực hiện được. –

-1

Không có cách nào để POST 2 đầu vào có cùng tên với chuỗi. Bạn nên sửa đổi giỏ hàng thành mảng convent thành chuỗi.

Nếu bạn đang sử dụng GET, bạn có thể kiểm tra chức năng parse_url().

+0

có thể sử dụng tên tham số nhiều lần, chỉ cách php phân tích cú pháp yêu cầu không cho phép bạn truy cập nhiều hơn một tham số như vậy bằng cách sử dụng '$ _POST', vì vậy bạn phải phân tích cú pháp yêu cầu – mata

2

Bạn có thể lấy dữ liệu untainted trực tiếp từ input stream:

file_get_contents('php://input'); 

Vì vậy, nếu bạn có một cái gì đó như thế này:

<input name="type" value="val1"> 
<input name="type" value="val2"> 
<input name="type" value="val3"> 

Bạn sẽ nhận được một chuỗi như thế này:

type=val1&type=val2&type=val3 

Sau đó, bạn có thể phân tích chuỗi này thành một mảng và tạo "dữ liệu bài đăng thô" của riêng bạn.

http://php.net/manual/en/wrappers.php.php

php: // đầu vào là một chỉ đọc dòng cho phép bạn đọc dữ liệu thô ra khỏi cơ thể theo yêu cầu. Trong trường hợp yêu cầu POST, nó thích hợp hơn là để sử dụng đầu vào php: // thay vì $ HTTP_RAW_POST_DATA vì nó không phụ thuộc vào chỉ thị php.ini đặc biệt. Hơn nữa, đối với những trường hợp trong đó $ HTTP_RAW_POST_DATA không được điền theo mặc định, nó có khả năng thay thế bộ nhớ ít hơn để kích hoạt always_populate_raw_post_data.php: // đầu vào không có sẵn với enctype = "multipart/form-data".

+0

Tôi nhìn php: // nhưng tôi không chắc chắn làm thế nào để thực hiện nó. Với những gì bạn cung cấp, tôi đã có thể giải quyết vấn đề của mình ... Cảm ơn bạn rất nhiều. Kelly – user1519293

+0

Giống như thế này: '$ my_data = file_get_contents ('php: // input');', Sau đó phân tích '$ my_data' để nhận các biến của bạn (bạn chỉ ra rằng bạn có thể xử lý phần đó, nếu không thì hãy hỏi). –

0

Nếu bạn muốn xem tất cả $ _POST gửi, var_dump ($ _ POST) hoặc echo print_r ($ _ POST). Điều này sẽ cho bạn thấy tất cả các tên trường và dữ liệu, ngay cả khi tên trường chứa mảng, như partno [] của bạn.

Các vấn đề liên quan