2011-01-06 66 views
6

Tôi đang làm việc với wamp2.0 - PHP 5.3, apache 2.2.11 nhưng phiên của tôi không lưu trữ dữ liệu.Phiên làm việc PHP không hoạt động

Tôi có một trang mà chấp nhận một tham số, trong đó (phiên bản đơn giản) Tôi cửa hàng muốn trong một phiên, vì vậy khi tôi đến

http://www.example.com/home.php?sessid=db_session_id 

Các kịch bản trông giống như:

session_start(); 

$sessid = @$_GET['sessid']; 
if ($sessid) { 
    $_SESSION['sessid'] = $sessid; 
} 
var_dump($_SESSION); 

và kết quả đầu ra:

array(1) { [0]=> string(13) "db_session_id" } 

thì tốt, nhưng khi tôi đi đến link (không có t tham số sessid) mảng $_SESSION trống. Tôi đã cố gắng để nhận xét dòng $_SESSION['sessid'] = $sessid; trước khi truy cập trang mà không có thông số, nhưng nó vẫn không hoạt động.

Tôi đã kiểm tra đầu ra session_id() và id phiên vẫn giữ nguyên.

thiết lập phiên từ phpinfo()

Session Support enabled 
Registered save handlers files user 
Registered serializer handlers php php_binary wddx 

Directive Local Value Master Value 
session.auto_start Off Off 
session.bug_compat_42 On On 
session.bug_compat_warn On On 
session.cache_expire 180 180 
session.cache_limiter nocache nocache 
session.cookie_domain no value no value 
session.cookie_httponly Off Off 
session.cookie_lifetime 0 0 
session.cookie_path//
session.cookie_secure Off Off 
session.entropy_file no value no value 
session.entropy_length 0 0 
session.gc_divisor 1000 1000 
session.gc_maxlifetime 1440 1440 
session.gc_probability 1 1 
session.hash_bits_per_character 5 5 
session.hash_function 0 0 
session.name PHPSESSID PHPSESSID 
session.referer_check no value no value 
session.save_handler files files 
session.save_path c:/wamp/tmp c:/wamp/tmp 
session.serialize_handler php php 
session.use_cookies On On 
session.use_only_cookies On On 
session.use_trans_sid 0 0 

EDIT:

Các phiên được xóa bởi một iframe. Tôi không biết tại sao, nhưng khi nhận xét, các phiên hoạt động tốt. Thing là, iframe phải ở lại ở đó (tất nhiên là xấu, nhưng tôi không thể làm gì về nó). Bạn có biết cách giải quyết các phiên làm việc với iframe không?

+1

Bộ 'COOKIE' có được đặt trong trình duyệt không? –

+0

nếu bạn có nghĩa là biến '$ _COOKIE', thì có, nó được đặt là – Elwhis

+0

Chờ, tôi là người duy nhất ở đây nhận thấy rằng tập lệnh này hoàn toàn sai cho mục đích tác giả và nó hoạt động như nó thực sự phải không? Nếu bạn không đặt $ _GET ['sessid'] thì không phải $ sessid được đặt và câu lệnh if không chạy. – Shoe

Trả lời

1

Một khung có thể truy cập phiên chỉ khi nó có liên quan đến cùng một tên miền. Ví dụ:

<? 
$_SESSION["foo"]="foo"; 
?><html> 
<body> 
    <iframe src ="test.php" width="200" height="200"></iframe> 
</body> 
</html> 
<? 
print_r($_SESSION); 
?> 

Nên làm việc bên ngoài và bên trong khung nội tuyến. Nếu bạn vẫn gặp sự cố, hãy thử:

<?php session_start(); 

    $sessid = $_GET['sessid']; 
    if (isset($sessid) && $sessid != "" && $sessid != NULL) { 
     $_SESSION['sessid'] = $sessid; 
    } 
    print_r($_SESSION);?> 
0

Tôi chỉ có thể đoán từ những gì đang xảy ra ở đó phiên của bạn không được lưu trữ. Là session.save_path -> c:/wamp/tmp một thư mục có thể ghi (bỏ chọn chỉ đọc trong thuộc tính)? Là apache đang chạy như một quản trị viên hoặc một số cấp với đủ quyền để ghi vào thư mục đó trong các dịch vụ trong các công cụ quản trị trong bảng điều khiển?

Thực ra, hãy kiểm tra điều này: PHP session vars not being maintained. Về cơ bản, chạy session_id() trên trang đó hai lần và so sánh các id phiên. Nếu chúng khác nhau thì trình duyệt của bạn không chấp nhận cookie phiên.

EDIT: Không nhận ra bạn đã làm điều đó.^

Điều này có thể hữu ích. Link < --- Nhìn vào gợi ý/câu trả lời thứ hai với mã gỡ lỗi cho phiên.

+0

