PDA

View Full Version : تاریخ انقضا برای کاربران



sims_r_z
سه شنبه 23 خرداد 1391, 11:46 صبح
سلام
میخوام کاربران بعد از ثبت نام کردن بعداز مثلا یه ماه اکانتشون تموم بشه لطفا با یه مثال توضیح بدبد
قبلا تایپک برای این موضوع زدم ولی جواب درستی نگرفتم دوستان گفتن که از تابع timer () استفاده کنم ولی این فقط ساعت در میاره وبعضی گفتن از تابع data() استفاده کنم اگه میشه بایه مثال برام توضیح بدبد چون هر کاری کردم درست نشد باتشکر

Unique
سه شنبه 23 خرداد 1391, 12:16 عصر
دوست عزیز این کار خیلی راحته ! کافیه زمانی که دارین شخص را ثبت نام میکنید یک فیلد در Database داشته باشین که زمان ثبت نام را در اون نگه دارین و با هر بار لاگین کردن شخص چک کنین که فاصله زمان لاگین فعلی با زمان ثبت نامش بیشتر از 30 روز نشده باشه.

مثلا اگه این query شما باشه اگه مقداری برگردونه یعنی اینکه 30 روز اشتراک شخص تموم شده :


select fld_signupdate from users where fld_username = 'username' And TIMESTAMPDIFF(DAY,fld_signupdate,NOW()) > 30

در این مثال fld_signupdate زمان ثبت نام هستش که ما با تابع ()NOW مقایسش میکنیم و اگه 30 روز بیشتر بود و query ما مقدار برگدوند مانع از ورودش میشیم.

MMSHFE
سه شنبه 23 خرداد 1391, 12:16 عصر
دوست عزیز تابع time ثانیه جاری رو به شما اعلام میکنه و میتونید اون رو به هر قالبی که بخواین در بیارین. مثال:


date_default_timezone_set('Asia/Tehran');
$now = time();
echo date('Y/m/d H:i:s');

حالا فرض کنید زمانی که کاربر ثبت نام میکنه، با استفاده از همین تابع time زمان اون موقع رو برحسب ثانیه توی فیلد regtime جدول users توی دیتابیس ذخیره کردین. ضمناً یک فیلد هم به نام expired از نوع boolean توی دیتابیس دارین که بطور پیشفرض موقع ثبت نام مقدار 0 توش میگذارین. حالا کافیه هرموقع سایتتون باز میشه کد زیر رو اجرا کنید:


date_default_timezone_set('Asia/Tehran');
$last_month = time() - 2592000;
@mysql_connect('localhost', 'root', '') or die('Connection error');
@mysql_select_db('dbname') or die('Database error');
mysql_query("UPDATE `users` SET `expired`='1' WHERE (`regtime`<'{$last_month}')");

اینطوری همه کاربرانی که قبل از 1 ماه قبل (نسبت به زمان جاری) ثبت نام کردن، منقضی میشن.
موفق باشید.

djsaeedkhan
سه شنبه 23 خرداد 1391, 12:20 عصر
کدنویسیسش کاری نداره فقط باید نحوه پیاده سازی روبلد باشید
به نظر من شما یه فیلد تو دیتابیس بذار و زمانی که می خوای بعد از اون کار نکنه بهش بده. مثلا بذار یک ماه دیگه یا اینکه تاریخی که می خوای ازون به بعد کار نکنه رو بزار
بعد زمانی که طرف می خواد لوگین کنه زمان فعلی رو با اون زمان مقایسه کن و بعد اگر گذشته بود کاربر رو نذار وارد بشه
همچنین
می تونه یه تابعی رو در زمان خاص اجرا کنه و همه یوزر ها رو چک کنه و تمام

sims_r_z
سه شنبه 23 خرداد 1391, 12:23 عصر
اگه میشه یکم بیشتر در مورد خط بالا توضیح بدید (مبتدی) ممنون میشم

sims_r_z
سه شنبه 23 خرداد 1391, 12:28 عصر
من وقع ثبت نام از تابع date بصورت date("Y-m-d") استفاده میکنم یعنی میشه برای این تا بع هم کد نوشت

sims_r_z
سه شنبه 23 خرداد 1391, 12:34 عصر
حالا اگه بخوام برای ماهی متوالی مثلا 3 ماهه 5 ماهه یا هر چند ماه با ید یه ماشین حساب بردارم ثانیه بشمارم !
یعنی تابعی نیست که اینکارو برام بکنه

djsaeedkhan
سه شنبه 23 خرداد 1391, 12:50 عصر
بابا نیاز نیس شما تاریحخ خاصی بدی
اگر می خوای هفته دیگه باشه امروز رو +7 کنی میشه هفته آینده
بعد کلی تابع هست برای مقایسه تاریخ
می تونی مقایسه کنی که در جوابش - یا صفر یا + میده. یعنی گذشته یا رسیده یا نگذشته

