ปุ่มส่งสองปุ่มในแบบฟอร์มเดียว


534

ฉันมีปุ่มส่งสองปุ่มในแบบฟอร์ม ฉันจะทราบได้อย่างไรว่าเซิร์ฟเวอร์ตัวใดที่ถูกโจมตีด้านเซิร์ฟเวอร์


ลองเปลี่ยนคำตอบที่ยอมรับให้เป็นคำตอบของแพร์รอทส์
Peter Mortensen

2
@PeterMortensen - ทั้งคำตอบที่ได้รับการยอมรับหรือคำตอบของนกแก้วเป็นวันที่ดีที่สุด ดูคำตอบของลีโอสำหรับการแก้ปัญหา HTML5 formactionใหม่ใช้แอตทริบิวต์ หรือดูคำตอบของ kirilเพื่อให้ผู้ใช้สามารถเห็น HTML ได้โดยไม่ขึ้นกับค่าที่ส่งไปยังเบราว์เซอร์ - แก้ปัญหาสากลในวิธีที่ง่ายต่อการใช้โค้ดมากกว่าคำตอบของ Greg หรือ Parrot
ToolmakerSteve

คำตอบ:


446

หากคุณตั้งชื่อให้แต่ละคนชื่อที่ถูกคลิกจะถูกส่งผ่านเป็นอินพุตอื่น ๆ

<input type="submit" name="button_1" value="Click me">

101
ตรวจสอบให้แน่ใจว่าชื่อของปุ่มนั้นมีชื่อที่ถูกต้อง! ตัวอย่างเช่น "button-1" จะไม่ทำงาน อาจช่วยคนอื่นให้ยุ่งยากได้มากดังนั้นโปรดระลึกไว้เสมอ
pdolinaj

22
โดยปกติอินพุตทั้งหมดในฟอร์มจะถูกส่งไปพร้อมกับฟอร์ม เนื่องจากมีการส่งค่าของปุ่มเมื่อคลิกเท่านั้นคุณจะต้องค้นหาค่าแบบฟอร์มสำหรับชื่อที่กำหนดไว้ล่วงหน้าเหล่านี้ ฉันคิดว่าคำตอบอื่น ๆ ( stackoverflow.com/a/21778226/88409 ) ที่เกี่ยวข้องกับการตั้งชื่อให้พวกเขาทุกคนมีค่าแตกต่างกัน จากนั้นคุณเพิ่งคว้าค่าภายใต้ชื่อเขตข้อมูลแบบฟอร์มเดียวที่รู้จัก นอกจากนี้ยังทำให้เห็นได้ชัดว่าจะมีการส่งค่าเพียงหนึ่งค่า (ค่าที่คลิก) สำหรับชื่ออินพุตที่กำหนดเช่นเดียวกับที่ปุ่มตัวเลือกทำงาน (ชื่อเดียวกันค่าที่แตกต่างกัน)
Triynko

6
@Triynko ตามที่ Robin Green กล่าวไว้ในความคิดเห็นของคำตอบนั้นอันนี้ดีกว่าสำหรับความเป็นสากล ตัวอย่างเช่นหากหน้าเว็บแสดงผลเป็นภาษาสเปนข้อความของปุ่มอาจแตกต่างกัน ดังนั้นการมีตรรกะของรหัสของคุณขึ้นอยู่กับข้อความของปุ่มนั้นจะทำให้แตกในกรณีนั้น การใช้ชื่อนั้นปลอดภัยกว่าเนื่องจากเป็นค่าที่ไม่ได้แสดงต่อผู้ใช้ดังนั้นจึงสามารถถือได้ว่าเป็นตัวแปร "ส่วนตัว" และน้อยกว่าเป็นข้อความถึงผู้ใช้
sfarbota

