PDA

View Full Version : سوال: جستجو در تقویم شمسی



sphs86
دوشنبه 04 اردیبهشت 1391, 17:12 عصر
سلام دوستان
سوالی داشتم
من برای برنامه ای که نوشتم احتیاج به جستجو با یک تقویم شمسی دارم.
توضیح پروژم به این صورته :
برنامه دو بخش داره.یکی کاربری یکی مدیریت
کاربرا بعد از لاگین وارد محیط خودشون می شن، و یک فرم رو ارسال می کنن. تو همین محیط یک قسمت تاریخ رو نشون دمیده ، که این تاریخ همراه فرم به دیتابیس ارسال میشه.
از سمت دیگه ، تو محیط مدیریت، مدیر گزارشای ارسالی رو می خونه. می خوام قابلیتی داشته باشم که بتونه توسط تاریخ شمسی داخل دیتابیس جستجو کنه.
از مراحل کار تقریباً مطلعم. اما با اجرا و کد نویسیش کمی مشکل دارم.
اگه براتون زحمتی نیست واسم یک نمونه کد بزارید تا متوجه شم.

سپاسگزارم...

plague
دوشنبه 04 اردیبهشت 1391, 19:25 عصر
اون تاریخی که توی دیتابیس ثبت شده به چه شکلیه ؟ شمسی یا میلادی ؟ خام 10 رقمی یا فرمت بندی شده ؟

sphs86
دوشنبه 04 اردیبهشت 1391, 22:27 عصر
اون تاریخی که توی دیتابیس ثبت شده به چه شکلیه ؟ شمسی یا میلادی ؟ خام 10 رقمی یا فرمت بندی شده ؟
به این شکل :
1391/2/3
یا می تونه اینطور هم باشه :
3، اردیبهشت 1391

plague
سه شنبه 05 اردیبهشت 1391, 01:15 صبح
اگه میخای یه تاریخ خاص رو از جدول بکشی بیرون و اطلاعاتش رو نشون بدی که سادتس کوئریش میشه


$sql = "select * from `table` where date = '1391/2/3'";

اگه میخای بر اساس بازه زمانی خاصی سرچ کنی
مثلا رکورد هایی 1391/1/1 تا 1391/2/3
که این روش ذخیره کردن اشتباست

شما باید با تابع time تاریخ رو به صورت خام که یه عدد 10 رقمی هست ذخیره کنی
نمیخام بحث رو فنی کنم چون گیج میشید ولی این عدد 10 رقمی هر ثانیه یکی بهش اضافه میشه

شما بعدا که از دیتابیس میخونی این عدد رو میتونی با کلاس هایی خاصی مثل کلاس جلالی که موجوده اون رو تبدیل به تاریخ کنی

حالا وقتی میخای شما یه بازه زمانی رو توی دیتابیس سرچ کنی اول اون دوبازه با ساختار x / x / x رو میشکونی و تبدیلش میکنی به عدد خام 10 رقمی معادل اون تاریخ

اووقت میتونی دیتابیس رو برای رکورد هایی که تاریخشون بین این دو مقداره سرچ کنی

sphs86
سه شنبه 05 اردیبهشت 1391, 12:22 عصر
متاسفانه من نتونستم کاری کنم:
روشای مختلفیو امتحان کردم اما ...
حتی با آرایه تاریخ و جدا کردم یا timestamp یا unix یا ...
اگه امکانش هست یه نمونه کد ضمیمه کنید. 3 روزی میشه درگیرشم

plague
سه شنبه 05 اردیبهشت 1391, 13:54 عصر
برادر شما باید کدت رو بنویسی بزاری اینجا تا بقیه رفع اشکال کنن
الان این چند قسمت مختلف داره یکی ذخیره کردن تو دیتابیس
یکی تبدیل تاریخ جستجو به تاریخ خام
یکی کوئری سرچ

من نمیدونم شما کجاش رو مشکل دارید
بجای شکلک گریه یکم دقیق تر مشکلت رو بگو کد هات رو بزار


اینطوری تبدیل به تاریخ خام میکنی

$date = ' 1391/2/3 ';
list($y , $m , $d ) = explode('/' , $date );
$date = jmaketime( 0 , 0, 0, $m , $d , $y );



البته تابع jmaketime که باهاش تبدیل به تاریخ خام میکنی ماله تابع جلالیه و باید اون رو اینکلود کرده باشی تو پیجت

sphs86
چهارشنبه 06 اردیبهشت 1391, 11:49 صبح
من از کلاس تاریخ جلالی به همراه کد شما به شکل زیر استفاده کردم.

