Kiểm tra xem $ _POST có tồn tại không


100

Tôi đang cố gắng kiểm tra xem $ _POST có tồn tại hay không và nếu có, hãy in nó bên trong một chuỗi khác, nếu không, hoàn toàn không in.

một cái gì đó như thế này:

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

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

$newString = fromPerson();

Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời!

Câu trả lời:


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

60

Đơn giản. Bạn có hai lựa chọn:

1. Kiểm tra xem có BẤT KỲ dữ liệu bài đăng nào không

//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;
}

(HOẶC LÀ)

2. Chỉ kiểm tra xem một Khóa CỤ THỂ có sẵn trong dữ liệu bài đăng hay không

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

Theo nhận xét của Shi về câu trả lời Augustus Francis của , empty()không chính xác cho sự lựa chọn số 1, bởi vì trong php, chuỗi '0'tương đương với false- và empty()lợi nhuận truecho tất cả các giá trị tương đương là false . Vì vậy, khi sử dụng empty, mã sẽ bỏ qua việc in nếu giá trị là '0'. Nếu bạn muốn loại trừ chuỗi trống, hãy xem câu trả lời của Augustus.
ToolmakerSteve

33

Mọi người đều nói sử dụng Isset () - có thể sẽ phù hợp với bạn.

Tuy nhiên, điều quan trọng là bạn phải hiểu sự khác biệt giữa

$_POST['x'] = NULL;$_POST['x'] = '';

isset($_POST['x'])sẽ trả falsevề ở ví dụ đầu tiên, nhưng sẽ trả truevề ở ví dụ thứ hai mặc dù nếu bạn cố in một trong hai, cả hai sẽ trả về giá trị trống.

Nếu của bạn $_POSTđến từ một trường / biểu mẫu do người dùng nhập và để trống, TÔI TIN (mặc dù tôi không chắc chắn 100% về điều này) rằng giá trị sẽ là "" nhưng KHÔNG ĐẦY ĐỦ.

Ngay cả khi giả định đó là không chính xác (ai đó hãy sửa cho tôi nếu tôi sai!), Những điều trên vẫn tốt để biết để sử dụng trong tương lai.


4
void () kiểm tra sự tồn tại của biến và một giá trị không trống, vì vậy đó là hàm được sử dụng khi một chuỗi rỗng sẽ trả về false.
Han Dijk,

1
@HanDijk - theo lời nhận xét của Shi về câu trả lời Augustus Francis của , empty()không đúng ở đây, bởi vì trong php, chuỗi '0'tương đương với false- và empty()lợi nhuận truecho tất cả các giá trị tương đương là false . Vì vậy, khi sử dụng empty, mã sẽ bỏ qua việc in nếu giá trị là '0'.
ToolmakerSteve

30

Ngạc nhiên là nó đã không được đề cập đến

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

2
Tại sao? Nếu phương thức máy chủ không phải là POST, thì biến POST sẽ không được đặt, vì vậy nửa thứ hai là tất cả những gì cần thiết. Liệu tôi có sai?
ToolmakerSteve

@ToolmakerSteve có trong hầu hết các trường hợp, điều đó là đủ nhưng không phải lúc nào câu trả lời của tôi cũng là chỉ ra một cách khác mà nó có thể được thực hiện.
John Magnolia

Nó cũng sẽ hoạt động nếu bạn có một biểu mẫu với các hộp kiểm và gửi mà không có tên.
John Magnolia