ชี้แจง @ คิดเห็น sfarbota: ที่แรกวิธีการแก้ปัญหาที่ปรากฏในคำตอบของนกแก้วเป็นปัญหาในขณะที่มันอาศัยอยู่กับการทดสอบผู้ใช้มองเห็นค่า นั่นคือพิรุธ - รหัสที่แตกเมื่อเปลี่ยนคำที่ผู้ใช้มองเห็นได้ถือว่าเป็น "เปราะบาง" สองวิธีการแก้ปัญหาที่ปรากฏในคำตอบของนกแก้วดี - มันเป็นเช่นเดียวกับคนนี้ ทางออกที่สองของ Parrot ยังแสดงรหัสที่สอดคล้องกันในการเขียนดังนั้นมันจึงเป็นคำตอบที่มีประโยชน์มากกว่าคำตอบนี้
ToolmakerSteve

2
ดูคำตอบของลีโอสำหรับการแก้ปัญหา HTML5 formactionใหม่ใช้แอตทริบิวต์ หรือดูคำตอบของ kirilเพื่อให้ผู้ใช้สามารถเห็น HTML ได้โดยไม่ขึ้นอยู่กับค่าที่ส่งไปยังเบราว์เซอร์เพื่อแก้ปัญหาความเป็นสากล
ToolmakerSteve

875

โซลูชันที่ 1:
ให้ค่าที่แตกต่างกันสำหรับแต่ละอินพุตและใช้ชื่อเดิม:

<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />

จากนั้นในการตรวจสอบรหัสเพื่อดูสิ่งที่ถูกทริกเกอร์:

if ($_POST['action'] == 'Update') {
    //action for update here
} else if ($_POST['action'] == 'Delete') {
    //action for delete
} else {
    //invalid action!
}

ปัญหาคือคุณผูกตรรกะของคุณกับข้อความที่ผู้ใช้มองเห็นได้ในการป้อนข้อมูล


โซลูชันที่ 2:
ตั้งชื่อที่ไม่ซ้ำกันและตรวจสอบ $ _POST สำหรับการมีอยู่ของอินพุตนั้น:

<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />

และในรหัส:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}

37
สำหรับวัตถุประสงค์ของ i18n การใช้คำตอบที่เลือกอาจดีกว่า
Robin Green

11
@LaszloPapp ตามที่คำตอบบอกไว้ว่าถ้าคุณใช้คำตอบที่เลือกไว้ด้านบนคุณสามารถทำให้ฟอร์มเป็นสากล (เช่นแปลเป็นภาษาอื่นหรือภาษาถิ่น) โดยไม่กระทบต่อตรรกะ หากคุณใช้ตัวเลือกแรกในคำตอบนี้ตรรกะจะขึ้นอยู่กับภาษาที่นำเสนอจริง ๆ แบบฟอร์ม
Robin Green

1
@ RobinGreen: ฉันคิดว่าคนส่วนใหญ่จะใช้ตรรกะที่สองใช่ไหม?
lpapp

5
i18n = i [nternationalizatio] n และ 18 หมายถึงตัวอักษร 18 ตัวระหว่างตัวแรกและตัวสุดท้าย
Buttle Butkus

18
OP ไม่ได้ขอ PHP
Rudey

110

ทางออกที่ดียิ่งขึ้นประกอบด้วยการใช้แท็กปุ่มเพื่อส่งแบบฟอร์ม:

<form>
    ...
    <button type="submit" name="action" value="update">Update</button>
    <button type="submit" name="action" value="delete">Delete</button>
</form>

