รับ $ _POST จากช่องทำเครื่องหมายหลายช่อง


159

ฉันมี 1 แบบฟอร์มโดยมีช่องทำเครื่องหมายหลายช่อง (แต่ละรหัสมี):

<input type="checkbox" name="check_list" value="<? echo $row['Report ID'] ?>">

ในกรณีที่$row['Report ID']เป็นคีย์หลักในฐานข้อมูล -So แต่ละค่าที่แตกต่างกัน

ฉันจะบอกกล่องกาเครื่องหมายใดที่ได้รับการตรวจสอบแล้วได้อย่างไร (อาจมีหลายรายการ)

นี่เป็นระบบกล่องจดหมายและฉันมีปุ่มด้านล่างที่ฉันต้องการ (เมื่อคลิก) เพื่อลบข้อความทั้งหมด (รหัส:) $row['Report ID']ซึ่งมีการทำเครื่องหมายที่ช่องทำเครื่องหมาย

คำตอบ:


334

ตั้งชื่อในแบบฟอร์มเป็นcheck_list[]และคุณจะสามารถเข้าถึงช่องทำเครื่องหมายทั้งหมดเป็นอาร์เรย์ ( $_POST['check_list'][])

นี่คือตัวอย่างเล็กน้อยตามที่ร้องขอ:

<form action="test.php" method="post">
    <input type="checkbox" name="check_list[]" value="value 1">
    <input type="checkbox" name="check_list[]" value="value 2">
    <input type="checkbox" name="check_list[]" value="value 3">
    <input type="checkbox" name="check_list[]" value="value 4">
    <input type="checkbox" name="check_list[]" value="value 5">
    <input type="submit" />
</form>
<?php
if(!empty($_POST['check_list'])) {
    foreach($_POST['check_list'] as $check) {
            echo $check; //echoes the value set in the HTML form for each checked checkbox.
                         //so, if I were to check 1, 3, and 5 it would echo value 1, value 3, value 5.
                         //in your case, it would echo whatever $row['Report ID'] is equivalent to.
    }
}
?>

4
คุณช่วยยกตัวอย่างช่องทำเครื่องหมาย echo (ไอเอ็นจี) หนึ่งรายการให้ฉันได้ไหม (และมันจะคล้ายกันสำหรับสองคนที่เลือก?) ขอบคุณ
James Andrew

2
ฉันยังควรระบุว่าถ้าไม่มีค่าตั้งใน HTML, จะเท่ากับ$check on
Sean Walsh

9
if($_POST)- ไร้ประโยชน์$_POSTจะเป็นจริงเสมอ คุณควรตรวจสอบ!empty($_POST['check_list'])แทน
Mārtiņš Briedis

3
@ MārtiņšBriedisที่จะทำให้ดัชนีอาร์เรย์ไม่อยู่ในขอบเขตหากไม่มีอยู่ การตรวจสอบที่ดีกว่าคือarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid

2
@Tyzoid empty()ไม่ได้ทำให้เกิดข้อผิดพลาดนี้ จากคู่มือ:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis

22

แก้ไขเพื่อสะท้อนสิ่งที่ @Marc พูดในความคิดเห็นด้านล่าง

คุณสามารถวนซ้ำผ่านค่าที่โพสต์ทั้งหมด

HTML:

<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />

PHP:

foreach($_POST['check_list'] as $item){
  // query to delete where item = $item
}

1
ข้อผิดพลาดแปลก: คำเตือน: อาร์กิวเมนต์ที่ไม่ถูกต้องมีให้สำหรับ foreach () ใน /home1/mountgam/public_html/zombiewrath/reports.php บรรทัดที่ 30 = /
James Andrew

2
สิ่งนี้จะใช้ได้ก็ต่อเมื่อคุณใช้[]ไวยากรณ์ในการกำหนดฟิลด์ซึ่งทำให้ PHP สร้างค่า $ _POST เป็นอาร์เรย์ มิฉะนั้นมันจะเป็นค่าที่ไม่ใช่อาเรย์เดียวทำให้ foreach () วนซ้ำไปมา
Marc B

1
ฉันลองทั้งคู่แล้ว แต่ก็โอเคฉันจะลองอีกครั้ง (โดยไม่มี [] ในรูปแบบ / ชื่อ)
James Andrew

16

คุณต้องตั้งชื่อช่องทำเครื่องหมายของคุณตาม:

<input type="checkbox" name="check_list[]" value="…" />

จากนั้นคุณสามารถเข้าถึงช่องทำเครื่องหมายที่เลือกทั้งหมดด้วย

// loop over checked checkboxes
foreach($_POST['check_list'] as $checkbox) {
   // do something
}

PS ให้แน่ใจว่าได้หลบหนีออกอย่างถูกต้อง ( htmlspecialchars())


12
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

และหลังจากการโพสต์คุณสามารถวนซ้ำได้:

   if(!empty($_POST['check_list'])){
     foreach($_POST['check_list'] as $report_id){
        echo "$report_id was checked! ";
     }
   }

หรือรับค่าบางอย่างที่โพสต์จากหน้าก่อนหน้า:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}

12

ขออภัยหัวข้อเก่า แต่นี่เป็นสิ่งสำคัญที่ต้องพูดถึงเรื่องนี้ซึ่ง @JamesRattray และคนอื่น ๆ กำลังมีปัญหาด้วย

