อินพุตหลายรายการที่มีชื่อเดียวกันผ่าน POST ใน php


119

เป็นไปได้หรือไม่ที่จะรับอินพุตหลายชื่อเดียวกันเพื่อโพสต์แล้วเข้าถึงจาก PHP? แนวคิดคือ: ฉันมีแบบฟอร์มที่อนุญาตให้ป้อนที่อยู่ทางกายภาพไม่ จำกัด จำนวนพร้อมกับข้อมูลอื่น ๆ ถ้าฉันเพียงแค่ให้แต่ละฟิลด์เหล่านั้นชื่อเดียวกันในหลาย ๆ รายการและส่งข้อมูลนั้นทางโพสต์ PHP จะสามารถเข้าถึงได้หรือไม่

ตัวอย่างเช่นฉันมีอินพุตห้ารายการในหนึ่งเพจชื่อ "xyz" และฉันต้องการเข้าถึงโดยใช้ PHP ฉันสามารถทำสิ่งที่ชอบ:

    $_POST['xyz'][0]

ถ้าเป็นเช่นนั้นจะทำให้ชีวิตของฉันง่ายขึ้นสิบเท่าเนื่องจากฉันสามารถส่งข้อมูลจำนวนไม่ จำกัด ผ่านแบบฟอร์มและให้เซิร์ฟเวอร์ประมวลผลโดยการวนลูปผ่านอาร์เรย์ของรายการที่มีชื่อ "xyz"

คำตอบ:


217

เปลี่ยนชื่ออินพุตของคุณ:

<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" />

แล้ว:

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

ถ้าเป็นเช่นนั้นจะทำให้ชีวิตของฉันง่ายขึ้นสิบเท่าเนื่องจากฉันสามารถส่งข้อมูลจำนวนไม่ จำกัด ผ่านแบบฟอร์มและให้เซิร์ฟเวอร์ประมวลผลโดยการวนลูปผ่านอาร์เรย์ของรายการที่มีชื่อ "xyz"

โปรดทราบว่านี่อาจเป็นวิธีแก้ปัญหาที่ผิด แน่นอนขึ้นอยู่กับข้อมูลที่คุณกำลังส่ง


ขอบคุณสำหรับความช่วยเหลือ เนื่องจากนี่เป็นคำตอบที่สมบูรณ์ที่สุดสำหรับคำถามของฉันฉันจึงเลือกเป็นคำตอบ อย่างไรก็ตามคำตอบจาก Interstellar_coder ก็ดีเช่นกัน แต่คุณได้อธิบายว่าอาจเป็นข้อผิดพลาดหากใช้ไม่ถูกต้อง ฉันจะ จำกัด จำนวนรายการสูงสุดและฉันจะทำการตรวจสอบความถูกต้องในแบบฟอร์มนี้เป็นจำนวนมากดังนั้นฉันจึงไม่ควรประสบปัญหาด้านความปลอดภัยใด ๆ เว้นแต่จะมีปัญหาในแนวทางนี้ซึ่งยังไม่ได้อธิบายไว้ที่นี่
อดัม

10
@Adam: เมื่ออ่านคำถามของคุณอีกครั้งนี่เป็นแนวทางที่เข้าถึงได้อย่างสมบูรณ์แบบ คุณอาจต้องการที่จะไปหนึ่งขั้นตอนต่อไปและมีaddress[0][street] address[0][city] address[0][zip], address[1][street] address[1][city] address[1][zip]... คุณสามารถอ่านเหล่านี้ด้วย$_POST['address'][0]['city']ตัวอย่างเช่น
เอริค

สิ่งนี้จะตั้งชื่อใน HTML ได้อย่างไร นั่นอาจจะช่วยบรรเทาความยุ่งยากได้มากทีเดียว แนวทางที่ฉันจะทำคือมีหลายช่องที่มีชื่อดังนี้: l1 [], l2 [], เมือง [], รัฐ [], zip [], zip4 [] จากนั้นสำหรับที่อยู่แรกฉันใช้ $ i == 0 ในแต่ละช่อง ดังนั้นถ้าฉันเข้าใจแนวทางของคุณอย่างถูกต้องฉันอาจจะตั้งชื่อองค์ประกอบของฉันเช่นนี้: name = "address [] [city]" สำหรับฟิลด์เมือง ถูกต้องหรือไม่
Adam

