2008-10-06 18 views
42

Tôi đang cố gắng lưu trữ một trang web PHP đã được trao cho tôi. Tôi thấy cảnh báo này:Cảnh báo tác dụng phụ của phiên PHP với các biến toàn cầu dưới dạng nguồn dữ liệu

Cảnh báo: Unknown: Kịch bản của bạn có thể dựa trên một phiên tác dụng phụ mà tồn tại cho đến khi PHP 4.2.3. Vui lòng khuyên rằng tiện ích mở rộng phiên không xem xét các biến toàn cục là nguồn dữ liệu, trừ khi register_globals được bật. Bạn có thể tắt chức năng này và cảnh báo này bằng cách đặt phiên.bug_compat_42 hoặc phiên.bug_compat_warn để tắt, tương ứng. trong Unknown trên dòng

này có nghĩa là gì? Làm thế nào tôi có thể theo dõi nguồn gốc của vấn đề này trong mã?

Trả lời

98

về cơ bản bạn có một biến có cùng tên với phiên của bạn. ví dụ:

$_SESSION['var1'] = null; 
$var1 = 'something'; 

sẽ tái tạo lỗi này. bạn có thể dừng PHP từ cố gắng tìm các biến hiện và cảnh báo bạn về họ bằng cách thêm những dòng này vào kịch bản của bạn:

ini_set('session.bug_compat_warn', 0); 
ini_set('session.bug_compat_42', 0); 

những giá trị này có thể được thiết lập trong php.ini hoặc .htaccess cũng

+0

trình như một say mê! Thumbs up! – Anunay

+2

Đối với những người không phải là tuyệt vời ở sửa đổi các tập tin php.ini, định dạng trên không phải là những gì bạn sử dụng. Nó phải là "session.bug_compat_42 = 0" trên một dòng và "session.bug_compat_warn = 0" trên một dòng khác (không có dấu ngoặc kép). Thực hiện tìm kiếm trong tệp php.ini của bạn trước tiên. Có khả năng cả hai đã được xác định là 1 và bạn chỉ cần chuyển sang 0 – rgbflawed

6

Có vẻ là một vài khả năng có vấn đề ở đây:

http://www.spiration.co.uk/post/1231/Your-script-possibly-relies-on-a-session-side-effect

nói rằng trường hợp như thế này:

$_SESSION['firstname']=$_REQUEST['firstname']; 

sẽ kích hoạt cảnh báo.

Ngoài ra, tôi giải thích nội dung lỗi php này: http://bugs.php.net/bug.php?id=41540 có nghĩa là lỗi này cũng có thể xảy ra khi bạn gán biến cho phiên superglobal chưa được khởi tạo, ví dụ:

//Start of script 
$_SESSION['bob'] = $bob; 
2

Khi bạn đang thực hiện thay đổi đối với ini_set .htaccess không hoạt động. Bạn sẽ cần phải làm như sau:

php_flag session.bug_compat_42 0 
php_flag session.bug_compat_warn 0 
5

Đây là thông tin tốt về việc tìm ra nguyên nhân cảnh báo, nhưng tôi khuyên bạn KHÔNG nên tắt các cảnh báo mà Owen đề cập. Các hàm thời gian chạy này là removed in PHP 5.4.0 và nhà phát triển nên thực hiện việc tránh sử dụng các biến đó.

Để sửa lỗi này, nó có thể là một nỗi đau ở đầu các nhà phát triển, nhưng nếu bạn có

$_SESSION["user"] 
$user; 

đổi tên phiên để

$_SESSION["sessuser"]; 

Hoặc vise-versa chỉ chừng nào phiên tên và tên biến khác nhau.Hãy suy nghĩ về nó theo cách này: khi bạn nâng cấp lên phiên bản mới nhất, bạn sẽ phải gỡ lỗi mã của bạn dù sao đi nữa.

1

trong trường hợp của tôi, thay đổi php.ini từ trên để tắt

như thế này:

session.bug_compat_42 = off 
session.bug_compat_warn = off 

nếu không làm việc, khởi động lại apache