2
Mô tả một tình huống mà isset($_POST['fromPerson']true, mặc dù if($_SERVER['REQUEST_METHOD'] == 'POST'false. Trừ khi có một tình huống như vậy, tất cả những gì cần thiết là isset...một phần.
ToolmakerSteve

Đúng, nhưng đó là cách khác. fromPersoncó thể không có, nhưng POST có thể vẫn tồn tại. Câu hỏi là, "Nếu $ _POST tồn tại." và chỉ trong một ví dụ, $ _POST ['fromPerson'] được sử dụng. Trong một số tình huống, như @goat mô tả ở đây , ngay cả khi fromPersonlà tên Gửi, nó có thể không xuất hiện trong BÀI ĐĂNG.
papo


13

Cách thích hợp để kiểm tra xem khóa mảng có tồn tại hay không là hàm array_key_exists()

Sự khác biệt là khi bạn có $_POST['variable'] = nullnó có nghĩa là khóa tồn tại và đã được gửi nhưng giá trị là null

Tùy chọn khác là tùy chọn này isset()sẽ kiểm tra xem khóa mảng có tồn tại hay không và nếu nó đã được đặt

Tùy chọn cuối cùng là sử dụng tùy chọn này empty()sẽ kiểm tra xem khóa mảng có tồn tại hay không nếu được đặt và nếu giá trị không được coi là trống.

Ví dụ:

$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

Liên quan đến câu hỏi của bạn

Cách thích hợp để kiểm tra xem giá trị có được gửi hay không là sử dụng array_key_exists () với phương thức kiểm tra yêu cầu

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

Nhưng có một số trường hợp phụ thuộc vào logic của bạn ở đâu isset()empty()cũng có thể tốt.


Câu trả lời tuyệt vời, ngoại trừ gợi ý sử dụng empty. Theo nhận xét của Shi về câu trả lời Augustus Francis của , empty()không đúng như một sự lựa chọn thay thế, bởi vì trong php, chuỗi'0' tương đương với false- và empty()lợi nhuận truecho tất cả các giá trị tương đương là false . Vì vậy, khi sử dụng empty, mã sẽ bỏ qua việc in nếu giá trị là '0'. Nếu bạn muốn loại trừ chuỗi trống, hãy xem câu trả lời của Augustus.
ToolmakerSteve

Câu trả lời hay nhất +1.
Viktor Joras

9
  • Trong trường hợp đó, sử dụng phương pháp issetlà không phù hợp.

Theo tài liệu PHP: http://php.net/manual/en/ Chức năng.array-key- exists.php
(xem Ví dụ # 2 array_key_exists () vs Isset () )
Phương thức array_key_existsnày nhằm kiểm tra sự hiện diện của khóa trong mảng.

Vì vậy, mã trong câu hỏi có thể được thay đổi như sau:

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

$newString = fromPerson();


  • Việc kiểm tra sự hiện diện của mảng $ _POST là không cần thiết vì nó là biến toàn cục của môi trường PHP kể từ phiên bản 4.1.0 (ngày nay chúng tôi không gặp các phiên bản PHP cũ hơn).

Mã này chỉ khác về hành vi với issetgiải pháp khi trường đăng được đặt nhưng chứa NULL. Đây là một sự thay thế tốt , nếu bạn muốn cho phép NULLtrong elsechi nhánh. Tuy nhiên , đó là một sai lầm, nếu một chuỗi là cần thiết; trong tình huống issetđó làm đúng, nhưng mã này thì không - nó sẽ chuyển NULLgiá trị. Câu trả lời sau đó của Robert chứng tỏ sự khác biệt.
ToolmakerSteve

6

Tất cả các phương pháp thực sự không được khuyến khích, đó là một cảnh báo trong Netbeans 7.4 và chắc chắn là một phương pháp hay không nên truy cập trực tiếp vào các biến superglobal, thay vào đó hãy sử dụng bộ lọc

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

1
Mặt khác, KHẢ NĂNG ĐỌC LẠI của mã cũng rất quan trọng. IMHO, issetdễ đọc hơn rất nhiều so với một biểu thức bộ lọc. Nhưng cảm ơn bạn đã chỉ ra điều này; nó là một lựa chọn hữu ích để xem xét.
ToolmakerSteve

tốt, bạn có thể viết riêng metod myIsset / 2 wrapper của bạn mà sử dụng các bộ lọc nhưng có những hành vi của isset / 2
linuxatico

"Tất cả các phương pháp thực sự không được khuyến khích" - đó là một tuyên bố mạnh mẽ (ngay cả khi NetBeans đánh dấu là cảnh báo). Bạn đã có một liên kết đến một nguồn có thẩm quyền , mà không khuyến khích tài liệu tham khảo trực tiếp đến $ _POST? (Có rất nhiều điều về php được thiết kế để thuận tiện cho việc viết mã hơn là tính nghiêm ngặt - hãy xem có bao nhiêu người trong các câu trả lời cho câu hỏi này sử dụng sai cách empty, bị vấp bởi cách gõ lỏng lẻo của php; thật khó tưởng tượng rằng việc truy cập $ _POST sẽ bị coi là kém phong cách.)
ToolmakerSteve

4

Thử

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

Theo bình luận của Han Dijk về câu trả lời của Rafael, empty($_POST['fromPerson'])đây là bài kiểm tra kết hợp. Dễ dàng đọc và nhập hơn :)
ToolmakerSteve

@ToolmakerSteve: empty('0')trả về true. Vì vậy, nó không giống nhau.
Shi

1
@Shi - vâng, bạn nói đúng; những gì tôi nói là sai! Có vẻ như không có giải pháp nào đơn giản hơn đoạn mã được hiển thị ở đây.
ToolmakerSteve


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

1
Is_array ($ _ POST) có kiểm tra xem có bất kỳ giá trị nào trong POST không? Trong ứng dụng của mình, tôi đang cố gắng xác định xem có bài đăng hay không trước khi làm bất cứ điều gì khác.
Jeff LaFay

1
Xem bản chỉnh sửa của tôi. is_array()kiểm tra xem đó có phải là một mảng hay không, phần thứ hai kiểm tra xem nó có một mục với khóa hay không 'fromPerson'.
jezmck

2

if( isset($_POST['fromPerson']) ) đúng.

Bạn có thể sử dụng một hàm và quay lại, tốt hơn là định hướng tiếng vọng.


2
Câu trả lời này không bổ sung gì cho cuộc thảo luận, điều đó đã không được nói trong các câu trả lời khác, nhiều năm trước đó.
ToolmakerSteve

1

Tôi muốn kiểm tra xem nó có được đặt hay không và nếu nó trống trong toán tử bậc ba.

// 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. Vì vậy, tốt hơn là không có version 0, hoặc userID 0, v.v.
Shi

0

Tôi muốn thêm câu trả lời của mình mặc dù chủ đề này đã cũ và nó đã xếp hạng cao trong Google đối với tôi.

Phương pháp tốt nhất của tôi là thử:

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

Đối với $_POSTmột mảng, nếu tập lệnh tải và không có dữ liệu nào trong $_POSTbiến, nó sẽ có độ dài mảng bằng 0. Điều này có thể được sử dụng trong câu lệnh IF.

Bạn cũng có thể tự hỏi liệu điều này có gây ra lỗi "chỉ mục không xác định" hay không khi chúng tôi đang kiểm tra xem đã $_POSTđược đặt chưa ... Thực tế $_POSTluôn tồn tại, lỗi "chỉ mục không xác định" sẽ chỉ xuất hiện nếu bạn cố gắng tìm kiếm $ _POST giá trị mảng không tồn tại.

$_POSTluôn tồn tại tự nó là trống hoặc có giá trị mảng. $_POST['value']có thể không tồn tại, do đó gây ra lỗi "chỉ mục không xác định".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.