ตรวจสอบว่ามีการส่งแบบฟอร์ม - PHP


122

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

ก่อนอื่นฉันคิดว่าอาจจะ:

isset($_POST)

แต่นั่นจะกลับมาเป็นจริงเสมอเมื่อมีการกำหนด superglobal ทุกที่ ฉันไม่ต้องการที่จะต้องวนซ้ำในแต่ละองค์ประกอบของแบบฟอร์มของฉันด้วย:

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

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

มีวิธีที่ 'สะอาดกว่า' กว่าการเพิ่มค่าสถานะของตัวเองหรือไม่?


4
คุณสามารถสร้างปุ่มส่งที่มีชื่อเฉพาะเช่นsubmitedแล้วใช้ php if(isset($_POST['submited']))หรืออินพุตที่ซ่อนอยู่ ...
Max Allan

2
คุณควรเพิ่มชื่อเพื่อป้องกันการโจมตีซ้ำในแบบฟอร์มของคุณ
hakre

คำตอบ:


191

สำหรับการตรวจสอบทั่วไปว่ามีการPOSTดำเนินการหรือไม่ให้ใช้:

if (!empty($_POST))

แก้ไข : ตามที่ระบุไว้ในความคิดเห็นวิธีนี้ใช้ไม่ได้ในบางกรณี (เช่นช่องทำเครื่องหมายและปุ่มที่ไม่มีชื่อ) คุณควรใช้:

if ($_SERVER['REQUEST_METHOD'] == 'POST')


69

จริงๆแล้วปุ่มส่งทำหน้าที่นี้อยู่แล้ว

ลองใช้แบบฟอร์ม:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

จากนั้นในตัวจัดการ PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}

6
นี่คือคำตอบที่ถูกต้อง เพียงแค่ตรวจสอบ $ _POST ยังไม่ดีพอเพราะอาจสร้างขึ้นจากที่ต่างๆมากมาย ... ไม่ใช่แค่จากโพสต์แบบฟอร์ม ขอบคุณ Tzshand
Houston

if (null !== (filter_input(INPUT_POST, 'macaddress'))){ตามหลักการแล้วคุณควรใช้สิ่งที่ทำให้คุณติดนิสัยในการใช้ filter_input
depicus

2
POST สามารถทำได้ด้วย Ajax ซึ่งจะไม่มีปุ่มส่งใด ๆ ดังนั้นนี่จึงไม่ใช่วิธีแก้ปัญหาสากล
Muhammad bin Yusrat

นั่นคือความจริง นอกจากนี้ยังสามารถตรวจสอบตัวแปรที่โพสต์โดย AJAX
Tzshand

34

ใช้

if(isset($_POST['submit'])) // name of your submit button

1
ทางออกที่ง่ายที่สุด ทุกรูปแบบควรมีปุ่มส่ง!
Anh Tran

1
แต่บางรูปแบบอาจมีปุ่มหลายปุ่ม
Progrock

2
@rilwis บางครั้งแบบฟอร์มถูกส่งโดย JavaScript และไม่จำเป็นต้องมี / มีปุ่มส่ง
Waqas Malik


14

ลองทำตามนี้

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }

2
วิธีนี้เป็นวิธีที่แนะนำมากที่สุดเนื่องจาก "แนวทางปฏิบัติที่ดีที่สุด" ได้รับการยอมรับจาก "สถาบันการเข้ารหัส"
Darkeden

1

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

  1. สร้างโทเค็นเฉพาะ (คุณสามารถใช้แฮช) เช่น:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. กำหนดโทเค็นนี้ให้กับตัวแปรเซสชัน Ex:

    $_SESSION['form_token'] = $token;
  3. เพิ่มอินพุตที่ซ่อนไว้เพื่อส่งโทเค็น Ex:

    input type="hidden" name="token" value="{$token}"
  4. จากนั้นในการตรวจสอบความถูกต้องของคุณให้ตรวจสอบว่าโทเค็นที่ส่งตรงกับเซสชัน var หรือไม่

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....

0

ฉันมีปัญหาเดียวกัน - ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มname=""ปุ่มป้อนข้อมูลแล้ว การแก้ไขนั้นได้ผลสำหรับฉัน

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">

-6

คุณยังสามารถใช้:

is_array($_POST)

4
is_array($_POST)ให้จริงเสมอ (บนเครื่องของฉัน) ตามstackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehowจึงดูเหมือนว่าจะได้รับการคาดหวังว่านี้เสมอกลับจริง ..
GitaarLAB

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