sourcecode

하나의 양식에 두 개의 제출 단추

codebag 2023. 6. 2. 20:27
반응형

하나의 양식에 두 개의 제출 단추

양식에 두 의 제출 단추가 있습니다.서버 측에서 어떤 공격을 받았는지 확인하려면 어떻게 해야 합니까?

1 해결책 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 솔루션 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
}

각 이름을 지정하면 클릭한 이름이 다른 입력으로 전송됩니다.

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

이에인 HTML5라는 접근법이 formaction속성:

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

분명히 이것은 Internet Explorer 9 이전 버전에서는 작동하지 않지만 다른 브라우저의 경우에는 문제가 없습니다(w3schools.com HTML <버튼> formaction Attribute 참조).

개인적으로 저는 일반적으로 이 접근 방식을 백업으로 사용하여 원격으로 양식을 제출합니다(피드백을 빠르게 인식하기 위해).이 둘 중에서, JavaScript가 비활성화된 버전 9 이전의 Internet Explorer만 적용되지 않습니다.

물론 어떤 버튼을 눌렀는지에 관계없이 기본적으로 동일한 작업을 서버 측에서 수행하는 경우에는 적합하지 않을 수 있지만, 사용 가능한 두 개의 사용자 측 작업이 있는 경우에는 두 개의 서버 측 작업에도 매핑됩니다.

Pascal_dher가 코멘트에서 언급한 바와 같이, 이 속성은 또한 다음에서 사용할 수 있습니다.<input>꼬리표도 붙입니다.

더 나은 솔루션은 버튼 태그를 사용하여 양식을 제출하는 것입니다.

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

버튼 내부의 HTML(예:..>Update<..가 볼 수 되기 때문에 . HTML은 사용자가 볼 수 있습니다.value사용자가 지정한 것이 아니라 서버로만 전송됩니다.이렇게 하면 국제화 및 여러 표시 언어에 불편함이 없습니다(이전 솔루션에서 버튼의 레이블은 서버로 전송되는 값이기도 합니다).

테스트가 매우 쉽습니다.

<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을 확인합니다.

을 합니다.formactionHTML 속성(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>
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>

여러 제출 단추를 처리하는 가장 좋은 방법은 서버 스크립트에서 스위치 케이스를 사용하는 것입니다.

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

여기서 제안된 해결책은 2009년에 효과가 있었을 수도 있지만, 저는 이 모든 업데이트된 답변을 테스트했고 아무도 브라우저에서 작동하지 않습니다.

제가 찾은 유일한 해결책은 다음과 같습니다(그러나 사용하기에는 좀 추악합니다).

<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';"/>
</form>

하나의 양식 예제에서 여러 제출 단추에 대한 작업을 구성할 수 있습니다.

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

다른 단추 클릭 시 다른 양식 작업을 보내는 HTML 예제:

<form action="/login" method="POST">
    <input type="text" name="username" value="your_username" />
    <input type="password" name="password" value="your_password" />
    <button type="submit">Login</button>
    <button type="submit" formaction="/users" formmethod="POST">Add User</button>
</form>

새 사용자 및 로그인 사용자를 추가하는 데 동일한 양식이 사용되고 있습니다.

name~하듯이array.

<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매우 중요합니다. 그렇지 않으면 둘 다 구문 분석될 것이기 때문입니다.

사용하는 서버 측 스크립트 방법을 지정하지 않았기 때문에 CherryPy를 사용하여 Python에서 작동하는 예제를 제공합니다(다른 컨텍스트에서도 유용할 수 있음).

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

GET 배열의 이름/값을 읽을 수 있어야 한다고 생각합니다.클릭하지 않은 버튼은 해당 목록에 나타나지 않을 것 같습니다.

이렇게도 할 수 있습니다(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">

일반적인 사용 사례는 각 단추에 대해 데이터베이스의 다른 ID를 사용하여 나중에 서버에서 어떤 행이 클릭되었는지 알 수 있습니다.

서버 측(이 예에서는 PHP)에서 "행"을 배열로 읽어 ID를 가져올 수 있습니다.

$_POST['row']하나만 . 이 은 형에서하있배됩 니열다 [ id => value ] (예:)[ '123' => 'something' ]).

클릭한 ID를 얻으려면 다음 작업을 수행합니다.

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

열쇠

참고로 제출 단추가 여러 개 있고 반환(ENTER 키)을 누르면 키보드의 기본 단추 값은 DOM의 첫 번째 단추 값이 됩니다.

예:

<form>
  <input type="text" name="foo" value="bar">
  <button type="submit" name="operation" value="val-1">Operation #1</button>
  <button type="submit" name="operation" value="val-2">Operation #2</button>
</form>

이 양식에서 ENTER를 누르면 다음 매개 변수가 전송됩니다.

foo=bar&operation=val-1

업데이트된 답변은 폼액션 및 폼타겟함께 버튼을 사용하는 것입니다.

이 예에서 첫 번째 단추는 다른 URL을 시작합니다./preview새 탭에서나머지 세 개는 양식 태그에 지정된 작업을 사용합니다.

<button type='submit' class='large' id='btnpreview' name='btnsubmit' value='Preview' formaction='/preview' formtarget='blank' >Preview</button>
<button type='submit' class='large' id='btnsave' name='btnsubmit' value='Save' >Save</button>
<button type='submit' class='large' id='btnreset' name='btnsubmit' value='Reset' >Reset</button>
<button type='submit' class='large' id='btncancel' name='btnsubmit' value='Cancel' >Cancel</button>

전체 설명서는 여기에 있습니다.

HTML5에서 당신은 다음을 사용할 수 있습니다.formaction&formmethod입력 필드의 속성

<form action="/addimage" method="POST">
<button>Add image</button>
<button formaction="/home" formmethod="get">Cancel</button>
<button formaction="/logout" formmethod="post">Logout</button>
</form>

또한 href 특성을 사용하여 각 버튼에 대한 값이 추가된 get을 전송할 수 있습니다.하지만 그때는 양식이 필요하지 않을 것입니다.

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

다음과 같은 단추를 표시할 수 있습니다.

<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는 제가 설명을 위해 남겨둔 양식에서 추출한 몇 가지 다른 값입니다.)

사용 중인 서버 측 스크립팅 방법을 지정하지 않았기 때문에 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>

양식

Login -> loginForm 클릭 시

저장 -> 양식 저장을 클릭할 때

Register -> Registration Form 클릭 시

단순합니다. 다른 제출 단추 클릭 시 양식의 동작을 변경할 수 있습니다.

이것을 문서로 작성해 보세요.준비:

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

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

언급URL : https://stackoverflow.com/questions/547821/two-submit-buttons-in-one-form

반응형