HTML ภายในปุ่ม (เช่น..>Update<..เป็นสิ่งที่ผู้ใช้เห็นเนื่องจากมี HTML ที่ให้valueผู้ใช้ไม่สามารถมองเห็นได้จะถูกส่งไปยังเซิร์ฟเวอร์เท่านั้นวิธีนี้ไม่มีความไม่สะดวกกับการใช้ภาษาสากลและภาษาที่แสดงหลายภาษา (ใน วิธีแก้ปัญหาเดิมฉลากของปุ่มยังเป็นค่าที่ส่งไปยังเซิร์ฟเวอร์)


13
เห็นได้ชัดว่าพฤติกรรมของเบราว์เซอร์แตกต่างกัน บางคนส่งแอตทริบิวต์ค่าสตริงอื่น ๆ ระหว่างแท็ก ... ดังนั้นโปรดระวังด้วยสิ่งนี้
Jeroen Dierckx

1
ฉันคิดว่าข้อมูลโค้ดที่ให้นั้นได้รับการสนับสนุนอย่างสมบูรณ์ ( w3schools.com/tags/att_button_type.asp )
kiril

2
@kiril ตัวอย่างข้อมูลจากการเชื่อมโยงที่ใช้สองประเภทต่าง ๆ<button>: และsubmit resetโปรดทราบresetว่าไม่ได้ส่งอะไรเลยมันเพียงรีเซ็ตฟอร์ม ดังนั้นข้อโต้แย้งของ Jeroen ยังคงอยู่
fizruk

7
ตกลงคุณถูก จากนั้นฉันตรวจสอบ HTML5 W3C Working Draft Quoting: >> แอตทริบิวต์ value ให้คุณค่าขององค์ประกอบสำหรับวัตถุประสงค์ในการส่งแบบฟอร์ม ค่าขององค์ประกอบคือค่าของแอตทริบิวต์ค่าขององค์ประกอบถ้ามีหนึ่งหรือสตริงที่ว่างเปล่าเป็นอย่างอื่น >> หมายเหตุ: ปุ่ม (และค่าของมัน) จะรวมอยู่ในการส่งแบบฟอร์มเท่านั้นหากปุ่มนั้นถูกใช้เพื่อเริ่มการส่งแบบฟอร์ม
คิริล

8
@Jeroen Bull เบราว์เซอร์ใดที่ส่งข้อความระหว่างแท็ก อินพุตหรือปุ่มควรส่งแอตทริบิวต์ 'value' เท่านั้น ปุ่มสามารถมีอะไรก็ได้ระหว่างแท็กนั้นรวมถึงรูปภาพหรือแท็ก HTML อื่น ๆ นั่นคือจุดรวมของการใช้ปุ่มบนองค์ประกอบอินพุตและคุณพยายามแนะนำให้เบราว์เซอร์กำลังจะถ่ายโอนเนื้อหาทั้งหมดนั้นเป็นค่าหรือไม่ ไม่มีทาง.
Triynko

93

มีวิธีการ HTML5 ใหม่สำหรับformactionคุณลักษณะนี้:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

เห็นได้ชัดว่าสิ่งนี้ไม่ทำงานใน IE9 และก่อนหน้านี้ แต่สำหรับเบราว์เซอร์อื่น ๆ คุณควรจะปรับ (ดู: w3schools.com HTML <button> formaction แอตทริบิวต์ )

โดยส่วนตัวแล้วฉันใช้จาวาสคริปต์เพื่อส่งแบบฟอร์มจากระยะไกล ระหว่างคนสองคนคนเดียวที่ไม่ได้ครอบคลุมคือ IE <9 ที่ปิดใช้งาน Javascript

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

แก้ไข: ตามที่ระบุไว้โดย Pascal_dher ในความคิดเห็นคุณลักษณะนี้มีอยู่ใน<input>แท็กด้วยเช่นกัน


1
มีให้สำหรับแท็ก "อินพุต" Accoding to w3schools: เมื่อใช้แท็กปุ่มเบราว์เซอร์ที่แตกต่างกันอาจส่งค่าที่แตกต่าง: w3schools.com/tags/tag_button.asp
Pascal_dher

3
ฉันเป็นนักพัฒนาเว็บไซต์มา 12 ปีแล้วและนี่คือสิ่งใหม่สำหรับฉันและเป็นสิ่งที่ฉันต้องการจริงๆ ขอบคุณ!
KyleFarris

1
คุณยินดีต้อนรับ @KyleFarris! ฉันเชื่อว่าสิ่งนี้ได้กลายเป็นไปได้ค่อนข้างเร็ว ๆ นี้ดังนั้นจึงไม่แปลกใจถ้าคุณยังไม่เจอ
Leo

2
หมายเหตุให้กับผู้ใช้ทางรถไฟ: form_tagการเพิ่มคุณลักษณะนี้จะไม่ทำงานหากรูปแบบของคุณจะถูกสร้างขึ้นโดยใช้ วิธีเดียวที่ผมได้รับมันในการทำงานคือการเปลี่ยนไปและการใช้งานform_for f.submit formaction: 'your_path'
fgblomqvist


27

มันง่ายมากที่จะทดสอบ

<form action="" method="get">

<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">

</form>

เพียงแค่ใส่มันในหน้า HTML ให้คลิกปุ่มและดูที่ URL


5
การใช้ GET ที่นี่เป็นวิธีปฏิบัติที่ไม่ดีนักเราควรใช้ POST เมื่อเป็นไปได้
Syncrossus

6
@Syncrossus นั่นสำหรับการทดสอบ
Etienne Martin

22

ใช้formactionแอตทริบิวต์ HTML (บรรทัดที่ 5):

<form action="/action_page.php" method="get">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br>
    <button type="submit">Submit</button><br>
    <button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>

2
นี้จะคล้ายกับคำตอบก่อนหน้านี้ของลีโอ
ToolmakerSteve

@ToolmakerSteve - แต่ผู้ใช้ที่มีupvoted เลือกของคุณ !!
user12379095

21
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>

คุณสมบัติ HTML5 ทำงานได้อย่างสมบูรณ์บนเว็บเบราว์เซอร์ที่ผ่านมาขอบคุณ!
Stephane Lallemagne

1
หมายเหตุ: สิ่งนี้ดูเหมือนจะเหมือนกับคำตอบก่อนหน้าของ Leoยกเว้นว่ามันแสดงให้เห็นถึงการใช้inputแท็กแทนที่จะใช้buttonแท็ก
ToolmakerSteve

11

วิธีที่ดีที่สุดในการจัดการกับปุ่มส่งหลายปุ่มคือการใช้ตัวพิมพ์สลับในสคริปต์เซิร์ฟเวอร์

<form action="demo_form.php" method="get">

Choose your favorite subject:

<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>

</form>

รหัสเซิร์ฟเวอร์ / สคริปต์เซิร์ฟเวอร์ - ที่ที่คุณส่งแบบฟอร์ม:

demo_form.php

<?php

switch($_REQUEST['subject']) {

    case 'html': //action for html here
                break;

    case 'css': //action for css here
                break;

    case 'javascript': //action for javascript here
                        break;

    case 'jquery': //action for jquery here
                    break;
}

?>

ที่มา: W3Schools.com


ใช่คุณต้องมีความคิดเกี่ยวกับสคริปต์การกระทำ (เทคโนโลยีสคริปต์ฝั่งเซิร์ฟเวอร์) คุณสามารถใช้สคริปต์ / ไฟล์ใด ๆ เพื่อประมวลผลข้อมูลที่ส่งมาเช่น php, asp, jsp เป็นต้น <form action="demo_form.php" method="get">
Shailesh Sonare

ตกลง. สิ่งนี้ทำให้เกิดความสับสนเนื่องจากมีภาษาชื่อ ActionScript ด้วย คุณควรพูดว่า: "server code" หรือ "server script" แทน
พลเรือน

ฉันไม่รู้ว่าคุณสามารถทำสิ่งนั้นได้ด้วยปุ่ม
William Isted

10

อาจเป็นวิธีการแก้ปัญหาที่แนะนำที่นี่ทำงานในปี 2009 แต่ ive ทดสอบคำตอบ upvoted ทั้งหมดนี้และไม่มีใครทำงานในเบราว์เซอร์ใด ๆ

ทางออกเดียวที่ฉันพบว่าทำงานคือ: (แต่มันน่าเกลียดเล็กน้อยที่จะใช้ฉันคิดว่า)

<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>


2
ทำไมไม่ใช้เพียงformaction="actionurl1"? คุณไม่ต้องการจาวาสคริปต์
rybo111

3
@ rybo111 เบราว์เซอร์ IE9 (แม่มดยังค่อนข้างใช้กันอย่างแพร่หลาย) ไม่รองรับformaction
clueless007

1
@inaliaghle True มีผู้ใช้ประมาณ 1% - ขึ้นอยู่กับเป้าหมายของโครงการ ประมาณ 1% ของผู้ใช้ไม่ใช้ JavaScript
rybo111

1
สำหรับผู้อ่านในอนาคต: ไม่มีอะไรผิดปกติกับการใช้จาวาสคริปต์ในคำตอบนี้ มันเป็นทักษะที่มีประโยชน์ที่จะรู้ OTOH คำตอบที่ได้รับการโหวตสูงขึ้นนั้นก็ใช้ได้ผลเช่นกัน - ไม่ต้องสนใจประโยคนำของคำตอบนี้ หากด้วยเหตุผลบางประการที่คุณไม่สามารถหาคำตอบอื่น ๆ ให้ทำงานได้ให้โพสต์รหัสที่สมบูรณ์ของคุณเป็นคำถาม SO อธิบายว่าเกิดอะไรขึ้น (หรือไม่เกิดขึ้น) และถามสิ่งที่คุณทำผิด
ToolmakerSteve

6

กำหนดเป็นnamearray

<form action='' method=POST>
    (...) some input fields (...)
    <input type=submit name=submit[save] value=Save>
    <input type=submit name=submit[delete] value=Delete>
</form>

ตัวอย่างรหัสเซิร์ฟเวอร์ (PHP):

if (isset($_POST["submit"])) {
    $sub = $_POST["submit"];

    if (isset($sub["save"])) {
        // save something;
    } elseif (isset($sub["delete"])) {
        // delete something
    }
}

elseifสำคัญมากเพราะทั้งคู่จะถูกแยกวิเคราะห์ถ้าไม่ สนุก.


ตอนนี้นี่เป็นข้อเสนอแนะที่ยอดเยี่ยม - ส่วนใหญ่เป็นเพราะคุณสามารถเพิ่มปุ่มได้มากขึ้นด้วยกรณีที่ง่ายขึ้นและใช้switchกับการกระทำเริ่มต้นหากมีการเพิ่มปุ่มและลืมที่จะเพิ่มลงในswitch(และ / หรือสะกดผิด ฯลฯ )
Gwyneth Llewelyn

@Pato ยังได้เพิ่มคำตอบที่คล้ายกันซึ่งอาจเป็นไปได้มากกว่า แต่คุณทำงานได้ดี!
Gwyneth Llewelyn

1
@GwynethLlewelyn ฉันไม่เห็นคำตอบอื่น ๆ อีกหรือไม่ได้แจ้งให้ทราบเมื่อฉันเขียนของฉันเอง จริงๆแล้วมันเหมือนกัน แต่นี่เป็นการเน้นว่าคนส่วนใหญ่ชอบตรรกะนี้ ความแตกต่างเป็นเพียงชื่อด้วยเหตุผลทางความหมายความเข้าใจที่ดีสำหรับมือใหม่หรือใครก็ตามที่ชอบเริ่มต้นด้วย
Thielicious

5

เนื่องจากคุณไม่ได้ระบุวิธีการใช้สคริปต์ฝั่งเซิร์ฟเวอร์ฉันจะให้ตัวอย่างที่เหมาะกับ Python โดยใช้ CherryPy (แม้ว่ามันอาจจะมีประโยชน์สำหรับบริบทอื่น ๆ ด้วย):

<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>

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

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code

3
<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>

2

ฉันคิดว่าคุณควรจะสามารถอ่านชื่อ / ค่าในอาร์เรย์ GET ของคุณ ฉันคิดว่าปุ่มที่ไม่ได้คลิกจะไม่ปรากฏในรายการนั้น


คุณอาจหมายถึงอาร์เรย์ POST
ypnos

3
ไม่จำเป็นว่าถ้าวิธีของแบบฟอร์มคือ "POST" มันจะไม่ปรากฏในอาร์เรย์ GET แบบฟอร์มส่วนใหญ่จะถูกส่งผ่านทาง POST
แพร์รอทส์

2
ทั้ง / หรือถูกต้องทางเทคนิคและยังผิด คุณสามารถส่งแบบฟอร์มที่มีเมธอด = "GET" แต่มันก็เป็นสิ่งสำคัญ
Bill the Lizard

4
มันเป็นเพียง "cringeworthy" เมื่อใช้อย่างไม่เหมาะสม: w3.org/2001/tag/doc/whenToUseGet.html
Mercator

2
ใช่ฉันไม่ได้พยายามที่จะแนะนำ GET ฉันแค่พยายามพูดคุยเรื่องต่าง ๆ
John Bubriski

1

คุณสามารถทำได้เช่นนี้ (ฉันคิดว่ามันสะดวกมากถ้าคุณมีอินพุต N)

<input type="submit" name="row[456]" value="something">
<input type="submit" name="row[123]" value="something">
<input type="submit" name="row[789]" value="something">

กรณีการใช้งานทั่วไปจะใช้รหัสที่แตกต่างจากฐานข้อมูลสำหรับแต่ละปุ่มดังนั้นคุณสามารถทราบได้ในภายหลังในแถวที่เซิร์ฟเวอร์ถูกคลิก

ในฝั่งเซิร์ฟเวอร์ (PHP ในตัวอย่างนี้) คุณสามารถอ่าน "แถว" เป็นอาร์เรย์เพื่อรับ ID $_POST['row']จะเป็นอาร์เรย์ที่มีองค์ประกอบเดียวในรูปแบบ[ id => value ](ตัวอย่างเช่น:[ '123' => 'something' ] )

ดังนั้นในการรับ id ที่ถูกคลิกคุณต้อง:

$index = key($_POST['row']);

http://php.net/manual/en/function.key.php


นี่คล้ายกับคำตอบที่ @Thielicious โพสต์แต่คุณอาจมีสำนวนมากกว่า โดยส่วนตัวแล้วฉันชอบใช้แท็กตัวอักษรและตัวเลขสำหรับดัชนี (ตรงข้ามกับตัวเลข) เพื่อให้สามารถอ่านได้ (ง่ายต่อการจดจำสิ่งที่แต่ละปุ่มควรทำ) แต่เป็น YMMV แต่การใช้ประโยชน์จาก$_POST['row']การเป็นอาร์เรย์เชื่อมโยงนั้นฉลาด!
Gwyneth Llewelyn

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

ทำได้ดี! ใช่ฉันเห็นด้วยตอนนี้ชัดเจนยิ่งขึ้น ฉันยังเชื่อว่าคำตอบของคุณดีกว่าคำตอบของ @Thielicious เล็กน้อย (และอาจมีประสิทธิภาพมากกว่าโดยเฉพาะถ้ามีปุ่มจำนวนมาก)
Gwyneth Llewelyn

1

คุณ formaction สำหรับหลายปุ่มส่งในตัวอย่างแบบฟอร์มเดียว

 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress"> 
 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress"> 

0

ง่าย ๆ คุณสามารถเปลี่ยนการกระทำของแบบฟอร์มบนปุ่มส่งที่แตกต่างกันคลิก

ลองสิ่งนี้ในเอกสารพร้อม

$(".acceptOffer").click(function () {
       $("form").attr("action", "/Managers/SubdomainTransactions");
});

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});

