Lưu ý khi sử dụng session trong PHP 2008-06-25 08:33:29


Đây là 1 lỗi đơn giản nhưng nếu không để ý sẽ rất dễ bị: đặt tên biến trùng với tên session
<?php
$_SESSION
['id'] = 4;
$id = 7;
print
$_SESSION['id']; // 7
?>
nghĩa là giá trị của $_SESSION['id'] đã bị thay đổi

Tra loi 30 comment(s) TG 2008-06-25 08:33:29

Quan Tran Anh 2008-06-25 08:37:11

Nếu nhớ ko nhầm thì để register_globals ON thì mới có cái này thì phải. Lâu ko đụng vào quên béng

Tra loi

changtraingheo 2008-06-25 09:06:29

@QTA: chính xác, nhưng thương register_globals là ON
@TG: chắc đang code bị cái này phải ko, lên post cho anh em liền ^^

Tra loi

Quan Tran Anh 2008-06-25 01:32:08

Đâu có, để bảo mật/lí do gì đó mà thường các sơ vờ để OFF chứ nhỉ :D

Tra loi

web20vn.com 2008-06-26 02:17:33

Làm gì có chuyện như vậy, giá trị của biến không thể nào bị gán vào trong $_SESSON được, kể cả khi register_globals = On (EGPCS or GPC).

Tra loi

TG 2008-06-26 08:14:57

TG đã gặp nhiều lần gùi, các bạn có thể test :)

Tra loi

gaulucky92 2008-06-26 03:09:39

Tớ xài XAMPP, dù chỉnh register_global Off hay On (mặc định là Off) thì cũng ko thay đổi gì cả! Coi chừng TG gán giá trị từ trước nên bị lầm chăng!?

Tra loi

web20vn.com 2008-06-27 01:38:07

Tất nhiên là test rồi, kết quả giống như gaulucky92 thôi.

Tra loi

G.K 2008-06-30 11:59:50

Cái này lúc trước lúc mới tập code do sơ ý mình cũng bị. Thành ra rút kinh nghiệm đặt tên session có thêm cái ghi chú s_name chẳng hạn để tránh bị vụ này.

Tra loi

hero_vanchien 2008-06-30 02:02:59

Đó là điều không thể xây ra.
register_global đặt là on hay off chỉ ảnh hượng đến việc bạn cần hay không cần khai báo cú pháp global $TenBien thôi chứ không thể ảnh hưởng đến dữ liệu của biến
$_SESSION['id'] và $id là 2 cái chẳng liên quan gì đến nhau cả mà để có thể nói là nó ảnh hưởng đến nhau.

Tra loi

TG 2008-06-30 09:18:15


Sau những ý kiến của anh em, TG test lại thì kết quả như sau:
nếu viết:
<?php
$_SESSION
['id'] = 4;
$id = 7;
print
$_SESSION['id']; // 7
?>
thì giá trị của $_SESSION không bị thay đổi nhưng nếu viết thành 2 file thì giá trị sẽ bị thay đổi:
<?php
session_start
();
$_SESSION['a'] = 4;
$a = 5;
echo
'<a href="b.php">b.php</a>';
?>
và file b.php:
<?php
session_start
();
print
$_SESSION['a'];
?>
các bạn có thể test lại kết quả này


Tra loi

hero_vanchien 2008-06-30 10:05:15

Xin thành thật chia buôn...Kết quả khi link qua trang b.php là 4.

Bạn có thể giải thích cơ sở nào khiến bạn nghĩ chúng có liên quan đến nhau???

Tra loi

TG 2008-07-01 09:18:51

cơ sở là: test nó chạy như vậy, ở đây cũng có 1 số anh em đã gặp chứ không riêng TG
G.K
Cái này lúc trước lúc mới tập code do sơ ý mình cũng bị. Thành ra rút kinh nghiệm đặt tên session có thêm cái ghi chú s_name chẳng hạn để tránh bị vụ này.

TG sẽ tìm hiểu nguyên nhân của cái này

Tra loi

Connhagiau89 2008-07-01 01:37:35

Lưu ý thêm nữa là tên biến trùng với tên của button cũng bị như trường hợp trên :)) mình đã bị 1 lần

Tra loi

web20vn.com 2008-07-02 09:33:59

Bạn thử tìm hết trong code xem có hàm này không extract

Tra loi

web20vn.com 2008-07-02 09:39:19

Nếu nó lỗi thì phiên bản PHP là bao nhiêu?

Tra loi

hero_vanchien 2008-07-04 12:10:08


Lưu ý thêm nữa là tên biến trùng với tên của button cũng bị như trường hợp trên :)) mình đã bị 1 lần

Bái phục các bạn khi tìm ra được những bug như thế này. Nếu bạn mail thông báo cho Zend thì có thể họ xẽ da tạ bạn một khoản khá đấy.
Xin lỗi vì cách nói hơi sốc của mình nhưng bạn kiểm tra kỹ lại code trước khi kết luận đó là bug hay là mình còn non tay nhé

Tra loi

Bảo Khánh 2008-08-11 08:40:41

Bái phục các bạn khi tìm ra được những bug như thế này. Nếu bạn mail thông báo cho Zend thì có thể họ xẽ da tạ bạn một khoản khá đấy.
Xin lỗi vì cách nói hơi sốc của mình nhưng bạn kiểm tra kỹ lại code trước khi kết luận đó là bug hay là mình còn non tay nhé
Thêm ý kiến
@hero_vanchien: Mình thấy trong này rất nhiều cao thủ PHP chẳng hạng TG. Mình nghĩ bạn kh6ong nên nói như vậy, vì thật sự mà nói thì lập trình viên là 1 nghề học hỏi mãi mãi chứ đừng nên khẳng định mình như thế, núi này cao còn có núi cao hơn mà.