MMSHFE
سه شنبه 23 خرداد 1391, 13:19 عصر
حالا اگه بخوام برای ماهی متوالی مثلا 3 ماهه 5 ماهه یا هر چند ماه با ید یه ماشین حساب بردارم ثانیه بشمارم !
یعنی تابعی نیست که اینکارو برام بکنه
دوست عزیز اگه حوصله حساب کردن و چند تا ضرب ساده رو ندارین بهتره کلاً برنامه نویسی رو بگذارین کنار! ضمناً این کار هم راه حل ساده ای داره. کافیه عدد موردنظر رو برحسب روز بگیرین و در 86400 ضرب کنید. مثال:

$last_3_months = time() - 30 * 24 * 60 * 60;
توضیح: 30 روز ضربدر 24 ساعت ضربدر 60 دقیقه ضربدر 60 ثانیه
موفق باشید.
-----
پی نوشت: عذر میخوام اینطوری میگم، کلاً دوست ندارم اینجوری صحبت کنم و قصد توهین هم ندارم ولی واقعاً بعضیها انگار نه انگار که میخوان برنامه بنویسن. انتظار دارن حالا که کارها کامپیوتری شده، چاییشون رو هم کامپیوتر براشون بریزه!

sims_r_z
سه شنبه 23 خرداد 1391, 13:51 عصر
اینکار برای همه کار برا اعمال میشه من میخوام برای کاربرای مختلف زمانهای گوناگونی داشته باشم مثلا برای یک یه ماه وبرای دیگری چند ماه
من دو مقدار تو اسکیول دارم یه یکی برای ثبت تاریخ ثبت نام کاربره ودیگری تاریخ انقضا میخوام با ثبت نام کاربر بشه تاریخ انقضا شو تو فیلد مبروته محاسبه وثبت کرد وپس از ثبت بشه دو تاریخ باهم مقایسه کرد
--------------------------------------
بهم بر نخورد ولی این تابع زیاد برام کارامد نمی آد گفتم شاید تابع کارامدتر وبهتری باشه
اگه نمیدونی بدون کامپیوتر چایی هم میریزه!تا چند سال آینده شاید عمل قلب هم بکنه !!!

MMSHFE
سه شنبه 23 خرداد 1391, 13:57 عصر
خوب دوست عزیز میتونید تعداد روزهای اعتبار هر کاربر رو هم برحسب روز توی دیتابیس (مثلاً توی فیلد credit_days) ذخیره کنید و اینطوری کار کنید:


<?php
date_default_timezone_set('Asia/Tehran');
$now = time();
@mysql_connect('localhost', 'root', '') or die('Connection error');
@mysql_select_db('dbname') or die('Database error');
mysql_query("UPDATE `users` SET `expired`='1' WHERE (`regtime`<({$time}-`credit_days`*24*60*60))");

Unique
سه شنبه 23 خرداد 1391, 15:39 عصر
راستش اصلا نیاز به این همه محاسبات نیست ! وقتی خود MYSQL میتونه همه این مسائل را محسابه کنه !
البته شما مختار هستین هر شکلی که صلاح میدونین استفاده کنی ولی اگه چنین ساختاری توی جدول users داشته باشی :


users
=============
fld_id
fld_username
fld_password
fld_limitdays
fld_signupdate

میتونی زمانی که میخوای کاربر لاگین کنه از query زیر استفاده کنی :

select fld_limitdays,TIMESTAMPDIFF(DAY,fld_signupdate,NOW ()) as diff from users where fld_username = '$username' And fld_password='$password'

حالا اگه username و password شخص درست باشه با یک if ساده میتونی چک کنی :