0

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

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"

สิ่งนี้จะไม่ทำงานสำหรับคอนโทรลเลอร์ภายใต้POSTเส้นทาง
Xavi Montero

ดังนั้น "ส่งรับ"
Jonathan Laliberte

3
ฉันขอโทษที่ไม่เห็นด้วย แต่GETไม่เหมาะเสมอไป หากคุณ "แก้ไขสถานะของแบบจำลองของคุณ" คุณไม่ควรใช้ a GETเนื่องจากการรีเฟรชเบราว์เซอร์อาจทำให้เกิดการส่งคำขอเดียวกันสองครั้งอย่างโปร่งใส ใช้GETเพื่อ "ดู" สิ่งต่าง ๆ เท่านั้นและPOSTเพื่อส่งคำขอการเปลี่ยนแปลงสถานะ (เพิ่มลบแก้ไข ฯลฯ ) จากนั้นในPOSTการดำเนินการควบคุมของคุณเปลี่ยนสถานะ (ฐานข้อมูล, sesion ... ) และส่งการตอบสนองการเปลี่ยนเส้นทางที่GETจะเปลี่ยนสถานะใหม่ การทำGETแบบจำลองสภาวะเปลี่ยนแปลงนั้นสกปรกมากและ coder ที่ดีควรหลีกเลี่ยง ขอโทษที่ต้องบอกว่า ล้างรหัส rulez
Xavi Montero

