2012-03-20 73 views
5

Trong dự án của tôi, tôi có một lớp bọc cho $_SESSION, do đó, các biến phiên có thể được truy cập bởi $session->var. Tôi đã cố gắng để kiểm tra xem các biến session được thiết lập hoặc không sử dụng isset:

if (!isset($this->session->idUser)) { 
    ... 
} 

nhưng isset không được trở về bất cứ điều gì. Vì vậy, trong lớp wrapper của tôi, tôi đã viết hàm sau đây để kiểm tra những gì đang diễn ra.

public function isItSet($var) 
{ 
    die(isset($_SESSION["id"])); 
} 

kết quả này ở trang trống. Tôi đã thử:

public function isItSet($var) 
{ 
    die(is_null(isset($_SESSION["id"]))); 
} 

vẫn là trang trống. Sau đó, tôi đã cố gắng:

public function isItSet($var) 
{ 
    die(isset($_SESSION)); 
} 

này trả về 1.

bất cứ ai có thể cho tôi biết tại sao cố gắng để kiểm tra xem một biến session được thiết lập trở lại không có gì?

+0

Bạn có nhớ session_start(); ? Mặc dù nó có vẻ tầm thường, bạn nên chắc chắn. – Repox

+0

Yup, phiên được bắt đầu trong hàm tạo của lớp cha. die (session_id) trả về một chuỗi như dự định. – Jormundir

+2

Sử dụng 'var_dump' thay vì' die' hoặc 'echo'. Trong PHP một boolean 'false' được chuyển thành chuỗi (trong trường hợp của bạn cho đầu ra) sẽ được chuyển thành một chuỗi rỗng. 'var_dump' sẽ hiển thị cho bạn giá trị và loại thực tế. Đó chỉ là PHP cơ bản, hãy làm cho bản thân bạn thoải mái với ngôn ngữ đầu tiên. – hakre

Trả lời

8

Để hỗ trợ isset(), bạn cần phải quá tải hàm trong trình bao bọc của mình.

Vì vậy, trong wrapper của bạn, thêm:

public function __isset($var){ 
    return isset($_SESSION[$var]); 
} 

Để sử dụng nó, bạn chỉ cần phải làm:

isset($this->session->myVar); 

Nếu nó vẫn không làm việc, làm:

var_dump($_SESSION) 

Điều này sẽ đổ toàn bộ mảng $ _SESSION và cho bạn xem biến mà bạn đang kiểm tra có thực sự tồn tại hay không.

+0

chức năng công cộng __isset ($ var) { isset ($ _ SESSION [$ var]); } \t \t chức năng công cộng isItSet ($ var) { die (isset ($ _ SESSION [$ var])); } Cảm ơn bạn đã phản hồi nhanh nhưng tôi vẫn gặp sự cố tương tự với mã ở trên. Tôi cũng đã thử isset ($ this-> session-> idUser) – Jormundir

+0

Bạn có thể xóa hàm 'isItSet()' vì nó không được sử dụng. Tôi cũng đã cập nhật câu trả lời của mình. – F21

+0

isset ($ this-> session-> var) vẫn không trả về gì cả. Tôi đã loại bỏ isItSet(). var_dump cho thấy $ _SESSION là một mảng trống. (Mà là dự kiến, do đó, không nên các isset trả về false?) – Jormundir

0

Hàm isset: Trả về TRUE nếu var tồn tại và có giá trị khác NULL, FALSE nếu không. nếu biến phiên được đặt cho TRUE nếu biến phiên không được đặt cho FALSE.

Ví dụ:

$_SESSION['views']=1; biến phiên được đặt. => cung cấp cho TRUE

unset($_SESSION['views']); biến phiên không được đặt. => sau này if(isset($_SESSION[$var])) nó cung cấp cho FALSE

Có hai tùy chọn: biến phiên được giải quyết hay không.

isset() chỉ hoạt động với các biến khi truyền bất kỳ thứ gì khác sẽ dẫn đến lỗi phân tích cú pháp. Để kiểm tra nếu hằng số được thiết lập sử dụng hàm đã định nghĩa().

For More Information about isset click here

1

isset trả về một trang trống vì biến của bạn không tồn tại trong phiên, vì vậy isset trả về false, tuy nhiên, echo trở lại false ''.
Nó đã được viết trong bài bình luận để hakre

Bạn có thể kiểm tra điều này như thế:

echo "false : " . false . "\n"; 
echo "true : " . true . "\n"; 

=>

false : 
true : 1 

Vì vậy, đối với thử nghiệm của bạn, làm một var_dump($_SESSION) và bạn sẽ thấy nếu bình thường thì isset($_SESSION['id']) trả về false.

Bạn cũng có thể kiểm tra: die("false : " . (false == isset($_SESSION['id'])));

0

Một vài điều bạn có thể thử:

Thêm phần này vào codebase của bạn: http://philsturgeon.co.uk/blog/2010/09/power-dump-php-applications. Nó tốt hơn nhiều so với var_dump và bạn có thể thấy rõ ràng đúng hoặc false cho các giá trị boolean. Nó đã cứu tôi nhiều đau buồn.

