2010-06-03 53 views
10

Tôi đã đọc qua hướng dẫn sử dụng php cho vấn đề này và có vẻ như đây là vấn đề phổ biến nhưng tôi chưa tìm được giải pháp. Tôi đang lưu các phiên trong cơ sở dữ liệu. Mã của tôi là như sau:PHP: phiên không được lưu trước khi chuyển hướng tiêu đề

// session 
$_SESSION['userID'] = $user->id;   
header('Location: /subdirectory/index.php'); 

Sau đó ở phía trên cùng của index.php sau session_start(), tôi đã var_dumped $ _SESSION toàn cầu và userID không có trong đó. Như tôi đã nói, tôi đã xem qua hướng dẫn sử dụng PHP (http://php.net/manual/en/function.session-write-close.php) và không phải session_write_close hoặc session_regenerate_id(true) đã làm việc cho tôi. Có ai biết giải pháp không?

Chỉnh sửa: Tôi có session_start() ở đầu tệp của mình. Khi tôi var_dump phiên toàn cầu trước khi chuyển hướng tiêu đề, tôi thấy userID trong đó, nhưng không thấy trong tệp khác, mà nằm trong thư mục con của tập lệnh này

+0

Bạn có 'session_starting()' nơi bạn thực hiện chuyển hướng không? –

+0

và bạn có chắc chắn rằng $ user-> id được đặt không? – ahmet2106

+0

Xin chào, vui lòng xem nhận xét tôi đã để lại cho bài đăng của @ ahmet2106 – phpNutt

Trả lời

0

Bạn đã có session_start(); ở trên cùng?

Không thử nghiệm nhưng cant bạn làm điều gì đó như thế này:

session_start(); 
$_SESSION['userID'] = $user->id; 
if($_SESSION['userID'] == $user->id) 
{ 
    header('Location: /index.php'); 
} 

Tôi chưa bao giờ có vấn đề này trước đây, thú vị

+0

Có, tôi có. Khi tôi var_dump phiên toàn cầu trước khi chuyển hướng tiêu đề, trong đó, chỉ là không khi tôi đi đến một tập tin mới trong một thư mục phụ của kịch bản gốc – phpNutt

+0

@Matt vui, nhưng nó thực sự thú vị, bởi vì cần phải thiết lập phiên, có thể bất kỳ mã nào khác đang xóa phiên của bạn, bạn có chắc chắn không có nơi nào khác là session_destroy(); ? – ahmet2106

+0

Lạ lùng, tôi đã thay đổi $ _SESSION ['userID'] thành $ _SESSION ['uid'] và nó hoạt động như mong đợi. Tôi không biết tại sao hai chữ cái viết hoa lại tạo nên sự khác biệt. Tôi đã thử nó với userId tốt và đó cũng là tốt. Bất kỳ ý tưởng nào về lý do tại sao nó sẽ không chấp nhận userID? với hai thủ đô, im bị lược bớt – phpNutt

0

userID không có bất kỳ tình trạng từ khóa.

Lý do duy nhất với tôi là $ _SESSION ['userID'] đang bị ghi đè hoặc bị xóa ở đâu đó.

Đảm bảo bạn sử dụng session-> start() trong tất cả các tệp bạn muốn thêm/truy cập phiên.

Một điều quan trọng (điều này có thể không áp dụng được trong trường hợp của bạn), nếu phiên được xử lý bằng cookie, bạn chỉ có thể truy cập cookie theo một thư mục và thư mục con nào đó. Trong trường hợp của bạn dù sao đi nữa, thư mục con sẽ có quyền truy cập vào phiên.

-2

Hãy thử cung cấp session_name() trước khi bạn session_start().

Và chuyển đổi error_reporting(15) để xem lỗi.

4

@ Matt (không thể bình luận nào ...): Nếu:
a) Nó xuất hiện trong phiên giao dịch trước khi chuyển hướng
b) phím khác làm việc

80% thời gian vấn đề là register_globals và sử dụng biến $ userID có tên bằng nhau (19% khác chỉ ghi đè ở những địa điểm không mong đợi, 1% không thể ghi/khóa phiên trước khi chuyển hướng và dữ liệu cũ, trong trường hợp này bạn có thể thử session_write_close() trước khi chuyển hướng). Nó đi mà không nói register_globals nên off: P