จริง แต่บางครั้งการเล่นสกปรกอาจทำความสะอาดได้ ขึ้นอยู่กับสิ่งที่คุณกำลังทำอย่างแน่นอน โดยส่วนตัวแล้วมันจะไม่แมปการลบและแก้ไขการร้องขอในการรับ แต่มีวิธีที่จะทำให้มันทำงาน .. เช่นการตรวจสอบว่ามันถูกลบไปแล้วหรือการตรวจสอบว่าผู้ใช้มีสิทธิ์ที่จะทำ ฯลฯ ...
Jonathan Laliberte

-1

คุณสามารถแสดงปุ่มดังนี้:

<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">

จากนั้นในรหัสคุณสามารถรับค่าโดยใช้:

if request.method == 'POST':
    #valUnits = request.POST.get('unitsInput','')
    #valPrice = request.POST.get('priceInput','')
    valType = request.POST.get('typeBtn','')

(valUnits และ valPrice เป็นค่าอื่นที่ฉันแยกออกมาจากแบบฟอร์มที่ฉันทิ้งไว้เพื่อเป็นภาพประกอบ)


-1

เนื่องจากคุณไม่ได้ระบุวิธีการใช้สคริปต์ฝั่งเซิร์ฟเวอร์คุณจะให้ตัวอย่างที่เหมาะกับ PHP

