ตรวจสอบว่ามี $ _POST อยู่หรือไม่


101

ฉันกำลังพยายามตรวจสอบว่ามี $ _POST อยู่หรือไม่และถ้าเป็นเช่นนั้นให้พิมพ์ในสตริงอื่นถ้าไม่มีอย่าพิมพ์เลย

อะไรทำนองนี้:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

ความช่วยเหลือใด ๆ จะดีมาก!

คำตอบ:



63

เรียบง่าย คุณมีสองทางเลือก:

1. ตรวจสอบว่ามีข้อมูลโพสต์หรือไม่

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(หรือ)

2. ตรวจสอบว่ามีคีย์เฉพาะในข้อมูลโพสต์เท่านั้น

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

ตามความคิดเห็นของชิในคำตอบของออกัสตัฟรานซิส , empty()คือไม่ถูกต้องสำหรับ # 1 ทางเลือกเพราะใน PHP, สตริง'0'เทียบเท่ากับfalse- และempty()ผลตอบแทนtrueสำหรับค่าทั้งหมดคิดเป็นเท็จ ดังนั้นการใช้รหัสจะข้ามพิมพ์ถ้าค่าเป็นempty '0'หากคุณต้องการยกเว้นสตริงว่างโปรดดูคำตอบของ Augustus
ToolmakerSteve

34

ทุกคนบอกว่าให้ใช้ isset () - ซึ่งน่าจะเหมาะกับคุณ

อย่างไรก็ตามสิ่งสำคัญคือคุณต้องเข้าใจความแตกต่างระหว่าง

$_POST['x'] = NULL; และ $_POST['x'] = '';

isset($_POST['x'])จะคืนค่าfalseในตัวอย่างแรก แต่จะกลับมาtrueในตัวอย่างที่สองแม้ว่าคุณจะพยายามพิมพ์อย่างใดอย่างหนึ่งทั้งสองจะส่งคืนค่าว่าง

หากคุณ$_POSTมาจากฟิลด์ / ฟอร์มที่ผู้ใช้ป้อนเข้าและเว้นว่างไว้ฉันเชื่อ (ฉันไม่แน่ใจ 100% เกี่ยวกับเรื่องนี้) ว่าค่าจะเป็น "" แต่ไม่เป็นโมฆะ

แม้ว่าข้อสันนิษฐานนั้นจะไม่ถูกต้อง (มีใครกรุณาแก้ไขให้ฉันถ้าฉันผิด!) ข้างต้นก็ยังดีที่ควรทราบเพื่อใช้ในอนาคต


4
empty () ตรวจสอบการมีอยู่ของตัวแปรและค่าที่ไม่ว่างนั่นคือฟังก์ชันที่จะใช้เมื่อสตริงว่างควรคืนค่าเป็นเท็จ
Han Dijk

1
@HanDijk - ราคาตามความคิดเห็นของชิในคำตอบของออกัสตัฟรานซิส , empty()จะไม่ถูกต้องที่นี่เพราะใน PHP, สตริง'0'เทียบเท่ากับfalse- และempty()ผลตอบแทนtrueสำหรับค่าทั้งหมดคิดเป็นเท็จ ดังนั้นการใช้รหัสจะข้ามพิมพ์ถ้าค่าเป็นempty '0'
ToolmakerSteve

30

