2009-03-19 6 views
7

Tôi không thể sử dụng các biến phiên trên một trang khác với trang mà chúng được đặt, IOW chúng hoạt động như các biến không phải phiên. Tôi đã tìm thấy một câu hỏi tương tự được đăng trong một nửa tá tương tự khác fora, nhưng câu trả lời trong những trường hợp khác luôn luôn quay ra không áp dụng.Biến số phiên PHP Không được bảo quản

Dưới đây là tác phẩm của tôi:

sess1.php

<?php 
session_start(); 

session_register("userid"); 
session_register("textvar"); 

$_SESSION['userid'] = 10333 ; 
$_SESSION['textvar'] = TextVariable ; 

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; 
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; 
?> 
<p>Go to the <a href="sess2.php">next page</a>.</p> 

sess2.php

<?php 
session_start(); 

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; 
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; 
?> 

Sản lượng trình duyệt trong mỗi trường hợp là:

sess1.php

User ID là: 10333

biến khác là: TextVariable

Chuyển đến [Trang tiếp theo].

sess2.php

Biến phiên userid là:

Biến session khác là:

Chuyển đến [Trang cuối].

Một vài điều đó là KHÔNG:

  • Tôi có session_start() ở phía trên cùng của cả hai tập tin.
  • Thư mục biến có thể ghi và các biến phiên được hiển thị ở đó. (Tôi có khoảng một trăm tập tin nhỏ gọi là sess_b62, có cái này bên trong: 'userid | i: 10333; textvar | s: 12: "TextVariable";'.)
  • phpinfo() cho tôi biết rằng tệp php.ini đang được đọc chính xác và thời gian tồn tại được đặt thành mặc định, 0, tức là cho đến khi trình duyệt được đóng lại.

Tôi sắp kết thúc. Bất kỳ đề xuất?

Cảm ơn rất nhiều.

+0

Bạn đã kiểm tra xem có sử dụng cùng một ID phiên không? – Gumbo

+0

Có phải một trong các trang qua SSL không? –

+0

Bạn đang chạy phiên bản PHP nào? (từ phpinfo() là tốt) –

Trả lời

2

ID phiên phải được thực hiện theo một cách nào đó để có thể sử dụng cùng một phiên trên nhiều trang. Nói chung, việc này được thực hiện bằng cookie (xem session.use_cookies) nhưng cũng có thể được thực hiện trong URL hoặc dưới dạng (xem session.use_trans_sid).

Vì vậy, trước tiên bạn phải đảm bảo rằng ID phiên được truyền để PHP có thể tải dữ liệu phiên và phiên phù hợp.

Xem thêm Is my understanding of PHP sessions correct?

+0

Cảm ơn sự giúp đỡ. phpinfo() dường như xác nhận rằng tôi đang sử dụng cookie và ID đang được truyền đi. session.use_cookies là "On" và session.use_trans_sid là 0. Set-Cookie ghi lại cookie đã được tạo bởi trang đầu tiên và trang đó được đặt tên làm người giới thiệu. –

+0

Và ID phiên là giống nhau trên cả hai trang?Trường tiêu đề Set-Cookie đã được gửi không có nghĩa là cookie đã được chấp nhận và gửi cùng với yêu cầu thứ hai. Hãy thử so sánh các giá trị trả về 'session_id()' trong cả hai trang. – Gumbo

+0

Crud. ID phiên là khác nhau. Giờ thì sao...? –

7

session_register() không bắt buộc và có thể gây ra sự cố ở đây. Đọc tài liệu trên session_register() - nó được thiết kế để gán các biến phiên sử dụng các biến hiện có.

và từ here:

Vâng, session_register() cho PHP là một biến toàn cầu nhất định cần được xem xét một biến phiên.Điều đó có nghĩa là khi kết thúc việc thực thi tập lệnh (tức là khi ghi dữ liệu phiên thường xảy ra), giá trị kết quả của biến toàn cục đó sẽ được ghi bằng cách sử dụng các trình xử lý phiên được bật hiện tại.

Tôi nghĩ rằng đây là vấn đề mà bạn đang gặp phải. Khi kết thúc việc thực thi tập lệnh, biến phiên được ghi đè lên.

+0

Vâng, session_register() đã bị ngừng sử dụng trong một thời gian, nó chắc chắn không nên được sử dụng nữa. Tôi không biết liệu nó có gây ra vấn đề cụ thể này hay không, nhưng nó không nên ở trong mã đó bất kể. –

+0

Thú vị. Tôi đang làm việc từ một cuốn sách PHP/SQL giới thiệu có bản quyền '07 và mã này là một trích dẫn trực tiếp. Thật không may, việc xử lý lại các dòng session_register() dường như không giải quyết được vấn đề. Cảm ơn rất nhiều vì thông tin. –

0

Sử dụng một số loại công cụ và kiểm tra tiêu đề http để bạn có thể xem cách cookie được gửi. Có lẽ máy chủ web của bạn bị bỏ lỡ cấu hình và gửi cookie có tên miền khác không hợp lệ.