Thứ hai, die() không phải lúc nào cũng cho tôi những gì tôi mong đợi, vì vậy tốt hơn là hãy echo thứ gì đó và sau đó die() ngay sau đó.

Như @ doydoy44 đã đề cập, false xuất kết quả trống, vì vậy bạn có thể nhận được trang trống vì lý do chính đáng. Một lần nữa, liên kết ở trên sẽ giải quyết vấn đề này và làm cho mọi việc rõ ràng hơn.

Mã ban đầu ở trên có idUser làm biến được chọn, tất cả các ví dụ khác của bạn sử dụng id. Tôi cho rằng bạn biết điều đó, nhưng tôi nghĩ tôi sẽ đề cập đến nó trong trường hợp.

Cuối cùng, tôi muốn kiểm tra chéo xem trình bao bọc phiên có hoạt động như tôi mong đợi hay không, ví dụ:

if (!isset($this->session->idUser)) { 
    dump($_SESSION); 
    dump($this->session); 
} 

Tôi chắc chắn sẽ nhận được cùng một nội dung từ cả hai.

Hy vọng rằng sẽ giúp phần nào.

3

Theo ý kiến ​​của tôi, vấn đề có liên quan đến thử nghiệm chứ không phải với phiên PHP.

Các CHỦ LÝ DO đằng sau lý do tại sao biến phiên isset trả về không có gì là sử dụng die() chức năng mà là tương đương để thoát() theo PHP của nhãn hiệu riêng của mình.

http://in1.php.net/die

Vì vậy, sử dụng var_dump() để thay thế.

0

Bằng giao diện của nó, có vẻ như không có khóa "ID" trên mảng phiên. Điều này đã được xác minh trên nhận xét của bạn về câu trả lời của F21 ("lỗi chỉ mục không xác định").

Điều bạn có thể làm là xác định/khởi tạo khóa "ID" trên mảng phiên có giá trị là chuỗi rỗng hoặc trống "" sau khi phiên của bạn đã bắt đầu. Sau đó điền nó với giá trị của bạn sau này với mã của bạn.

Điều này là để đảm bảo rằng khi bạn sử dụng isset ($ _ SESSION [ "ID"], kết quả có thể là đúng hay sai chứ không phải là một lỗi chỉ số không xác định.

1

Kết quả của bạn là cơ bản đúng.

các giá trị boolean được chuyền qua mỗi chức năng chỉ nhầm lẫn bạn tôi nghĩ.

Heres một sự giải thích rõ ràng những gì xảy ra với mỗi người trong tuyên bố của mình.

LETS GET ONE BY ONE CNTT

// declaring this array as a set of session being passed as sample. 
$string = array('name'=>'kaii'); 

echo die(isset($string['id'])); // figure 1 
// step 
// isset($string) returns a value of false because of unexistent of an array with the name of id. 
// die(false) returns nothing because of the value being passed by isset is false. 
// result would be definitely empty 

echo die(is_null(isset($string['id']))); // figure 2 
// step 
// isset($string) returns a value of false because of unexistent of an array with the name of id. 
// is_null(false) returns a value of false because it only accepts NULL as its parameter value to return true. 
// die(false) returns nothing because of the value being passed by is_null is false. 
// result would be definitely empty 


echo die(isset($string)); //figure 3 
// step 
// isset($string) returns a value of true because of a $string variable is set and exist. 
// die(true) returns a value of 1 because of the value being passed is true which is equivalent to 1 . 
// result would be definitely return a value of 1. 

lưu ý: Nói chung tuyên bố của bạn là chính xác chỉ cần một vài biện minh để hỗ trợ nó.


bổ sung:

print_r(), var_dump()

  • sử dụng nó để kiểm tra phiên của bạn nếu nó có một cái tên mà bạn đang cố gắng để tuyên bố.

Một giải thích ngắn gọn:

isset()

  • trả về một giá trị boolean của true hoặc false

is_null()

  • chỉ chấp nhận giá trị tham số NULL để trả lại giá trị boolean là true khác đi theo số false.

die()

  • trả về một giá trị là 1 cho true và giá trị rỗng cho false.

Lý do:

  • Một giá trị boolean TRUE được chuyển thành chuỗi "1". Boolean FALSE được chuyển thành ""
0

Biến phiên là một chút phép thuật. Ít ma thuật hơn lịch sử, nhưng vẫn không ngạc nhiên khi thấy những điều bất thường.Sẽ có ý nghĩa khi chạy thử nghiệm trong câu hỏi ở ba trạng thái: một lần với tập hợp biến phiên và hai lần không có tập biến phiên - một lần với một tập biến phiên khác và một lần không có biến phiên được đặt.

Điều chỉnh câu trả lời của F21, để hỗ trợ isset(), bạn cần phải quá tải hàm trong trình bao bọc của mình. Trong khi làm điều đó bạn cũng có thể tạo ra một isset có chức năng như bạn mong đợi.

Nội dung nào đó sau đây sẽ giải quyết cả 'sai là vô hình' và có vấn đề với việc xóa giá trị phiên.

public function __isset($var){ 
if (isset($_SESSION[$var]) && $_SESSION[$var]."">"") { 
    return true; 
} else { 
    return false; 
} 
} 
Các vấn đề liên quan