แปลกใจที่ไม่ได้กล่าวถึง

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){

2
ทำไม? หากเมธอดเซิร์ฟเวอร์ไม่ใช่ POST ตัวแปร POST จะไม่ถูกตั้งค่าดังนั้นครึ่งหลังจึงเป็นสิ่งที่จำเป็น ฉันผิดเหรอ?
ToolmakerSteve

@ToolmakerSteve ใช่ในกรณีส่วนใหญ่ที่เพียงพอ แต่ไม่ใช่คำตอบของฉันเสมอไปคือการแสดงวิธีอื่นที่สามารถทำได้
John Magnolia

นอกจากนี้ยังสามารถใช้ได้หากคุณมีแบบฟอร์มที่มีช่องทำเครื่องหมายและส่งโดยไม่มีชื่อ
John Magnolia

2
อธิบายสถานการณ์ที่isset($_POST['fromPerson']เป็นtrueแม้ว่าจะเป็นif($_SERVER['REQUEST_METHOD'] == 'POST' falseเว้นแต่จะมีสถานการณ์เช่นนี้สิ่งที่จำเป็นคือisset...ส่วนหนึ่ง
ToolmakerSteve

จริง แต่เป็นอีกทางหนึ่ง fromPersonอาจไม่มีอยู่ แต่อาจยังมี POST อยู่ คำถามคือ "หากมี $ _POST อยู่" และในตัวอย่างเท่านั้นจะใช้ $ _POST ['fromPerson'] ในบางสถานการณ์ตามที่@goat อธิบายไว้ที่นี่แม้ว่าจะfromPersonเป็นชื่อที่ส่ง แต่ก็อาจไม่มีอยู่ใน POST
papo


13

วิธีที่เหมาะสมในการตรวจสอบว่าคีย์อาร์เรย์มีอยู่หรือไม่คือฟังก์ชัน array_key_exists()

ความแตกต่างก็คือเมื่อคุณมี $_POST['variable'] = nullหมายความว่าคีย์นั้นมีอยู่และถูกส่ง แต่ค่าเป็นโมฆะ

อีกทางเลือกหนึ่งคือ isset()ซึ่งจะตรวจสอบว่ามีคีย์อาร์เรย์อยู่หรือไม่และตั้งค่าไว้หรือไม่

ตัวเลือกสุดท้ายคือการใช้ empty()ซึ่งจะตรวจสอบว่ามีคีย์อาร์เรย์อยู่หรือไม่หากตั้งค่าไว้และไม่ถือว่าค่าว่างเปล่า

ตัวอย่าง:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

เกี่ยวกับคำถามของคุณ

วิธีที่เหมาะสมในการตรวจสอบว่ามีการส่งค่าหรือไม่คือการใช้ array_key_exists () ด้วยวิธีการตรวจสอบคำขอ

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

แต่มีบางกรณีขึ้นอยู่กับตรรกะของคุณว่าที่ไหนisset()และempty()จะดีเช่นกัน


emptyคำตอบที่ยอดเยี่ยมยกเว้นสำหรับคำแนะนำในการใช้งาน ตามความคิดเห็นของชิในคำตอบของออกัสตัฟรานซิส , empty()คือไม่ถูกต้องในฐานะที่เป็นทางเลือกเพราะใน PHP, สตริง'0'เทียบเท่ากับfalse- และempty()ผลตอบแทนtrueสำหรับค่าทั้งหมดคิดเป็นเท็จ ดังนั้นการใช้รหัสจะข้ามพิมพ์ถ้าค่าเป็นempty '0'หากคุณต้องการยกเว้นสตริงว่างโปรดดูคำตอบของ Augustus
ToolmakerSteve

คำตอบที่ดีที่สุด +1
Viktor Joras

9
  • ในกรณีที่ใช้วิธีการissetไม่เหมาะสม

ตามเอกสาร PHP: http://php.net/manual/en/function.array-key-exists.php
(ดูตัวอย่าง # 2 array_key_exists () VS isset () )
วิธีการarray_key_existsนี้มีไว้สำหรับตรวจสอบการมีคีย์ในอาร์เรย์

ดังนั้นโค้ดในคำถามสามารถเปลี่ยนแปลงได้ดังนี้:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • การตรวจสอบการมีอยู่ของอาร์เรย์ $ _POST ไม่จำเป็นเนื่องจากเป็นตัวแปรสากลของสภาพแวดล้อม PHP ตั้งแต่เวอร์ชัน 4.1.0 (ปัจจุบันเราไม่พบ PHP เวอร์ชันเก่า)

รหัสนี้แตกต่างในลักษณะการทำงานจากissetโซลูชันเมื่อตั้งค่าฟิลด์โพสต์ แต่มีค่า NULL นี่คือทางเลือกที่ดี , ถ้าคุณต้องการที่จะช่วยให้NULLในelseสาขา อย่างไรก็ตามมันเป็นความผิดพลาดหากจำเป็นต้องใช้สตริง ในสถานการณ์issetนั้นเป็นสิ่งที่ถูกต้อง แต่รหัสนี้ไม่ได้ - มันจะส่งต่อNULLค่าไป คำตอบในภายหลังของโรเบิร์ตแสดงให้เห็นถึงความแตกต่าง
ToolmakerSteve

6

วิธีการทั้งหมดเป็นคำเตือนใน Netbeans 7.4 และเป็นแนวทางปฏิบัติที่ดีที่จะไม่เข้าถึงตัวแปร superglobal โดยตรงให้ใช้ a ตัวกรองแทน

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);

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

คุณสามารถเขียน metod myIsset / 2 wrapper ของคุณเองที่ใช้ตัวกรอง แต่มีลักษณะการทำงานของ isset / 2
linuxatico

"วิธีการทั้งหมดไม่ได้รับการสนับสนุนจริงๆ" - นั่นเป็นคำแถลงที่ชัดเจน (แม้ว่า NetBeans จะทำเครื่องหมายเป็นคำเตือนก็ตาม) คุณมีลิงก์ไปยังแหล่งข้อมูลที่เชื่อถือได้ซึ่งไม่สนับสนุนการอ้างอิงโดยตรงถึง $ _POST หรือไม่ (มีหลายอย่างเกี่ยวกับ php ที่ออกแบบมาเพื่อความสะดวกในการเขียนโค้ดมากกว่าที่จะเข้มงวด - ดูว่ามีกี่คนที่ตอบคำถามนี้ใช้ไม่ถูกต้องemptyสะดุดด้วยการพิมพ์หลวม ๆ ของ php มันยากที่จะจินตนาการว่าการเข้าถึง $ _POST จะถือว่าแย่ style.)
ToolmakerSteve

5

ลอง

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}

ตามความคิดเห็นของ Han Dijk เกี่ยวกับคำตอบของ Rafael empty($_POST['fromPerson'])ทำการทดสอบแบบรวมนี้ อ่านและพิมพ์ได้ง่ายขึ้น :)
ToolmakerSteve

@ToolmakerSteve: ผลตอบแทนempty('0') trueดังนั้นจึงไม่เหมือนกัน
ชิ

1
@ ชิ - ใช่คุณถูกต้อง; สิ่งที่ฉันพูดมันผิด! ดูเหมือนว่าไม่มีวิธีแก้ปัญหาที่ง่ายไปกว่าโค้ดที่แสดงไว้ที่นี่
ToolmakerSteve


3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}