อย่าปิดinputแท็ก (โดยใช้/>) ด้วยตนเองเมื่อคุณพยายามโพสต์หลายค่าลงในสคริปต์ PHP เมื่อคุณปิดแท็กด้วยตนเองจะเป็นการสิ้นสุดข้อกำหนดอาร์เรย์และคุณจะมีค่าเดียวเท่านั้นที่โพสต์ลงในสคริปต์ของคุณเมื่อส่ง ในคำตอบของ @Scone เอฟเฟกต์อาจไม่ทำงานจนกว่าจะถึง/>จะมีการเปลี่ยนแปลง

นี่คือสิ่งที่ทำให้ Warning: Invalid argument supplied for foreach() in /home1/...ข้อผิดพลาด PHP ในกรณีนี้

แก้ไข: ตามที่ระบุไว้ในความคิดเห็นด้านล่างการวิจัยเพิ่มเติมแสดงให้เห็นว่าสิ่งนี้ขึ้นอยู่กับ DOCTYPE หากคุณมีการตั้งค่า DOCTYPE สำหรับ XHTML จะต้องมีการปิดแท็กอินพุต หากคุณมีชุด DOCTYPE เป็น HTML5 จะต้องมีการปิดแท็กอินพุต นอกจากนี้ยังมีโอกาสที่สิ่งนี้อาจถูกกำหนดโดยสิ่งที่เบราว์เซอร์ที่ผู้ใช้กำลังดูหน้าและสิ่งที่ดีตาม DOCTYPE ที่ระบุในรหัส


ไม่ถูกต้อง แท็กอินพุตที่ปิดตัวเองจะไม่มีผลกับค่าที่ส่งไปยัง PHP
Raptor

@ Raptor จากการวิจัยเพิ่มเติมใช่มันสามารถส่งผลกระทบต่อและตามที่คุณพูดไม่ได้ แต่ในการวิจัยเพิ่มเติมนั้นจะได้รับผลกระทบหากตั้งค่า DOCTYPE เท่านั้น HTML5 ไม่รู้จักแท็กที่ปิด (และจะไม่ถูกต้องหากปิด) ในขณะที่ XHTML ไม่ต้องการให้แท็กปิด ดูหน้าข้อมูล W3Schools ได้ที่นี่: ลิงค์
Jon Gallup

@Raptor ในขณะที่ W3Schools อาจเต็มไปด้วยข้อผิดพลาดมันเป็นสิ่งสำคัญที่จะต้องทราบว่าข้อมูลที่มัน (และเว็บไซต์อื่น ๆ ) อาจมีให้ตรงกับคำถาม ฉันแค่บอกว่าในกระบวนการแก้ไขปัญหาข้อมูลใด ๆ เพื่อลองและแก้ไขปัญหาดีกว่าไม่มีข้อมูล ในกรณีนี้หากคุณต้องการการอ้างอิงอื่นW3ระบุว่าแท็กอินพุตจะต้องไม่ปิดในลักษณะใด ๆ เนื่องจากจะไม่เป็นไปตามมาตรฐาน ฉันจะแก้ไขคำตอบดั้งเดิมของฉันเพื่อให้สะท้อนถึง DOCTYPE
Jon Gallup

5

มันค่อนข้างง่าย เอาใจใส่และคุณจะได้รับทันที! :)

คุณจะสร้างอาร์เรย์ html ซึ่งจะถูกส่งไปยังอาร์เรย์ php รหัส html ของคุณจะเป็นดังนี้:

<input type="checkbox" name="check_list[1]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[2]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[3]" alt="Checkbox" value="checked">

ที่ไหน[1] [2] [3]มีIDของข้อความของคุณหมายความว่าคุณจะechoของคุณ$row['Report ID']ในสถานที่ของพวกเขา

จากนั้นเมื่อคุณส่งแบบฟอร์มอาร์เรย์ PHP ของคุณจะมีลักษณะดังนี้:

print_r($check_list)

[1] => checked [3] => checked

ขึ้นอยู่กับสิ่งที่ถูกตรวจสอบและไม่ได้

ฉันแน่ใจว่าคุณสามารถดำเนินการต่อจากจุดนี้ไปข้างหน้า


6
โปรดจำไว้ว่าcheck_list[]จะเริ่มต้นด้วยมากกว่าcheck_list[0] check_list[1]
ผู้ตัดสิน

1
value = "checked" เป็นผลสำเร็จ หากไม่มีการระบุค่าคุณจะได้รับ 'เปิด' ข้อดีของการระบุค่าที่คุณต้องการส่งในแอตทริบิวต์ค่าคือคุณสามารถส่งข้อมูลโดยพลการที่ไม่ต้องกลายเป็นดัชนีอาร์เรย์ PHP การวนซ้ำค่าอาร์เรย์ด้วย foreach นั้นง่ายกว่าการวนคีย์ซ้ำ
Rudiger W.

0

ในขณะที่เขากำลังมองหาในความกล้าหาญ, แท้จริงแล้วไม่มีฉัน vale una matriz.

    // Primero paso las matrices del post a valores separados por coma.
    foreach($_POST as $n => $v) if (is_array($v)) $_POST[$n] = implode(",", $v);

คุณกำลังมองหาผู้หญิงที่น่ารัก 1 ปีที่ผ่านมาและมีอาการโคม่า ในฐานะที่เป็น MySQL การเชื่อมต่อที่ดีขึ้น, การตรวจสอบและการไม่มี o:

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