Mọi thứ đều ổn. Các tệp phiên được tạo ra một cách propperly. Tập tin cuối cùng chứa 'sessid | s: 0:" ";', vì vậy nó được viết nhưng không có dữ liệu. Thật lạ lùng – Elwhis

+0

Bạn có thể chạy var_dump ($ _ SESSION. "". $ _ COOKIE); ngay sau session_start? – Norm

+0

Thực hiện chỉnh sửa cho câu trả lời của tôi, tôi đã thêm một liên kết khác để xem. – Norm

0

http://php.net/manual/en/function.session-start.php

Bạn có phải đặt một cái gì đó bên trong mảng $ _SESSION toàn cầu cho nó để đăng ký bất cứ điều gì, nếu không, nó trống rỗng ...

Vì bạn đang thử nghiệm sự tồn tại của sessid để thêm nó vào $ _SESSION, $ _SESSION vẫn trống.

Hãy thử một cái gì đó như:

session_start(); 
$_SESSION['sessid'] = 123456789; 
var_dump($_SESSION); 
+0

nếu tôi làm var_dump trên '$ _SESSION' sau' if ($ sessid) ... 'các biến được lưu trữ ở đó, nhưng không được giữ bên trong khi tôi đi trang khác mà không có tham số – Elwhis

+0

Điều này hiểu sai câu hỏi của bạn như tôi đã làm . Ông FIRST thiết lập các tham số sessid và phiên nên đăng ký biến, THEN nó đi trong cùng một trang mà không cần thiết lập sessid và biến nên ở đó. – Shoe

0

...

Có thể vì bạn không sử dụng tên miền? Trong câu hỏi của bạn, bạn sử dụng example.com, tuy nhiên bạn đang phát triển trên máy cục bộ của mình. Tôi cho rằng bạn đang sử dụng localhost.

Bạn nên biết rằng người ta không thể thiết lập cookie trên localhost, xem ví dụ: Cookies on localhost with explicit domain

Bạn đã thử code của bạn trên máy chủ khác?

http://blog.perplexedlabs.com/2008/12/21/php-sessions-on-localhost/

0

tôi không biết nếu nó là nguyên nhân của vấn đề của bạn (lỗi ức chế @ có vẻ hơi out-of-nơi đây ...), nhưng tôi sẽ đơn giản hóa một chút.

Vì vậy, thay vì:

$sessid = @$_GET['sessid']; 
if ($sessid) { 
    $_SESSION['sessid'] = $sessid; 
} 

Tôi sẽ sử dụng:

if (isset($_GET['sessid'])) 
{ 
    $_SESSION['sessid'] = $_GET['sessid']; 
} 

Bằng cách này, tôi cũng sẽ làm một số đầu vào kiểm tra trên $_GET['sessid'] để chắc chắn rằng nó chỉ chứa ký tự được phép.

1

Nếu bạn gặp vấn đề tương tự, tôi thấy đây là một thử nghiệm khá đáng giá. Chạy một vài yêu cầu trong trình duyệt và xem những gì bạn nhận được.

<?php 

session_start(); 

$_SESSION['test'][] = time(); 

header('Content-type: text/plain'); 
print_r($_SESSION); 

Đối với tác giả: Nhận xét cuối cùng của bạn đề cập đến tập lệnh của bạn đang hoạt động - tốt cho bạn. Nếu nó phá vỡ sau đó thử các bit code ở trên và cho tôi biết những gì bạn nhận được.

1

Đó là một câu hỏi cũ, nhưng tôi đến đây với cùng một vấn đề. Khi câu hỏi không được trả lời, ở đây nó đến những gì tôi đã tìm thấy.

Tôi gặp sự cố tương tự và trong trường hợp của tôi, vấn đề là tôi không gọi số session_start() trong tất cả các trang mà phiên được sử dụng. Tôi nghĩ tôi nên gọi nó chỉ trong trang "đăng nhập", nhưng điều này không đúng.

Ngoài ra, hãy nhớ rằng session_start() phải được gọi trước thẻ <html>.

2

Bạn phải gọi lệnh session_start(); trong mỗi trang. Nó làm việc cho tôi. Bạn cũng phải gọi nó trước khi bất kỳ đầu ra nào (html, output, thậm chí khoảng trắng) được gửi tới người dùng.

1

Hôm nay tôi đã dành khoảng bốn giờ với $ _SESSION không được lưu tại máy chủ. Hóa ra đó là sự cố máy chủ. Hệ thống (Windows 2003, IIS 6) đã sử dụng thư mục tạm thời mặc định của Windows C: \ Windows \ Temp \ để lưu phiên. Nó tạo ra nó nhưng nó trống rỗng.

Vì lý do nào đó, nó chỉ dừng lại để hoạt động (không có vấn đề gì trước đó). Tôi đoán tốt nhất là nó đã đạt đến giới hạn hoặc thư mục chỉ chứa quá nhiều tệp. Tôi đã sắp xếp nó ra bằng cách đặt session.save_path thành một thư mục khác.

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