09/10/2018, 23:43

Cao thủ PHP giúp mình đoạn code này tý

Mình có đoạn code thế này:
else {
$r = $mysql->fetch_array($q);
$_SESSION['user_id'] = $r['user_id'];
$salt = 'Nothing';
$identifier = md5($salt.IP.$r['user_id'].$salt);
$level = $r['user_level'];
$timeout = NOW + 2*60*60;
m_setcookie('USER', $identifier);
$mysql->query("DELETE FROM ".$tb_prefix."online WHERE sid = '".SID."'");
$mysql->query("INSERT INTO ".$tb_prefix."onlinetoday (timestamp, sid, ip, username,user_id,user_level,user_online) VALUES ('".NOW."', '".SID."', '".IP."','".$name."','".$r['user_id']."','".$level."','1')");
$mysql->query("UPDATE ".$tb_prefix."users SET user_online = 1,online_trongngay = 1, user_ip = '".IP."', user_identifier = '".$identifier."', user_timeout = '".$timeout."' WHERE user_id = '".$r['user_id']."'");
}
exit();
}
Bạn để ý dòng in đậm nhé, chắc bạn biết nó làm gì rồi đúng không?
Code hoàn toàn bình thường, và chạy ngon nhưng có 1 vấn đề là nó insert tất, ví dụ có thành viên abc online sau đó thoát ra rồi sau đó login thì nó lại ghi tiép vào dữ liệu 1 row giống hệt trước đó nó đã ghi. Cách khắc phục sẽ là để nó check trong table onlinetoday nếu có thành viên đó rồi thì nó chỉ update IP và timestamp thôi, còn nếu chưa có thành viên đó thì nó mới ghi vào như code hiện đang làm.
Mình đã thử nhưng không biết code lệnh hoàn toàn cho hợp với đoạn code trên, mình mới tập tọe php mà. Ai giúp với. Cảm ơn bạn nhiều
amida viết 01:55 ngày 10/10/2018
Cho thêm 1 field userlist nữa để ghi nhận user nào đã vào rồi.
Lúc kiểm tra thì fetch mỗi field đó ra rồi check thôi. Hết ngày thì empty nó lại
temp2 viết 01:58 ngày 10/10/2018
mới tập tọe mà quất nguyên cái source người ta ra ngâm cứu, cũng ghê nhỉ
$mysql->query("DELETE FROM ".$tb_prefix."onlinetoday WHERE sid = '".SID."'");
huyhoa viết 01:59 ngày 10/10/2018
Quote Được gửi bởi temp2 View Post
mới tập tọe mà quất nguyên cái source người ta ra ngâm cứu, cũng ghê nhỉ
cái gì mà không chơi được, tớ vốn thích tìm tòi.
Tập tọe không có nghĩa là không được fang những gì mình thích, đừng nói giọng mỉa mai thế chứ
Tớ sửa thế này, mà nó vẫn không được. Thêm hàm if, nếu tìm trong list danh sách đã đăng nhập có user đó thì update , dòng thêm được in đậm
else {
$r = $mysql->fetch_array($q);
$_SESSION['user_id'] = $r['user_id'];
$salt = 'Nothing';
$identifier = md5($salt.IP.$r['user_id'].$salt);
$level = $r['user_level'];
$timeout = NOW + 2*60*60;
m_setcookie('USER', $identifier);
$mysql->query("DELETE FROM ".$tb_prefix."online WHERE sid = '".SID."'");
//
if ($mysql->num_rows($mysql->query("SELECT user_id FROM ".$tb_prefix."onlinetoday WHERE username = '".$name."'")))
$mysql->query("UPDATE ".$tb_prefix."onlinetoday SET user_online = 1, user_ip = '".IP."' WHERE username = '".$name."'");

$mysql->query("INSERT INTO ".$tb_prefix."onlinetoday (timestamp, sid, ip, username,user_id,user_level,user_online) VALUES ('".NOW."', '".SID."', '".IP."','".$name."','".$r['user_id']."','".$level."','1')");
$mysql->query("UPDATE ".$tb_prefix."users SET user_online = 1,online_trongngay = 1, user_ip = '".IP."', user_identifier = '".$identifier."', user_timeout = '".$timeout."' WHERE user_id = '".$r['user_id']."'");
}
exit();
}

