2010-03-19 44 views
5

Tôi đã cố gắng gỡ lỗi vấn đề này trong nhiều giờ, nhưng không có kết quả. Tôi đã sử dụng PHP trong nhiều năm, và đã trở lại nó sau một thời gian gián đoạn dài, vì vậy tôi vẫn còn một chút gỉ.Biến phiên dựa trên PHP không giữ lại giá trị. Hoạt động trên localhost, nhưng không phải trên máy chủ

Dù sao, các $ _SESSION vars của tôi không giữ lại giá trị của họ vì một số lý do mà tôi không thể tìm ra. Các trang web đã làm việc trên localhost hoàn hảo, nhưng tải nó lên máy chủ dường như phá vỡ nó.

Điều đầu tiên tôi đã kiểm tra là cài đặt máy chủ PHP.ini. Mọi thứ đều ổn. Trong thực tế, hệ thống đăng nhập của tôi là phiên dựa và nó hoạt động hoàn hảo. Vì vậy, bây giờ mà tôi biết $ _SESSIONS đang hoạt động đúng và giữ lại giá trị của họ cho đăng nhập của tôi, tôi giả sử máy chủ được thiết lập và vấn đề là trong kịch bản của tôi.

Đây là phiên bản bị tước mã đang gây ra sự cố. $ type, $ order và $ style không được giữ lại sau khi chúng được thiết lập thông qua biến GET. Người dùng nhấp vào liên kết, đặt biến qua GET và biến này được giữ lại cho phần còn lại của phiên của họ.

Có vấn đề gì với logic của tôi mà tôi không thấy?

<?php 
require_once('includes/top.php'); //first line includes a call to session_start(); 
require_once('includes/db.php'); 

$type = filter_input(INPUT_GET, 't', FILTER_VALIDATE_INT); 
$order = filter_input(INPUT_GET, 'o', FILTER_VALIDATE_INT); 
$style = filter_input(INPUT_GET, 's', FILTER_VALIDATE_INT); 

/* 
According to documentation, filter_input returns a NULL when variables 
are undefined. So, if t, o, or s are not set via URL, $type, $order and $style 
will be NULL. 
*/  

print_r($_SESSION); 
/* 
All other sessions, such as the login session, etc. are displayed here. After 
the sessions are set below, they are displayed up here to... simply with no value. 
This leads me to believe the problem is with the code below, perhaps? 
*/ 


// If $type is not null (meaning it WAS set via the get method above) 
// or it's false because the validation failed for some reason, 
// then set the session to the $type. I removed the false check for simplicity. 
// This code is being successfully executed, and the data is being stored... 
if(!is_null($type)) 
{ 
    $_SESSION['type'] = $type; 
} 
if(!is_null($order)) 
{ 
    $_SESSION['order'] = $order; 
} 
if(!is_null($style)) 
{ 
    $_SESSION['style'] = $style; 
} 


$smarty->display($template); 

?> 

Nếu bất cứ ai có thể chỉ cho tôi đúng hướng, tôi sẽ đánh giá cao điều đó. Cảm ơn.

Trả lời

7

Không thể tin được!

Sau ba giờ gỡ lỗi, tôi đã tìm ra vấn đề

HostGator, không-yêu còn chủ của tôi, chạy mặc định của họ ini với register_globals ON

Tôi không thể tin điều này.

Vì vậy, các biến $ type của tôi đã bị ghi đè bằng $ _SESSION ['type'] và chúng được coi là giống nhau. Vì vậy, nó là một vấn đề máy chủ gây ra vấn đề, không phải mã hóa của tôi. Đó là điều tuyệt vời để biết, nhưng tôi muốn 5 giờ kéo tóc ra sau.

Tôi hy vọng điều này sẽ giúp ai đó xuống đường có sử dụng HostGator và bị nhầm lẫn là địa ngục.

+0

Tôi cũng đã trải nghiệm điều đó một lần. Nó chỉ là khủng khiếp nếu bạn không mong đợi hành vi kỳ quặc như vậy. – Gumbo

+0

@Foo cảm ơn bro! Bạn đã lưu 5 giờ của tôi. Cảm ơn rất nhiều. –

+0

Tôi vừa đăng nhập để +1 cả câu hỏi và câu trả lời của bạn. Nó khiến tôi phát điên. –

1

Bạn cần gọi hàm session_start(). Trước khi truy cập biến số $_SESSION.

Sau đó Nó sẽ giữ lại tất cả các biến PHIÊN cho bạn ..

+0

Session_start() được gọi trong tệp được yêu cầu/bao gồm đầu tiên, ở trên cùng. Các biến dựa trên phiên khác đang hoạt động, do đó phiên được tạo và bắt đầu hoàn hảo. – Foo

0

Tôi nghĩ rằng bạn chỉ ra bạn đã thực hiện một cuộc gọi đến session_start() trong top.php phải không? Và một điều khác tôi nhận thấy là bạn đang xác thực các trường Integer thông qua Bộ lọc PHP. Hãy chắc chắn rằng chúng là giá trị số nguyên hoặc bạn bị ràng buộc để kết thúc với giá trị null. Thực hiện kiểm tra để xem các giá trị TYPE, ORDER và STYLE có được đặt trước khi xác thực hay không. Hãy ghi nhớ rằng, bằng cách sử dụng bộ lọc php là để xác nhận cho một loại nhất định và không để lưu trữ. Tôi không nghĩ rằng $ loại sẽ lưu trữ dữ liệu của bạn, nó sẽ là một kiểm tra boolean. Thử gán biến $ _GET [] cho biến SESSION VARIABLES. Hi vọng điêu nay co ich.

+0

Cảm ơn các đề xuất. Tôi đã thử nó, tất cả các biến đang được thiết lập. Trên thực tế, $ _SESSION ['type'] hoặc bất kỳ IS nào được đặt bằng mã của tôi. Nó không chỉ giữ lại giá trị khi bạn tiếp tục duyệt trang web. Không có địa điểm nào khác đang bỏ đặt hoặc ghi đè lên. – Foo

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