if ($row['diff'] > $row['fld_limitdays']){...

یکی دیگه از راه های جالب دیگه ای که وجود داره اینه که یک فیلد به نام expiredate داشته باشی و زمانی که داری شخص را signup میکنی مقدارش را اینطوری ست کنی :

fld_expiredate = DATE_ADD(NOW(),INTERVAL N DAY)

در اینجا N اون تعداد روزی هست که شما قصد داری بعدش کاربر نتونه لاگین کنه ! توی این روش فقط یک فیلد expire داریم و نیاز به ثبت زمان signup یا فیلدی که برای تشخیص گذشت محدودیت استفاده هست نیست !

========================
عذر میخوام جناب شهرکی ، لازم به این پست نبود چون کد شما کار را انجام میداد و شاید برای یک مبتدی خیلی بهتر باشه ، اما خواستم دوستان متوجه باشند خود MYSQL کلی توابع به درد بخور داره که خیلی ها زیاد چیزی ازش نمیدونند و غیر از سوال کننده خیلی افراد دیگه این پست را میخونند.

myfriends
جمعه 24 آذر 1391, 13:08 عصر
یکی دیگه از راه های جالب دیگه ای که وجود داره اینه که یک فیلد به نام expiredate داشته باشی و زمانی که داری شخص را signup میکنی مقدارش را اینطوری ست کنی :

fld_expiredate = DATE_ADD(NOW(),INTERVAL N DAY)

در اینجا N اون تعداد روزی هست که شما قصد داری بعدش کاربر نتونه لاگین کنه ! توی این روش فقط یک فیلد expire داریم و نیاز به ثبت زمان signup یا فیلدی که برای تشخیص گذشت محدودیت استفاده هست نیست !


با سلام
اگر تاریخ انقضا تو سیستم موجود باشه یعنی از دیتابیس قابل دریافت باشه
و بخوایم زمانی که به این تاریخ رسید فقط یه پیغام بنویسه که اعتبار به پایان رسید است ( از لاگین کاربر جلوگیری نشه )
تابع نمایش پیغام چه جوری میشه ؟

ممنون میشم راهنمایی کنید

siavashsay
جمعه 24 آذر 1391, 13:58 عصر
دوست عزیز این مراحل رو پیگیری کن بهترین راه حال همینه !
شما میتونید از تابع strtotime استفاده کنی ! این تابع یک تاریخ رو به عدد تبدیل میکنه و شما میتونی طبق اون عدد متوجه شی که فلان کاربر چند روز هست که در سیستم شما ثبت نام کرده !
-------- مثال کامل :
شما باید برای هر کاربر تو دیتابیس خودتون 3 فیلد به نامهای ( مثلا ) : register_date | register_date_num | expire درست کی ! در زمان ثبت نام توسط تابع date روز ثبت نام رو مشخص کنی به اینصورت :


register_date=date("Y-m-d");

سپس شما میتونید با این تابعی که نوشتم اون روز رو به یک عدد تبدیل کنی که خیلی راحت بتونی روش جمع و تفریق کنی :


function s2t($date){
$reg_date=strtotime($date);
$reg_date=$reg_date/60;
$reg_date=$reg_date/60;
$reg_date=$reg_date/24;
return round($reg_date);
}


این تابع یک تاریخ رو مثلا مثل : 16-12-2012 میگیره و به صورت یک عدد مثل : 15690 بر میگردونه ! حالا اگه این تاریخ یک روز اضافه شه به عدد هم یک روز اضافه میشه یعنی اگه :
2012-12-17 بشه عدد هم میشه 15691 !
حالا شما باید در اینجا همراه با تاریخ ثبت نام اون عدد رو هم در دیتابیس خودتون ثبت کنید و موقع ثبت نام expire رو برابر با 0 قرار بدید ! و هر بار که کاربر وارد حسابش شد چک کنید و ببینید که اون عدد بیشتر از 30 شده یا نه ! اگر بیشتر از 30 شده بود یعنی 30 روز گذشته و باید expire برابر 1 شود !
نتیجه کلی :


//function
function s2t($date){
$reg_date=strtotime($date);
$reg_date=$reg_date/60;
$reg_date=$reg_date/60;
$reg_date=$reg_date/24;
return round($reg_date);
}

//When Reigstering

$username=$_POST['username'];
$password=$_POST['password'];
$register_date=date("Y-m-d");
$register_date_num=s2t($register_date);
$expire=0;
$sql=mysql_query("INSERT INTO `users` (`username`,`password`,`register_date`,`register_d ate_num`,`expire`) VALUES ('$username','$password','$register_date','$regist er_date_num','$expire')");


// when Login

$today=date("Y-m-d");
$today_num=st2($today);
$sql_chk=mysql_query("SELECT `register_date_num` FROM `users` WHERE `username`='$username'");
$obj_chk=mysql_fetch_object($sql_check);
$reg_date_num=$obj_chk->register_date_num;
$expire_num=$reg_date_num+30;
if($today_num > $expire_num){
mysql_query("UPDATE `users` SET `expire`='1' WHERE `username`='$username'");
}



توضیحات :
-- در قسمت اول برنامه تابع تعریف شده که باید ازون استفاده کنید در طول برنامه !
-- در قسمت When Registering شما در موقع ثبت نام متغیر های کاربری - روز ثبت نام - تبدیل روز ثبت نام به عدد و مقدار expire رو تنظیم کرده و در دیتابیس خود میریزید !
-- در قسمت When Login شما در موقع لاگین کردن کاربر تاریخ امروز رو گرفته و اون رو به عدد تبدیل میکنید - سپس عدد روز ثبت نام کاربر رو از دیتابیس گرفته و +30 میکنید - سپس عدد تاریخ امروز رو با عدد روز ثبت نام +30 مقایسه میکنید که اگر عدد امروز بزرگتر از اون بود معلوم شه که امروز یک ماه از تاریخ ثبت نام کاربر گذشته و مقدار Expire رو با 1 قرار میدید ( در Sql آخر برنامه )

حالا شما موقعی که کاربر وارد سیستم میشه میتونی مقدار expire رو چک کنی که ببینی 1 هست یا 0 ! اگر برابر با 0 بود که هیچ ! اما اگر برابر با 1 بود یک پیغام میتونی براش تنظیم کنی !
مثال :


// Check Expire

$sql_xp=mysql_query("SELECT `expire` FROM `users` WHERE `username`='$username'");
$obj_xp=mysql_fetch_object($sql_xp);
$xp=$obj_xp->expire;
if($xp==1){
echo "Your account was created 30 days ago";
}




امیدوارم مفید واقع شه :)

