PDA

View Full Version : سوال: بررسی درست بودن روش استفاده از تاریخ شمسی در php و sql



soheilyou
جمعه 21 فروردین 1394, 12:38 عصر
من یه سوال داشتم در مورد تاریخ شمسی در php ! ینی بهتره بگم میخوام مطمئن بشم !
من تا حالا هر بار قرار بود با تاریخ شمسی کار کنم از http://jdf.scr.ir/ برای به دست آوردن تاریخ شمسی استفاده می کردم ! ینی فایل jdf.php رو در فایل اصلیم به این صورت به کار میبردم :


//----------------------Tarikh shamsi --------------------------------$timezone = 0;//براي 3:30 عدد 12600 و براي 4:30 عدد 16200 را تنظيم کنيد$now = date("Y-m-d", time()+$timezone);
$time = date("H:i:s", time()+$timezone);
list($year, $month, $day) = explode('-', $now);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
include ('jdf.php');
$today_jalali_date = jdate("Y/m/d",$timestamp);
//----------------------Tarikh shamsi --------------------------------در این کد خام تاریخ الزاما به صورت 10 کرکتری برگردونده نمیشد مثلا 1394/2/4 رو بر میگردوند !
برای همین من یه تابع نوشتم که هر تاریخی بهش داده بشه به صورت استاندارد 10 کرکتری تصحیح میکنه و بر میگردونه ! مثلا تاریخ گفته شده رو به 1394/02/04 تبدیل میکنه به این صورت :


/*--------------------------------------\ تابع استاندارد کننده فرمت تاریخ سهیل ----------------------------------------*/ function true_cal($full_date) //Tashih Formate Tarikh be 10 charecter { $date_array= explode("/",$full_date); $year = $date_array[0] ; $mounth = $date_array[1] ; $day = $date_array[2] ;
if( $mounth < 10 ) { if(strlen($mounth) <2 ) { $mounth = '0'.$mounth ; } } if( $day < 10 ) { if(strlen($day) <2 ) { $day = '0'.$day ; } } return $year.'/'.$mounth.'/'.$day; }

و به این ترتیب تاریخ امروز رو میتونستم به صورت شمسی و 10 کرتری داشته باشم و با این فرمت 1394/02/04 در دیتابیس در فیلد تاریخ که به صورت varchar ثبت شده ، ذخیره کنم !


حالا از این این کوئری رو استفاده میکنم :



$taghliz_obj_not = $db -> prepare("select * from `osare_taghliz` WHERE ( first_confirm_for_lab_test <= '$real_today' AND finished ='mojoud' AND first_seen='wating' ) OR ( second_check_date <= '$real_today' AND finished ='mojoud' AND second_seen='wating' ) ORDER BY id DESC ");
$taghliz_obj_not -> execute();

که توش $real_today تاریخ 10 کرکتری امروز هستش (مثلا 1394/01/20)
و first_confirm_for_lab_test هم یکی از فیلد های دیتابیس هستش که به صورت varchar هست و درش تاریخ 10 کرکتری ثبت و ساختار second_check_date هم همینطوره !
منظور از عبارت : first_confirm_for_lab_test <= '$real_today اینه که اگر تاریخ امروز ، مساوی ، یا بزرگتر از تاریخ ثبت شده در فیلد first_confirm_for_lab_test هست !
تکرار میکنم که داخل دیتا بیس در first_confirm_for_lab_test تاریخی مثلا به این شکل : 1394/03/05 ثبت شده !


حالا این کوئری تا کنون بدون مشکلی کار کرده و و کاملا درست تشخیص میده که آیا از تاریخ خاصی رد شدم یا نه ، هنوز به آن تاریخ نرسیدم !
ولی من نمیدونم این روشی که اسفاده کردم اصولی هست یا نه ، آیا قابل اطمینان هست یا نه ؟
چون مثلا میخوام این روش رو برای دادن هشدار به رسیدن تاریخ چک ها استفاده کنم و اگر حتی یکبار اشتبه کنه ضرر و زیانش زیاده !
و لطفا اگر این روش درست نیست ، یه روش کامل و درست رو بهم پیشنهاد کنید !
ممنون از کمکتون

MMSHFE
جمعه 21 فروردین 1394, 12:56 عصر
چه دردسری تحمل میکردین. اینجا رو ببینید:

require_once 'jdf.php';
// date_default_timezone_set('Asia/Tehran');
$today_jalali_date = jdate('Y/m/d');
برای اینکه مقایسه تاریخ توی دیتابیس براتون راحت باشه، فقط Timestamp جاری یعنی خروجی تابع ()time رو توی یک فیلد عددی برای تاریخ ذخیره کنید. اینطوری هروقت میخواین نمایش بدین، کافیه با jdate و با همون سوئیچهای date خود PHP تبدیل به فرمت موردنظر کنید. اگه خواستین مقایسه کنید هم میتونید این شکلی کار کنید:

