2009-07-30 30 views
7

Tôi tìm thấy trong các trang PHP tôi kết thúc với dòng và dòng mã mà trông như thế này:Có cách nào tốt hơn để kiểm tra các biến được đăng trong PHP không?

$my_id = isset($_REQUEST['my_id']) ? $_REQUEST['my_id'] : ''; 
$another_var = isset($_REQUEST['another_var']) ? $_REQUEST['another_var'] : 42; 
... 

Có cách nào tốt hơn, súc tích hơn, hoặc dễ đọc hơn để kiểm tra mảng này và gán chúng vào một biến cục bộ nếu chúng tồn tại hoặc áp dụng mặc định nếu chúng không?

CHỈNH SỬA: Tôi không muốn sử dụng register_globals() - Dù sao tôi cũng vẫn gặp sự cố isset.

+0

Câu hỏi hay. –

+0

Không đủ đại diện để bỏ phiếu, nhưng tôi thích những câu trả lời này! – BabyCakes

+1

Wow, một người nào đó rất vui khi ở đây. Đưa cái gì? –

Trả lời

6

Làm thế nào để gói nó trong một chức năng?

<?php 

function getPost($name, $default = null) { 
    return isset($_POST[$name]) ? $_POST[$name] : $default; 
} 
+0

Tôi thích điều này nhưng giới hạn bỏ phiếu hàng ngày của tôi đạt được. Tôi đang viết câu trả lời tương tự. –

+2

Điều duy nhất tôi sẽ thay đổi là tên hàm, thành một cái gì đó ngắn hơn. Tôi nghĩ rằng bài() có vẻ đẹp hơn. – Thinker

4

một phương pháp tốt hơn có thể là tạo một lớp đơn/tĩnh để trừu tượng hóa các chi tiết kiểm tra dữ liệu yêu cầu.

Cái gì như:

class Request { 

    private $defaults = array(); 
    private static $_instance = false; 

    function getInstance() { 
    if (!self::$_instance) { 
    $c = __CLASS__; 
     self::$_instance = new $c; 
    } 
    return self::$_instance; 
    } 

    function setDefaults($defaults) { 
    $this->defaults = $defaults; 
    } 

    public function __get($field) { 
    if (isset($_REQUEST[$field]) && !empty($_REQUEST[$field])) { 
     return $_REQUEST['field'];   
     } elseif (isset($this->defaults[$field])) { 
     return $this->defaults[$field]; 
     } else { 
     return ''; # define a default value here. 
     } 
    } 
} 

sau đó bạn có thể làm:

# get an instance of the request 
$request = Request::getInstance(); 

# pass in defaults. 
$request->setDefaults(array('name'=>'Please Specify')); 

# access properties 
echo $request->name; 
echo $request->email; 

Tôi nghĩ rằng điều này làm cho các kịch bản cá nhân của bạn tải sạch và tóm tắt đi những vv validation Thêm vào vô số phạm vi với thiết kế này để mở rộng nó/thêm các hành vi thay thế, thêm xử lý mặc định phức tạp hơn, v.v.

+0

Bất kỳ ví dụ về cách thức đó sẽ làm việc? Có vẻ như nó sẽ làm xáo trộn những gì đang xảy ra. Có lẽ tôi không theo dõi ... – BabyCakes

+0

vâng - hãy điền ngay bây giờ! – benlumley

+0

Tôi làm như thế này sau khi tất cả - :-) – BabyCakes

1

Là tập hợp các biến mà bạn mong đợi được biết tại thời điểm viết kịch bản lệnh g, hoặc bạn muốn làm điều này cho một tập hợp các giá trị tùy ý? Nếu trước đây là đúng, bạn có thể làm một cái gì đó như thế này:

# This array would hold the names of all the variables you're expecting 
# and a default value for that variable name 
$variableNames = array (...); 
foreach ($variableNames as $key => $default) { 
    if (isset ($_REQUEST[$key])) $$key = $_REQUEST[$key]; 
    else $$key = $default; 
} 

Về cơ bản, điều này có lợi thế về khả năng của PHP để đánh giá các biến để tạo ra các biến số khác (do đó kích đúp đô la cho $$ chính - điều này có nghĩa là tạo ra một biến mới có tên là giá trị của $ key).

Tôi chưa đưa ra giải pháp tốt cho tình huống sau.

2

Trước tiên, sử dụng $_POST cho biến được đăng. $_REQUEST là một mashup của nhiều biến đến khác nhau, không chỉ là $_POST và có thể gây ra sự cố.

Một giải pháp cho câu hỏi của bạn là tạo một hàm xử lý logic isset().

function ForceIncomingValue($Key, $Default) { 
    if (!isset($_POST[$Key])) 
     return $Default; 
    else return $_POST[$Key]; 
} 
+0

vâng, đôi khi tôi sử dụng GET, đôi khi POST vì vậy tôi chỉ sử dụng _REQUEST – BabyCakes

+2

Một lần nữa, _REQUEST không thể tin cậy vì nó cũng bao gồm dữ liệu _COOKIE. Xem tài liệu: http://php.net/request – matpie

+0

thú vị, tôi không biết rằng – BabyCakes

2

trước hết, KHÔNG BAO GIỜ sử dụng biến $ _REQUEST, nó sẽ dẫn đến lỗi và các vấn đề khác trong quá trình phát triển


function getPOST($key) { 
    if(isset($_POST[$key])) { 
     return $_POST[$key]; 
    } 
}

lưu ý rằng mã này rời khỏi trống khi $ _POST [$ key biến ] không được đặt

bạn cũng có thể điều chỉnh mã đó để cho phép bạn thay vào đó cung cấp cho bạn mặc định (hợp lý) khi không thể tải giá trị.

 
function getPOST($key, $default = NULL) { 
    if(isset($_POST[$key])) { 
     return $_POST[$key]; 
    } else { 
     return $default; 
    } 
}
+0

chúng tôi đã sử dụng REQUEST trên khắp nơi trong nhiều năm và tôi chưa thấy bất kỳ sự cố nào. mặc dù chúng tôi không sử dụng cookie ... có thể có điều gì đó liên quan đến nó. – BabyCakes

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