@TG cái này thì mình chưa bị nên mình không biết chắc. mà chưa mình nghĩ là kg bị.

Lưu ý thêm nữa là tên biến trùng với tên của button cũng bị như trường hợp trên :)) mình đã bị 1 lần
@Connhagiau89: cái này là chắc chắn bị nếu register_globals là ON. Vì register_globals là on thì PHP sẽ xem tất cả biến là 1, trong đó có $_POST, $_GET... bạn chú ý nhé.

Tra loi

bonguoita 2008-08-13 08:42:16


Mình đã test kĩ.

Windows XP SP2, Apache 2.2.x, PHP 2.2.5
register_global = On

<?php
session_start
();
$_SESSION['id'] = 4;
$id = 7;
print
$_SESSION['id']; // 7
?>

Kết quả in ra là 7

Nếu register_global Off thì không bị

Tra loi

nhuynhduc 2008-11-08 08:56:57

TG sử dụng php5 còn mấy bro kia xài php4 nên khác nhau ở chỗ tạo session đó.
không phụ thuộc vào  register_global đâu

Tra loi

Thương Tín 2008-11-08 09:36:51

Tui cũng mới bị như anh TG, chứ thắc mắc tại sao khi UPDATE dữ liệu nó vẫn là cái cũ. hơ!

Tra loi

he`he` 2008-11-21 09:22:56


Tui dùng WinXP SP2,Apache/2.2.8 (Win32) PHP/5.2.6!
Khi register_global = On
<?php
session_start
();
$_SESSION['id'] = 4;
$id = 7;
print
$_SESSION['id']; //Kết quả là 7
?>
Khi register_global = On
<?php
session_start
();
$_SESSION['id'] = 4;
$id = 7;
print
$_SESSION['id']; //Kết quả là 4
?>
Chú ý Khi chỉnh sửa register_global ="value" trong php.ini bạn phải Restart lai Apache Server mới thực hiện đúng(Có thể mọi người mắc cái này)^_^ ^_^

Tra loi

he`he` 2008-11-21 09:25:34


SORRY có chỗ nhầm!
Tui dùng WinXP SP2,Apache/2.2.8 (Win32) PHP/5.2.6!
Khi register_global = On
<?php
session_start
();
$_SESSION['id'] = 4;
$id = 7;
print
$_SESSION['id']; //Kết quả là 7
?>
Khi register_global = Off
<?php
session_start
();
$_SESSION['id'] = 4;
$id = 7;
print
$_SESSION['id']; //Kết quả là 4
?>
Chú ý Khi chỉnh sửa register_global ="value" trong php.ini bạn phải Restart lai Apache Server mới thực hiện đúng (Có thể mọi người mắc cái này) ^_^ ^_^

Tra loi

Đỗ Thanh Tùng 2008-11-24 11:21:52

Tốt nhất là không nên đặt tên biến trùng với tên session, nếu không mai mốt test lỗi không ra rồi chạy lên đây mà cầu cứu nhé !!!

Tra loi

Giusehuy 2009-08-20 04:07:44

Vậy các trang web trên mạng (phpbasic.com, violet.vn, shoptinhoc.com,...) đều sử dụng session để quản lý người dùng đăng nhập vào phải không các bạn?

Tra loi

TG 2009-08-21 11:07:50

Theo kinh nghiệm của TG thì phần lớn là vậy (phpbasic.com), còn những site bạn list ở trên thì TG không biết, vì người khác viết chứ hông phải TG :)

Tra loi

gaulucky92 2009-08-21 11:56:17

trang nào ở chỗ đăng nhập có dấu check "Tự động đăng nhập" hay là "remember me?" là dùng cookie chứ ko phải session.
Session là phiên làm việc lưu trên server, khi đóng trang web là nó tự hủy session. Như phpbasic, dù đã đăng nhập, nhưng nếu tắt web mở lại thì vẫn phải đăng nhập tiếp, do session login đã bị hủy.
Còn cookie là lưu trên máy khách (client), nên dùng cookie thì dù đã đóng web, tắt máy,... đến khi vào lại web vẫn còn nguyên là đã đăng nhập, chỉ mất khi mình bấm THOÁT (log out) để hủy cookie thôi.
VD như gmail.com khi đăng nhập có chọn "tự động đăng nhập"...

Tra loi

kenphan.info 2009-08-21 12:29:55

Session là phiên làm việc lưu trên server, khi đóng trang web là nó tự hủy session. Như phpbasic, dù đã đăng nhập, nhưng nếu tắt web mở lại thì vẫn phải đăng nhập tiếp, do session login đã bị hủy.
sao FF ko hủy :-? hehe

Tra loi

gaulucky92 2009-08-21 12:59:41

vì ff nó mở web dạng tab (cả ie7+, opera,.. cũng thế), dù đã đóng tab thì trình duyệt vẫn còn mở => chưa ngắt kết nối với server => vẫn còn session

a thử tắt hết trang web, rồi tắt ff luôn... sau đó mở lại ff vào phpbasic xem ;))

Tra loi

kenphan.info 2009-08-21 01:05:32

a thử tắt hết trang web, rồi tắt ff luôn... sau đó mở lại ff vào phpbasic xem
em thử chưa ?

Tra loi

123456 2009-08-26 10:58:00

- Theo mình, $a không thể thay đổi giá trị trong $_SESSION['a']. vì đây là 2 giá trị hoàn toàn khác nhau. $a là biến; $_SESSION['a'] là 1 Session a ...
- Mình đã test cái vd của TG, kết quả là giá trị $_SESSION['a'] không đổi.

Tra loi

Y kien