$taghliz_obj_not = $db->prepare("SELECT * FROM `osare_taghliz` WHERE (`first_confirm_for_lab_test`<=:today AND `finished`='mojoud' AND `first_seen`='wating') OR (`second_check_date`<=:today AND `finished`='mojoud' AND `second_seen`='wating') ORDER BY id DESC");
$taghliz_obj_not->bindParam(':today', time());
$taghliz_obj_not->execute();

soheilyou
جمعه 21 فروردین 1394, 15:28 عصر
چه دردسری تحمل میکردین. اینجا رو ببینید:

require_once 'jdf.php';
// date_default_timezone_set('Asia/Tehran');
$today_jalali_date = jdate('Y/m/d');
برای اینکه مقایسه تاریخ توی دیتابیس براتون راحت باشه، فقط Timestamp جاری یعنی خروجی تابع ()time رو توی یک فیلد عددی برای تاریخ ذخیره کنید. اینطوری هروقت میخواین نمایش بدین، کافیه با jdate و با همون سوئیچهای date خود PHP تبدیل به فرمت موردنظر کنید. اگه خواستین مقایسه کنید هم میتونید این شکلی کار کنید:

$taghliz_obj_not = $db->prepare("SELECT * FROM `osare_taghliz` WHERE (`first_confirm_for_lab_test`<=:today AND `finished`='mojoud' AND `first_seen`='wating') OR (`second_check_date`<=:today AND `finished`='mojoud' AND `second_seen`='wating') ORDER BY id DESC");
$taghliz_obj_not->bindParam(':today', time());
$taghliz_obj_not->execute();


ممنون از راهنماییتون ، فقط دو سوال:
چطور میتونم یه تاریخ شمسی که کاربر وارد میکنه رو به timestamp تبدیل کنم تا در دیتابیس ذخیره کنم ؟ منظورم اینه مثلا کاربر خودش تایین کنه که در چه تاریخی باید هشدار بهش داده بشه !

در ضمن من میخوام تاریخی شمسی ای که استفاده میکنم مستقل از تاریخ سیستم(سایت رو روی iis روی لوکال دارم اسفاده میکنم) باشه ! یعنی الان اگر تاریخ سیستم اشتباه باشه تابع time() هم تاریخ اشتباه رو بر میگردونه ! برای این مشکل پیشنهادی دارید ؟ البته بعید میدونم این خواسته بدون اتصال به اینترنت شدنی باشه ولی اگر باشه مسلما خیلی بهتره

MMSHFE
شنبه 22 فروردین 1394, 00:52 صبح
1- فرض کنید کاربر این مقدار رو وارد کرده: 1392/5/2 و حالا شما میخواین تبدیل به timestamp کنید:

list($y, $m, $d) = explode('/', $_POST['date']);
$ts = jmktime(0, 0, 0, $m, $d, $y);

2- الان چون روی لوکال هاست دارین کار میکنین، وابسته به سیستم شماست چون سرور و کلاینت، هر دو یک کامپیوتر هستن ولی وقتی روی هاست واقعی بردین، از روی سرور خونده میشه و به ساعت سیستم کاربر کاری نداره.

soheilyou
سه شنبه 25 فروردین 1394, 19:39 عصر
ممنونم ، تابع رو میخواستم که معرفی کردید !

در مورد زمان ، من میهخوام پروژه ی نهایی رو رو IIS ویندوز نصب کنم روی یکی از سیستم های شرکت مشتری و اونو به عناون سرور استفاده کنم ، در این حالت اگر زمان و تاریخ اون سیستم تغییر کنه مشکل پیش میاد ! حالا نمیدوم راه دیگه ای برای تغییر نکردن و ثثبت در ست تاریخ وجود داره یا نه ؟

MMSHFE
چهارشنبه 26 فروردین 1394, 08:23 صبح
میتونید از سایتهایی مثل time.ir و... زمان رو با CURL بخونید. البته معمولاً سیستمی که بعنوان سرور استفاده میشه رو دست هر کسی نمیدن که بتونه ساعت سیستم رو عوض کنه. بجای اینکه دنبال راههای جایگزین باشین، جلوی خرابکارهایی که میخوان ساعت سیستم سرور رو دستکاری کنن رو بگیرین. سرور یک سیستم عادی نیست که دست هر کسی باشه. فقط مدیر سرور بهش دسترسی داره و اونهم اینقدر باید حالیش باشه که زمان رو دستکاری نکنه.