<?php
   if(isset($_POST["loginForm"]))
   {
    print_r ($_POST); // FOR Showing POST DATA
   }
   elseif(isset($_POST["registrationForm"]))
   {
    print_r ($_POST);
   }
   elseif(isset($_POST["saveForm"]))
   {
    print_r ($_POST);
   }
   else{

   }
?>
<html>
<head>
</head>
<body>
  
  <fieldset>
    <legend>FORM-1 with 2 buttons</legend>
      <form method="post" >
      <input type="text" name="loginname" value ="ABC" >

     <!--Always use type="password" for password --> 
     <input type="text" name="loginpassword" value ="abc123" >
     
     <input type="submit" name="loginForm" value="Login"><!--SUBMIT Button 1 -->
     <input type="submit" name="saveForm" value="Save">  <!--SUBMIT Button 2 -->
   </form>
  </fieldset>



  <fieldset>
    <legend>FORM-2 with 1 button</legend>
     <form method="post" >
      <input type="text" name="registrationname" value ="XYZ" >
      
     <!--Always use type="password" for password -->
     <input type="text" name="registrationpassword" value ="xyz123" >
     
     <input type="submit" name="registrationForm" value="Register"> <!--SUBMIT Button 3 -->
   </form>
  </fieldset>
  

</body>
</html>

รูปแบบ

เมื่อคลิกที่เข้าสู่ระบบ -> loginForm

เมื่อคลิกที่บันทึก -> saveForm

เมื่อคลิกที่ Register -> registerForm

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