Bạn có thể muốn xem xét việc thực hiện session_set_cookie_params() trên mỗi yêu cầu và đảm bảo tên miền, đường dẫn chính xác và các cài đặt như vậy được đặt.

-1

Sử dụng session_register trong cả hai tệp và tệp sẽ hoạt động.

+0

Cảm ơn bạn đã đề xuất. Tôi đã thử cả hai cách, với các session_register() dòng trong cả hai tập tin, và không có. Không có thay đổi nào đối với hành vi xuất hiện. –

+0

session_register không được dùng nữa: không sử dụng nó nếu bạn có thể tránh nó – rhodesjason

+0

@ Jason: chăm sóc chia sẻ một số URL mà nó nói rằng nó không được chấp nhận? Những gì nên được sử dụng thay thế? –

2

Một lỗi mà tôi thấy là trong tệp đầu tiên bạn đang đặt $_SESSION['textvar'] và trong tệp thứ hai bạn đang gọi $_SESSION['newvar'].

Ngoài ra, tôi đã kiểm tra mã của bạn trên máy chủ mà tôi biết đang hoạt động và nó hoạt động tốt hơn so với lỗi trên.

Tôi cũng đã thử xóa session_register() và mã vẫn hoạt động hoàn hảo.

+0

Tốt mắt - "newvar" là một lỗi đánh máy, còn lại từ khi tôi sao chép mã vào các tập tin mới đơn giản hơn. Nhưng giải pháp session_register() không hoạt động trên hệ thống của tôi. Cảm ơn rất nhiều vì gợi ý. –

+0

Bạn đã thử xóa cookie của mình (hoặc xóa cookie của trang web này) và truy cập trang này là trang đầu tiên bạn truy cập lại chưa? Ngoài ra, bạn có chắc là không có văn bản nào khác ở trên hoặc

1

"session_register() chấp nhận một số biến của tham số, bất kỳ trong số đó có thể là một chuỗi giữ tên của một biến hoặc một mảng gồm tên biến hoặc mảng khác. Đối với mỗi tên, session_register() đăng ký biến toàn cầu với tên đó trong phiên hiện tại. "

vì bạn không có biến nào với những tên đó, kết quả sẽ không thể đoán trước.

chỉ cần sử dụng $_SESSION[$key] = $value;

1

Nếu tất cả các cách trên không giải quyết vấn đề, tôi sẽ chỉ cần hỏi rõ ràng: Có wouldn't có bất kỳ dấu cách hoặc mới dòng trước thẻ mở php?

Bạn cũng có thể kiểm tra thư trong tệp nhật ký lỗi máy chủ, điều đó sẽ cho bạn biết liệu biến của bạn có được xác định hay không (mặc dù tôi đoán điều đó cũng phụ thuộc vào mức độ báo cáo lỗi).

0

Một điều rõ ràng khác cần kiểm tra:

Đảm bảo không gian đĩa của bạn chưa đầy; điều này sẽ ngăn việc lưu dữ liệu phiên.

0

Biết đây là bài đăng cũ hơn nhưng tôi đã gặp sự cố tương tự (không sử dụng session_register()).

Đã phải chuyển đổi phiên thành cookie vì phiên đã hết thời gian và do máy chủ được thiết lập (môi trường lưu trữ máy chủ Windows đặc biệt (với Apache)), không thể thay đổi giá trị thời gian phiên PHP .

Kết quả cuối cùng là/là bây giờ sau khi chuyển đổi sang Cookie có thời lượng kéo dài, dữ liệu cookie vẫn đang bị mất (trong truyền dẫn)? đôi khi.

Rất bực bội.

Tôi chưa bao giờ có điều này xảy ra trong môi trường LAMP nên có thể câu hỏi đặt ra là liệu bạn có đang sử dụng máy chủ LAMP hay không.

Hy vọng điều này sẽ hữu ích. Tôi không nghĩ rằng đây là một vấn đề PHP.

3

Tôi đang đối mặt với cùng một vấn đề. Lý do là, trong php.ini Tôi đã đặt giá trị của tham số session.cookie_secure thành . Nhưng tôi đã sử dụng http thay vì https trong url. Sử dụng https đã giải quyết được sự cố.

Đặt session.cookie_secure = 1 cho biết cookie chỉ được gửi qua kết nối an toàn. Vì vậy, tôi đã nhận được session_ids mới trên mỗi trang mới trong khi sử dụng http.

0

Kiểm tra nhật ký máy chủ của máy chủ PHP của bạn, ví dụ: nginx hoặc apache.

Bạn có thể tìm thông tin tại sao phiên không hoạt động trong nginx error.log. Đường dẫn đến tệp đó thường là: /var/log/nginx/error.log.

Trong trường hợp của tôi, dữ liệu phiên không thể lưu được. Nó bật ra rằng trong cùng một thư mục cũ error.log.1 tập tin có kích thước 17 GB và lấy tất cả không gian đĩa có sẵn.

Đơn giản giải phóng không gian đĩa khôi phục hành vi bình thường của phiên.