include 'jdatetime.class.php';
$date = new jDateTime(true, true, 'Asia/Tehran');
list($y , $m , $d ) = explode(" " , $date );
$time = $date->mktime(0,0,0,$m,$d,$y);
echo $m;


اما وقت نمایش ارور زیرو میده :
Catchable fatal error: Object of class jDateTime could not be converted to string in C:\wamp\www/...

قسمت echo $m نمونه ست ...ضمنا می خوام بدونم بعد از اینکه قسمتای مختلف تاریخ و ریختم تو آرایه چه طور باید به دیتابیس منتقل کنم...
ممنون از کمک هاتون

MMSHFE
چهارشنبه 06 اردیبهشت 1391, 12:22 عصر
پیشنهاد میکنم از JDF (http://jdf.scr.ir) استفاده کنید.

sphs86
چهارشنبه 06 اردیبهشت 1391, 13:46 عصر
پیشنهاد میکنم از JDF (http://jdf.scr.ir) استفاده کنید.

از JDF استفاده کردم. نمایش تاریخ و explode مشکلی نداشت. الان چطور تو دیتابیس ذخیره کنم که بتونم بعداً جستجو تو بازه زمانی داشته باشم؟!

plague
چهارشنبه 06 اردیبهشت 1391, 15:08 عصر
الان تو این کدی که نوشتی باید متغیر $time رو تو جدول زخیره کنی که یه عدد 10 رقمیه
بعدا هم هروقت خاستی بازه زمانی رو جستجو کنید اون دوتا بازه زمانی رو با همین روش تبدیل میکنی به عدد 10 رقمی
اونوقت از دیتابیس رکورد هایی رو میکشی بیرون که تاریخشون بین این دوتا عدد باشه

sphs86
چهارشنبه 06 اردیبهشت 1391, 15:30 عصر
الان تو این کدی که نوشتی باید متغیر $time رو تو جدول زخیره کنی که یه عدد 10 رقمیه
بعدا هم هروقت خاستی بازه زمانی رو جستجو کنید اون دوتا بازه زمانی رو با همین روش تبدیل میکنی به عدد 10 رقمی
اونوقت از دیتابیس رکورد هایی رو میکشی بیرون که تاریخشون بین این دوتا عدد باشه


ممنون دوست عزیز، تلاشمو می کنم.

sphs86
چهارشنبه 06 اردیبهشت 1391, 21:26 عصر
من با استفاده از JDF کدای زیر رو نوشتم:


$date = time();
include 'jdf.php';
$date = jdate('Y F j');
list($y , $m , $d ) = explode(' ' , $date );
$time = jmktime( 0 , 0, 0, $m , $d , $y );
echo $date;

تو خروجی می تونم تاریخ رو ببینم، explode رو هم تست کردم، مشکلی نداشت.
اما متاسفانه تاریخ تو دیتابیس ذخیره نمیشه.
data type مربوط به ستون تاریخ تو mysql رو روی هرچیزی که میزارم صفر نشون میده.
timestamp یا varchar یا int همه صفرن ...
اگه امکان داره راهنمایی کنید.

MMSHFE
پنج شنبه 07 اردیبهشت 1391, 01:03 صبح
خوب عزیز شما نوع رو همون int بگذارین و این کد رو تست کنید:

$ts = time();
و بعد توی فیلد تاریخ همین ts$ رو ذخیره کنید. حالا کافیه هرموقع خواستین نمایش بدین، با این کد تبدیلش کنید:


require_once 'jdf.php';
$date = jdate('Y F j', $row['ts']);

دقت کنید که توی مثال فوق، ['row['ts$ فیلدی هست که متغیر ts$ رو قبلاً توش ذخیره کردین.
موفق باشید.

plague
پنج شنبه 07 اردیبهشت 1391, 02:31 صبح
همون int باید ذخیره کنی


$date = time();
include 'jdf.php';
$date = jdate('Y F j');
list($y , $m , $d ) = explode(' ' , $date );
$time = jmktime( 0 , 0, 0, $m , $d , $y );
echo $date;

این اکویی که خط آخر انجام دادین اگه بهتون یه عدد 10 رقمی میده
و همین رو توی دیتابیس قرار میدی شما نباید مشکلی پیش بیاد

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

$date = time();
کافیه
اون عملیات وقتیه که شما دوتا تاریخ به صورت فرمت بندی شده
x/x/x
بهتون میدن باید این رو اول تبدیل به تاریخ خام عددی کنید
مثل موقع سرچ کردن

در مواقع معمولی وقتی میخای ثبت کنی توی دیتابیس همین


$date = time();
عدد خام تاریخه رو بهتون میده