@ amida, không cần thêm vì trong table onlinetoday tớ đã có đủ username, user_id và level cho nó rồi mà, giờ tớ chỉ cần giúp về cái query trong table đó theo username, nếu username đăng nhập đã có trong table onlinetoday thì nó update, còn nếu chưa có thì insert thôi , nói như bố tướng vậy nhưng gà nên mới phải nhờ mọi người giúp
amida viết 01:59 ngày 10/10/2018
Quote Được gửi bởi huyhoa View Post
@ amida, không cần thêm vì trong table onlinetoday tớ đã có đủ username, user_id và level cho nó rồi mà, giờ tớ chỉ cần giúp về cái query trong table đó theo username, nếu username đăng nhập đã có trong table onlinetoday thì nó update, còn nếu chưa có thì insert thôi , nói như bố tướng vậy nhưng gà nên mới phải nhờ mọi người giúp
Ý tôi là bác dùng 1 field để update username logged in. Vì là update nên nó sẽ đảm bảo field đó luôn có 1 row và thuận tiện cho việc fetch + solve.
Còn cái table onlinetoday của bác, mỗi lần kiểm tra lại user nào đã vào thì chẳng lẽ chạy từ đầu tới cuối chỉ để lấy username ra?
good luck
huyhoa viết 01:45 ngày 10/10/2018
Quote Được gửi bởi amida View Post
Ý tôi là bác dùng 1 field để update username logged in. Vì là update nên nó sẽ đảm bảo field đó luôn có 1 row và thuận tiện cho việc fetch + solve.
Còn cái table onlinetoday của bác, mỗi lần kiểm tra lại user nào đã vào thì chẳng lẽ chạy từ đầu tới cuối chỉ để lấy username ra?
good luck
Hì, thành công rồi, ngồi mò mãi 2o phút ko ra, lúc lên tham khảo ý kiến của các bác lại ra, cái này em làm hoàn thiện nè
else {
$r = $mysql->fetch_array($q);
$_SESSION['user_id'] = $r['user_id'];
$salt = 'Nothing';
$identifier = md5($salt.IP.$r['user_id'].$salt);
$level = $r['user_level'];
$timeout = NOW + 2*60*60;
m_setcookie('USER', $identifier);
$mysql->query("DELETE FROM ".$tb_prefix."online WHERE sid = '".SID."'");
//
if ($mysql->num_rows($mysql->query("SELECT user_id FROM ".$tb_prefix."onlinetoday WHERE username = '".$name."'"))){
$mysql->query("UPDATE ".$tb_prefix."onlinetoday SET user_online = 1, ip = '".IP."' WHERE username = '".$name."'");
$mysql->query("UPDATE ".$tb_prefix."users SET user_online = 1, user_ip = '".IP."', user_identifier = '".$identifier."', user_timeout = '".$timeout."' WHERE username = '".$name."'");
}
else {
$mysql->query("INSERT INTO ".$tb_prefix."onlinetoday (timestamp, sid, ip, username,user_id,user_level,user_online) VALUES ('".NOW."', '".SID."', '".IP."','".$name."','".$r['user_id']."','".$level."','1')");
$mysql->query("UPDATE ".$tb_prefix."users SET user_online = 1,online_trongngay = 1, user_ip = '".IP."', user_identifier = '".$identifier."', user_timeout = '".$timeout."' WHERE user_id = '".$r['user_id']."'");
}
exit();
}
}
Hì hì, cảm ơn các bác nhiều
@amida
Thì ý mình cũng chỉ là lục tung nó lên để tìm xem thằng nào đã login 1 lần trong ngày rồi mà, mình ko cần thêm field như bạn nói vì nó có sẵn mình tạo rồi, giờ chỉ há miệng chờ sung thôi
phamduyvt viết 01:47 ngày 10/10/2018
lằn nhằn quá, ý của đoạn code này là ai login thì add vào data nếu chưa có tên trong data chứ gì?
Trong table chọn 1 khóa chính là user_id chẳng hạn
dùng if( update không thành công )//tức là chưa có user đó trong data
thì insert vào data. Vậy là xong

if(!mysql_query("update.."))
{
mysql_query("insert...");
}
lnt viết 01:58 ngày 10/10/2018
Quote Được gửi bởi phamduyvt View Post
lằn nhằn quá, ý của đoạn code này là ai login thì add vào data nếu chưa có tên trong data chứ gì?
Trong table chọn 1 khóa chính là user_id chẳng hạn
dùng if( update không thành công )//tức là chưa có user đó trong data
thì insert vào data. Vậy là xong

if(!mysql_query("update.."))
{
mysql_query("insert...");
}
Đồng ý. Đơn giản mà hiệu quả.
bka viết 01:44 ngày 10/10/2018
Quote Được gửi bởi huyhoa View Post
Mình có đoạn code thế này:


Bạn để ý dòng in đậm nhé, chắc bạn biết nó làm gì rồi đúng không?
Code hoàn toàn bình thường, và chạy ngon nhưng có 1 vấn đề là nó insert tất, ví dụ có thành viên abc online sau đó thoát ra rồi sau đó login thì nó lại ghi tiép vào dữ liệu 1 row giống hệt trước đó nó đã ghi. Cách khắc phục sẽ là để nó check trong table onlinetoday nếu có thành viên đó rồi thì nó chỉ update IP và timestamp thôi, còn nếu chưa có thành viên đó thì nó mới ghi vào như code hiện đang làm.
Mình đã thử nhưng không biết code lệnh hoàn toàn cho hợp với đoạn code trên, mình mới tập tọe php mà. Ai giúp với. Cảm ơn bạn nhiều
cái này có gì đâu . trước khi insert thì kiểm tra xem thành viên đó đã đăng nhập chưa rồi mới insert.
Bài liên quan
0