1
is_array ($ _ POST) ตรวจสอบว่ามีค่าใด ๆ ใน POST หรือไม่ ในแอปของฉันฉันพยายามตรวจสอบว่ามีโพสต์หรือไม่ก่อนที่จะทำอย่างอื่น
Jeff LaFay

1
ดูการแก้ไขของฉัน is_array()ตรวจสอบว่าเป็นอาร์เรย์หรือไม่ส่วนที่สองตรวจสอบว่ามีรายการที่มีคีย์'fromPerson'หรือไม่
jezmck

2

if( isset($_POST['fromPerson']) ) ถูกต้อง

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


2
คำตอบนี้ไม่ได้เพิ่มอะไรให้กับการสนทนาซึ่งยังไม่ได้กล่าวไว้ในคำตอบอื่น ๆ เมื่อหลายปีก่อน
ToolmakerSteve

1

ฉันต้องการตรวจสอบว่ามีการตั้งค่าหรือไม่และว่างเปล่าในตัวดำเนินการ ternary

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;

5
empty('0')คือtrue. ดีกว่าไม่มีversion 0หรือuserID 0ฯลฯ
ชิ

1

ฉันต้องการเพิ่มคำตอบของฉันแม้ว่าเธรดนี้จะมีอายุหลายปีและได้รับการจัดอันดับสูงใน Google สำหรับฉัน

วิธีที่ดีที่สุดของฉันคือลอง:

if(sizeof($_POST) !== 0){
// Code...
}

เช่นเดียว$_POSTกับอาร์เรย์หากสคริปต์โหลดและไม่มีข้อมูลอยู่ในไฟล์$_POSTตัวแปรก็จะมีความยาวอาร์เรย์เป็น 0 ซึ่งสามารถใช้ในคำสั่ง IF

คุณอาจสงสัยว่าสิ่งนี้ทำให้เกิดข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด" ซึ่งดูเหมือนว่าเรากำลังตรวจสอบว่า$_POSTมีการตั้งค่าอยู่หรือไม่ ... อันที่จริง$_POSTมีอยู่เสมอข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด" จะปรากฏขึ้นก็ต่อเมื่อคุณพยายามค้นหา $ _POST ค่าอาร์เรย์ที่ไม่มีอยู่

$_POSTมีอยู่เสมอในตัวเองว่างเปล่าหรือมีค่าอาร์เรย์ $_POST['value']อาจไม่มีอยู่จึงทำให้เกิดข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด"

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