myfriends
جمعه 24 آذر 1391, 14:34 عصر
بسیار ممنون
توضیحاتتون مفید واقع شد

ما الان تاریخ expire داریم ، با فورمت Y-M-D
تاریخ امروز سیستم رو میخوام با Expire date مقایسه کنم و یه پیغام بنویسم مثلاً :


if($تاریخ امروز > $expire date){
die('Your account expired!');
}

البته جزئیاتشو نمیدونم
میخوام که از register date استفاده نکنیم . چون با تمدید اکانت مدتش تغییر میکنه و دیگه اون کاربرد رو نداره
یا با استفاده از مدت اعتبار کاربر بر حسب ثانیه بیایم زمان منقضی شدنش رو مقایسه کنیم
به این شکل امکانپذیر هست ؟

siavashsay
جمعه 24 آذر 1391, 15:06 عصر
اگر سیستم شما طوری هست که اکانت قابلیت تمدید داره میتونید بجای register_date از active_date استفاده کنید تا هر موقع که کاربر اکانتش رو تمدید کرد active_date مجدد UPDATE شه و تاریخ روز تمدید شده رو وی خودش بروز کنه !
اینطوری خیلی راحت تر هستید !
البته اگر یکم توضیح بیشتر بدید میشه بهتر راهنماییتون کرد !:)

siavashsay
جمعه 24 آذر 1391, 15:12 عصر
ضمنا توجه کنید که تاریخ Expire Date همون تاریخ register Date یا Active Date هست +30 ! یعنی شما حتما باید Register Date و یا Active Date رو داشته باشید و در دیتابیس ذخیره کنید و هر موقع که کاربر تمدید کرد حسابش رو مجدد تاریخ Active Date یا Register Date رو بروز و Update کنید !
فرمول Expire Date :


$expire_date = $register_date + 30;

myfriends
جمعه 24 آذر 1391, 15:16 عصر
بله ، متوجه شدم
یه پیغام هم براتون ارسال کردم

باسپاس

jaafar1363
سه شنبه 19 دی 1391, 02:53 صبح
دوست عزیز تابع time ثانیه جاری رو به شما اعلام میکنه و میتونید اون رو به هر قالبی که بخواین در بیارین. مثال:


date_default_timezone_set('Asia/Tehran');
$now = time();
echo date('Y/m/d H:i:s');

حالا فرض کنید زمانی که کاربر ثبت نام میکنه، با استفاده از همین تابع time زمان اون موقع رو برحسب ثانیه توی فیلد regtime جدول users توی دیتابیس ذخیره کردین. ضمناً یک فیلد هم به نام expired از نوع boolean توی دیتابیس دارین که بطور پیشفرض موقع ثبت نام مقدار 0 توش میگذارین. حالا کافیه هرموقع سایتتون باز میشه کد زیر رو اجرا کنید:


date_default_timezone_set('Asia/Tehran');
$last_month = time() - 2592000;
@mysql_connect('localhost', 'root', '') or die('Connection error');
@mysql_select_db('dbname') or die('Database error');
mysql_query("UPDATE `users` SET `expired`='1' WHERE (`regtime`<'{$last_month}')");

اینطوری همه کاربرانی که قبل از 1 ماه قبل (نسبت به زمان جاری) ثبت نام کردن، منقضی میشن.
موفق باشید.

ببخشین استاد.الان کار متغیر $now اینجا چیه؟
من این کد رو تو برنامم گذاشتم.ولی هربار expired مقدار 1 میگیره.پس کی صفره؟
مرسی

MMSHFE
سه شنبه 19 دی 1391, 19:48 عصر
دوست گرامی، شما باید now$ رو موقع درج یک رکورد، توی فیلد regtime ذخیره کنید. بعد وقتی کد پایین اجرا میشه، رکوردهای قدیمیتر از یکماه رو تغییر میده و expired اونها 1 میشه.