2012-02-06 34 views
19
if(isset($_POST['submit'])) { 
    if(!isset($_POST['userName'])) { 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

Tôi không thể nhận được $username là "Ẩn danh"? Giá trị này là trống hoặc giá trị là $_POST['userName'].

+1

kiểm tra giá trị đặt cược nếu biến đã được đặt. tuy nhiên khi bạn gửi một biểu mẫu, một biến sẽ là một chuỗi rỗng. – miki725

Trả lời

35

isset() sẽ trả về true nếu biến đã được khởi tạo. Nếu bạn có trường biểu mẫu có giá trị name được đặt thành userName, khi biểu mẫu đó được gửi, giá trị sẽ luôn được "đặt", mặc dù có thể không có bất kỳ dữ liệu nào trong đó.

Thay vào đó, trim() chuỗi và kiểm tra chiều dài của nó

if("" == trim($_POST['userName'])){ 
    $username = 'Anonymous'; 
}  
+0

có an toàn khi sử dụng biến toàn cầu trực tiếp với việc khử trùng hoặc thoát khỏi chúng? –

+3

@edwardtorvalds trong ví dụ trên, biến không được sử dụng nữa để so sánh. Nếu nó đang thay đổi ngữ cảnh (tức là đầu ra thành HTML/JSON, được sử dụng trong một truy vấn kho dữ liệu, vv) thì nó sẽ được coi là không đáng tin cậy và được xử lý theo ngữ cảnh một cách thích hợp. – Andy

35

Nếu hình thức đã được gửi thành công, $_POST['userName'] nên luôn luôn được thiết lập, mặc dù nó có thể chứa một chuỗi rỗng, đó là khác biệt so với không được thiết lập ở tất cả các . Thay vào đó kiểm tra xem nó là empty()

if(isset($_POST['submit'])){ 

    if(empty($_POST['userName'])){ 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 
+3

+1 Để có đầy đủ, hãy xem http://php.net/empty những gì được coi là "trống". – deceze

0

isset đang thử nghiệm hay không quan trọng bạn đang kiểm tra trong băm (hoặc mảng kết hợp) được "thiết lập". Đặt trong bối cảnh này chỉ có nghĩa là nếu nó biết giá trị. Không có gì là một giá trị. Vì vậy, nó được định nghĩa là một chuỗi rỗng.

Vì lý do đó, miễn là bạn có trường nhập có tên userName, bất kể chúng điền vào trường nào, điều này sẽ đúng. kiểm tra những gì bạn thực sự muốn làm là nếu userName là tương đương với một chuỗi rỗng ''

7

Để kiểm tra xem tài sản là hiện tại, không phụ thuộc vào giá trị, sử dụng:

if (array_key_exists('userName', $_POST)) {} 

Để kiểm tra xem tài sản được thiết lập (tài sản là hiện tại và giá trị không phải là null hoặc false), sử dụng:

if (isset($_POST['userName'])) {} 

Để kiểm tra xem tài sản được thiết lập và không có sản phẩm nào (không phải là một chuỗi rỗng, 0 (số nguyên), 0.0 (float), '0' (string), null, false hoặc [] (mảng trống)), sử dụng:

if (!empty($_POST['userName'])) {} 
1

Thay đổi này:

if(isset($_POST['submit'])){ 

    if(!(isset($_POST['userName']))){ 
    $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

Để này:

if(!empty($_POST['userName'])){ 
    $username = $_POST['userName']; 
} 

if(empty($_POST['userName'])){ 
    $username = 'Anonymous'; 
} 
+0

Bạn có thể muốn thử điều này cho chính mình – jprofitt

+0

Cuộc gọi tốt phải được để trống(). –

3

Câu hỏi: Kiểm tra liệu giá trị $ _POST có là trống không.

Dịch: Kiểm tra xem liệu khóa/chỉ mục mảng có giá trị được liên kết với nó hay không.

Trả lời: Phụ thuộc vào sự nhấn mạnh của bạn về bảo mật. Phụ thuộc vào những gì được cho phép là đầu vào hợp lệ.

1. Some people say use empty(). 

Từ hướng dẫn sử dụng PHP: "[Trống] xác định xem biến có được để trống hay không. Biến được coi là trống nếu biến không tồn tại hoặc nếu giá trị của nó bằng FALSE". Sau đây được coi là trống rỗng.

"" (an empty string) 
0 (0 as an integer) 
0.0 (0 as a float) 
"0" (0 as a string) 
NULL 
FALSE 
array() (an empty array) 
$var; (a variable declared, but without a value) 

Nếu không có giá trị nào hợp lệ cho điều khiển nhập của bạn thì empty() sẽ hoạt động. Vấn đề ở đây là empty() có thể là quá rộng để được sử dụng nhất quán (cùng một cách, vì lý do tương tự, trên các lần gửi kiểm soát đầu vào khác nhau đến $_POST hoặc $_GET). Sử dụng tốt empty() là để kiểm tra xem có toàn bộ mảng toàn bộ không trống (không có phần tử nào).

2. Some people say use isset(). 

isset() (một cấu trúc ngôn ngữ) không thể hoạt động trên toàn bộ mảng, như trong isset($myArray). Nó chỉ có thể hoạt động trên biến sốthành phần mảng (thông qua chỉ mục/khóa): isset($var)isset($_POST['username']). Cấu trúc ngôn ngữ isset() làm hai việc. Đầu tiên nó kiểm tra xem liệu một biến hoặc chỉ mục/khóa mảng có một giá trị liên kết với nó hay không. Thứ hai, nó kiểm tra để đảm bảo rằng giá trị không bằng giá trị NULL NULL.

Trong ngắn hạn, kiểm tra chính xác nhất có thể được thực hiện tốt nhất với isset(), vì một số điều khiển đầu vào thậm chí không đăng ký với $ _POST khi chúng không được chọn hoặc kiểm tra. Tôi chưa bao giờ biết một biểu mẫu đã gửi giá trị NULL NULL. Không có gì của tôi, vì vậy tôi sử dụng isset() để kiểm tra xem một khóa $_POST không có giá trị nào được liên kết với nó (và đó không phải là NULL). isset()kiểm tra chặt chẽ hơn về tính trống rỗng (theo nghĩa câu hỏi của bạn) so với empty().

3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness. 

Bạn có thể kiểm tra bất cứ điều gì để đánh giá đúng hoặc sai trong một câu lệnh if. Các mảng trống đánh giá sai và do đó, các biến không được đặt. Các biến chứa giá trị NULL NULL cũng đánh giá sai. Thật không may trong trường hợp này, giống như với empty(), nhiều thứ khác cũng được đánh giá là sai: 1. chuỗi trống '', số không (0), số không. (0), chuỗi 0 ', boolean false và một số trống Các đối tượng XML.

--Doyle, Bắt đầu từ PHP 5.3

Tóm lại, sử dụng isset() và xem xét kết hợp nó với các xét nghiệm khác. Ví dụ:

Có thể không hoạt động do trục vít siêu cứng, nhưng sẽ hoạt động đối với các mảng khác không có câu hỏi.

if(is_array($_POST) && !empty($_POST)) 
{ 
    //Now test for your successful controls in $_POST with isset() 
} 

Điều này cũng hoạt động.

if(is_array($_POST) && $_POST) 
{ 
    //Now test for your successful controls in $_POST with isset() 
    //Always validate your input. 
} 

Do đó, tại sao tìm kiếm một giá trị gắn liền với một chìa khóa trước khi bạn thậm chí biết chắc chắn rằng $_POST đại diện cho một mảng và đã bất kỳ giá trị lưu giữ trong nó ở tất cả (một cái gì đó nhiều người thất bại trong việc xem xét)? Hãy nhớ rằng, mọi người có thể gửi dữ liệu đến biểu mẫu của bạn mà không cần sử dụng trình duyệt web. Một ngày nào đó bạn có thể đến điểm kiểm tra rằng $_POST chỉ có các phím được cho phép, nhưng cuộc hội thoại đó là cho một ngày khác.

tài liệu tham khảo hữu ích:

PHP Manual: Type Testing Comparison Tables

1

tôi muốn sử dụng một comparisant một dòng đơn giản đối với các trường hợp sử dụng

$username = trim($_POST['userName'])?:'Anonymous'; 

Đây là đối với trường hợp sử dụng khi bạn chắc chắn lỗi đăng nhập tắt để bạn không nhận được cảnh báo rằng biến không được khởi tạo.

này là phiên bản hoang tưởng:

$username = trim(isset($_POST['userName'])?$_POST['userName']:'')?:'Anonymous'; 

này thực hiện một kiểm tra nếu biến $_POST được thiết lập. trước khi truy cập nó.

+0

Nếu giá trị là "0", thì biến sẽ là NULL. Đừng sử dụng nó. – Erikas

Các vấn đề liên quan