+0

3 năm sau đó. session_write_close là bình luận tốt nhất cho ngày hôm nay! –

0

Hãy chắc chắn rằng cả hai trang phiên bản php cùng (php5, php4 đôi khi có những con đường khác nhau phiên)

0

tôi đã không nghe nói về vấn đề này, nhưng tôi thiên đường không được sử dụng phiên tất cả những gì nhiều.

Với phiên bạn PHẢI làm một vài điều và có một vài thiết lập thiết lập:

  • bật cookie về phía khách hàng
  • session_start(), trước bất cứ điều gì xảy ra
  • chắc chắn rằng bạn don' t hủy phiên (trừ khi họ muốn đăng xuất)
  • Id phiên PHP phải giống nhau (liên quan đến cookie)

Một vấn đề khác có thể là $ user-> id đang trả về một tham chiếu đến một đối tượng không tồn tại trên trang tiếp theo. Rất có thể là không, nhưng hãy chắc chắn.

Nếu tôi thấy mã của bạn, tôi có thể giúp bạn nhiều hơn. Nhưng khi gỡ lỗi hãy kiểm tra khóa phiên với session_id() và đảm bảo rằng nó là giống nhau. Nếu bạn có thể thử điều đó thì hãy nói với tôi rằng tôi có thể tiếp tục giúp đỡ.

Tôi cũng muốn biết điều này kết thúc như thế nào khi tôi trở lại phiên.

10

Tôi biết điều này là một toppic cũ nhưng tôi tìm thấy giải pháp (đối với tôi). Tôi đã đặt lối ra sau tiêu đề.

$_SESSION['session'] = 'this is a session'; 
header('location: apage.php'); 
exit; 

này làm việc cho tôi

+0

Cảm ơn! Điều này làm việc cho tôi :) – mattpark22

+0

Điều này làm việc cho tôi là tốt. – jenovachild

+0

Chỉ hoạt động với cùng một thư mục. Làm thế nào để thực hiện công việc này cho thư mục con? F.e .: từ http: /domain.com đến http: /domain.com/subdir/? – arrowman

0

tôi đã cùng một vấn đề thời gian gần đây. Tôi đang viết một trang web MVC tùy chỉnh cho trường học và, như mọi người đã nói, start_session() phải được viết trong dòng đầu tiên của mã.

Vấn đề của tôi là VỊ TRÍ của "session_start()". Nó phải là những dòng đầu tiên của bộ điều khiển toàn cục của bạn, không phải là dòng đầu tiên của khung nhìn. $ _SESSION không thể truy cập trong các tệp của trình điều khiển vì nó chỉ được khởi tạo khi máy chủ hiển thị chế độ xem.

Sau đó, tôi đang sử dụng session_write_close() sau khi tiêu đề ('location: xxx.php') gọi để giữ các biến phiên cho yêu cầu tiếp theo.

ví dụ:

globalController.php:

//First line 
session_start(); 
require_once('Model/Database.php'); 
require_once('Model/Shop/Client.php'); 
... 

logonController.php:

... 
//Users is validated and redirected. 
$_SESSION['client'] = $client; 
header('location: index.php'); 
session_write_close(); 

Hy vọng nó sẽ giải quyết vấn đề của mình.

0

Điều này thật khó chịu nhưng tôi đã tìm ra giải pháp.

config.php i have: bao gồm 'session.php';

Ở đầu session.php, tôi có: session_start();

Bằng cách di chuyển session_start() lên đầu tệp config.php, viola ...

Sự cố được giải quyết!

+0

Nó khá tốt mà bạn đã giải quyết được vấn đề. Tôi sẽ chỉ khuyên bạn nên sạch hơn một chút trong giải pháp của bạn để nó cũng sẽ giúp người đọc khác. – sachinjain024

1

Bạn nên bắt đầu phiên trước khi sử dụng mảng phiên.

Mã PHP,
session_start();
$ _SESSION ['userID'] = $ user-> id;

tiêu đề ('Vị trí: /subdirectory/index.php');

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