Nhiều đầu vào có cùng tên thông qua POST trong php


119

Có thể lấy nhiều đầu vào cùng tên để đăng và sau đó truy cập chúng từ PHP không? Ý tưởng là thế này: Tôi có một hình thức cho phép nhập số lượng địa chỉ vật lý không xác định cùng với thông tin khác. Nếu tôi chỉ đơn giản đặt cho mỗi trường đó cùng một tên trong một số mục và gửi dữ liệu đó qua bài đăng, liệu PHP có thể truy cập được không?

Ví dụ, tôi có năm đầu vào trên một trang có tên "xyz" và tôi muốn truy cập chúng bằng PHP. Tôi có thể làm một cái gì đó như:

    $_POST['xyz'][0]

Nếu vậy, điều đó sẽ giúp cuộc sống của tôi dễ dàng hơn gấp mười lần, vì tôi có thể gửi một lượng thông tin không xác định thông qua một biểu mẫu và được máy chủ xử lý chỉ bằng cách lặp qua mảng các mục có tên "xyz".

Câu trả lời:


216

Thay đổi tên của đầu vào của bạn:

<input name="xyz[]" value="Lorem" />
<input name="xyz[]" value="ipsum"  />
<input name="xyz[]" value="dolor" />
<input name="xyz[]" value="sit" />
<input name="xyz[]" value="amet" />

Sau đó:

$_POST['xyz'][0] == 'Lorem'
$_POST['xyz'][4] == 'amet'

Nếu vậy, điều đó sẽ giúp cuộc sống của tôi dễ dàng hơn gấp mười lần, vì tôi có thể gửi một lượng thông tin không xác định thông qua một biểu mẫu và được máy chủ xử lý chỉ bằng cách lặp qua mảng các mục có tên "xyz".

Lưu ý rằng đây có lẽ là giải pháp sai. Rõ ràng, nó phụ thuộc vào dữ liệu bạn đang gửi.


Cảm ơn đã giúp đỡ. Vì đây là câu trả lời đầy đủ nhất cho câu hỏi của tôi, tôi chọn nó làm câu trả lời. Tuy nhiên, câu trả lời từ Interstellar_coder cũng tốt, nhưng bạn đã giải thích rằng điều này có khả năng gây ra sự cố nếu sử dụng không đúng cách. Tôi sẽ giới hạn số lượng mục tối đa và tôi sẽ thực hiện nhiều xác nhận trên biểu mẫu này, vì vậy tôi không nên gặp bất kỳ vấn đề bảo mật nào trừ khi có những vấn đề cố hữu trong phương pháp này chưa được giải thích ở đây.
Adam

10
@Adam: Đã đọc lại câu hỏi của bạn, đây là một cách tiếp cận hoàn toàn có thể buộc tội. Bạn có thể muốn đi thêm một giai đoạn nữa và có address[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... $_POST['address'][0]['city']Chẳng hạn , bạn có thể đọc những điều này với
Eric

Làm thế nào điều này sau đó sẽ được đặt tên trong HTML? Điều đó có khả năng giảm bớt khó khăn khá nhiều. Cách tiếp cận tôi sẽ thực hiện là có một số trường có tên như vậy: l1 [], l2 [], city [], state [], zip [], zip4 []. Sau đó, đối với địa chỉ đầu tiên, tôi chỉ cần sử dụng $ i == 0 trong mỗi trường. Vì vậy, nếu tôi hiểu chính xác cách tiếp cận của bạn, có lẽ tôi sẽ đặt tên cho các yếu tố của mình như vậy: name = "address [] [city]" cho trường thành phố. Đúng không?
Adam

@Adam: Có thể. Tôi nghĩ rằng bạn có thể cần phải đặt chỉ mục bên trong đầu tiên [], chẳng hạn như [0]. Điều đó làm cho HTML khó tạo hơn, nhưng dữ liệu không khó đọc hơn về phía PHP
Eric

Câu hỏi xuất hiện trong đầu tôi là: liệu trường sẽ đi theo thứ tự ngẫu nhiên bên trong mảng? hoặc chúng sẽ được sắp xếp theo thứ tự trong đó (ngay cả khi một số trường bị bỏ trống)?
rajeev

38

Trong html của bạn, bạn có thể chuyển vào một mảng cho tên tức là

<input type="text" name="address[]" /> 

Bằng cách này, php sẽ nhận được một loạt các địa chỉ.


3
Câu trả lời hay và đúng, đó là lý do tại sao tôi bỏ phiếu. Bạn đã không giải thích nhiều về nó mặc dù, đó là lý do tại sao tôi không chọn nó làm câu trả lời cho câu hỏi của mình. Điều này giúp tôi rất nhiều, vì tôi đã cố gắng tìm ra điều này trong một thời gian (như bạn có thể nhận thấy trong một trong những câu hỏi trước đây của tôi). Cách tiếp cận trước đây của tôi chỉ đơn giản là thêm tất cả các đầu vào vào các trường ẩn với các giá trị được phân tách * và đặt lại các trường đầu vào, nhưng cách tiếp cận này tốt hơn gấp mười lần vì tôi sẽ có thể cho phép xóa các địa chỉ được thêm trước đó nếu chúng được phát hiện sai.
Adam

Chỉ cần cẩn thận để nhớ rằng một mảng trống sẽ có số lượng 1 đã được POST mà không có gì ở chỉ số '0'. Bạn sẽ cần kiểm tra bằng cách sử dụng từ khóa 'trống' nếu (! Trống ($ ArrayName)) {// làm gì đó}
Fi Horan

10

Câu trả lời của Eric là đúng, nhưng vấn đề là các trường không được nhóm lại. Hãy tưởng tượng bạn có nhiều đường phố và thành phố thuộc về nhau:

<h1>First Address</h1>
<input name="street[]" value="Hauptstr" />
<input name="city[]" value="Berlin"  />

<h2>Second Address</h2>
<input name="street[]" value="Wallstreet" />
<input name="city[]" value="New York" />

Kết quả sẽ là

$POST = [ 'street' => [ 'Hauptstr', 'Wallstreet'], 
          'city' => [ 'Berlin' , 'New York'] ];

Để nhóm chúng theo địa chỉ, tôi muốn khuyên bạn nên sử dụng những gì Eric cũng đã đề cập trong phần bình luận:

<h1>First Address</h1>
<input name="address[1][street]" value="Hauptstr" />
<input name="address[1][city]" value="Berlin"  />

<h2>Second Address</h2>
<input name="address[2][street]" value="Wallstreet" />
<input name="address[2][city]" value="New York" />

Kết quả sẽ là

$POST = [ 'address' => [ 
                 1 => ['street' => 'Hauptstr', 'city' => 'Berlin'],
                 2 => ['street' => 'Wallstreet', 'city' => 'New York'],
              ]
        ]

0

Đối với bất kỳ ai khác tìm thấy điều này - đáng lưu ý rằng bạn có thể đặt giá trị khóa trong tên đầu vào. Nhờ câu trả lời trong BÀI ĐĂNG Trường mẫu có cùng thuộc tính Tên, bạn cũng có thể tương tác các chuỗi hoặc số nguyên mà không cần trích dẫn.

Các câu trả lời cho rằng bạn không bận tâm đến giá trị khóa quay lại cho PHP tuy nhiên bạn có thể đặt name=[yourval](chuỗi hoặc int), sau đó cho phép bạn tham khảo một bản ghi hiện có.


Điều này là vô nghĩa để tự phân tích nó. Không có kịch bản nào là cần thiết.
Javid

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.