@Adam: เป็นไปได้. ฉันคิดว่าคุณอาจต้องวางดัชนีไว้ในตัวแรก[]เช่น[0]. นั่นทำให้ HTML สร้างยากขึ้น แต่ข้อมูลไม่ยากที่จะอ่านฝั่ง PHP
Eric

คำถามที่อยู่ในใจของฉันที่นี่คือฟิลด์จะเรียงลำดับแบบสุ่มภายในอาร์เรย์หรือไม่ หรือจะเป็นไปตามลำดับที่วางไว้ในรูปแบบ (แม้ว่าบางช่องจะว่างเปล่าก็ตาม)?
rajeev

38

ใน html ของคุณคุณสามารถส่งผ่านอาร์เรย์สำหรับชื่อ ie

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

วิธีนี้ php จะได้รับอาร์เรย์ของที่อยู่


3
คำตอบที่ดีและถูกต้องนี่คือเหตุผลที่ฉันโหวตให้ คุณไม่ได้อธิบายอะไรมากเกี่ยวกับเรื่องนี้ซึ่งเป็นสาเหตุที่ฉันไม่เลือกเป็นคำตอบสำหรับคำถามของฉัน สิ่งนี้ช่วยฉันได้มากเพราะฉันพยายามคิดออกมาระยะหนึ่งแล้ว (ดังที่คุณสังเกตเห็นในคำถามก่อนหน้านี้) วิธีการก่อนหน้าของฉันคือเพียงแค่เพิ่มอินพุตทั้งหมดลงในฟิลด์ที่ซ่อนด้วยค่าที่คั่นด้วย * และรีเซ็ตฟิลด์อินพุต แต่วิธีนี้ดีกว่าสิบเท่าเนื่องจากฉันจะสามารถอนุญาตให้ลบที่อยู่ที่เพิ่มไว้ก่อนหน้านี้ได้หากพบว่าเป็น ไม่ถูกต้อง
อดัม

ระวังอย่าลืมว่าอาร์เรย์ว่างจะมีการนับ 1 เมื่อถูก POST 'โดยไม่มีอะไรเลยที่ดัชนี' 0 ' คุณจะต้องตรวจสอบโดยใช้คีย์เวิร์ด "empty" if (! empty ($ arrayName)) {// do something}
Fi Horan

10

คำตอบของ Eric ถูกต้อง แต่ปัญหาคือเขตข้อมูลไม่ได้ถูกจัดกลุ่ม ลองนึกภาพคุณมีถนนและเมืองหลายแห่งที่อยู่ร่วมกัน:

<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" />

ผลลัพธ์จะเป็นอย่างไร

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

หากต้องการจัดกลุ่มตามที่อยู่ฉันอยากแนะนำให้ใช้สิ่งที่ Eric กล่าวถึงในส่วนความคิดเห็น:

<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" />

ผลลัพธ์จะเป็นอย่างไร

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

0

สำหรับใครก็ตามที่พบสิ่งนี้ - เป็นที่น่าสังเกตว่าคุณสามารถตั้งค่าคีย์ในชื่ออินพุตได้ ขอบคุณสำหรับคำตอบในการโพสต์ฟิลด์แบบฟอร์มที่มีแอตทริบิวต์ชื่อเดียวกันคุณยังสามารถเล่นสตริงหรือจำนวนเต็มได้โดยไม่ต้องอ้าง

คำตอบสมมติว่าคุณไม่สนใจค่าคีย์ที่จะกลับมาสำหรับ PHP แต่คุณสามารถตั้งค่าname=[yourval](สตริงหรือ int) ซึ่งจะช่วยให้คุณสามารถอ้างถึงระเบียนที่มีอยู่ได้


นี่เป็นเรื่องไร้สาระที่จะแยกวิเคราะห์ด้วยตัวคุณเอง ไม่มีสถานการณ์ที่จำเป็น
Javid

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.