PHP

چگونه : با تاریخ در PHP و MySQL کار کنیم ؟

تبلیغات
4 سوالی شهرداری
کانال تلگرام فتولیا

سلام دوستان :)

برای برنامه نویسان php معمولا سوال است که به چه صورتی می توان تاریخ و زمان را در دیتابیس ذخیره و بازیابی کرد .برای آن سه راه حل وجود دارد ولی ابتدا مشکل :

php در تمام توابع زمانی خود از unix timestamp استفاده می کند.این توابع می توانند timestamp ها را به اشکال زیباتری که شما می خواهید نیز نمایش دهند ولی به صورت داخلی از خود timestamp استفاده می کنند.منظور از timestamp یک سری اعداد ساده به صورت integer است .در یک توضیح جزئی تر ، این اعداد تعداد ثانیه هایی هستند که از نیمه شب ۱ ژوئن ۱۹۷۰ تا به این لحظه گذشته است (مبدا گرینویچ) .

mysql نیز از سه نوع تاریخ پشتیبانی می کند.یعنی DATETIME, DATE, و TIMESTAMP.نوع DATETIME تاریخ و زمان را در قالب یه رشته متنی به صورت  YYYY-MM-DD HH:MM:SS ذخیره می کند (مانند: ۲۰۰۶-۱۲-۲۵ ۱۳:۴۳:۱۵) .نوع DATE فقط شامل بخش تاریخ نوع قبلی است – YYYY-MM-DD (مانند: ۲۰۰۶-۱۲-۲۵) .نوع TIMESTAMP نیز بر خلاف اسمش اصلا ربطی به unix timestamp ای که در php استفاده می شود ندارد.نوع TIMESTAMP در اینجا دقیقا مثل DATETIME عمل می کند با این تفاوت که هر موقع محتویات رکورد تغییر یابند خود به خود زمان را بروز می کند(این توضیح مختصر و نسبتا درستی است ولی جزئیات زیاد مهم نیستند).اما از MySQL 4.1 نوع TIMESTAMP دقیقا شبیه DATETIME شده است.

پس مشکل این است که چگونه با این انواع تاریخ در کنار هم استفاده کنیم.timestamp ها در php از نوع integer و در mysql نیز DATETIME از نوع رشته ای هستند .سه راه حل برای این مشکل وجود دارد :

۱٫یک راه حل عمومی این است که تاریخ را به صورت DATETIME ذخیره کنیم یعنی با استفاده از توابع ()date و ()strtotime آن را به صورت قابل قبول در mysql در آوریم.به این صورت :

۲٫راه حل دوم این است که به MySQL اجازه دهیم کار خودش را انجام دهد.MySQL توابعی دارد که می توانیم در مواقع نیاز از انها برای تبدیل تاریخ استفاده کنیم.تابع UNIX_TIMESTAMP از DATETIME در MySQL به timestamp در PHP تبدیل می کند و تابع  FROM_UNIXTIME بر عکس یعنی timestamp در php را به DATETIME تبدیل می کند.از این توابع می توان در داخل query به صورت زیر استفاده کرد:

۳٫و سومین و آخرین راه این است که به صورت ساده همه جا از همان timestamp خود php استفاده کنیم یعنی چون این نوع تاریخ و زمان یک integer ساده است می توانیم به راحتی آن را در داخل یک فیلد int ذخیره کنیم.خوبی اسن روش سادگی آن است و دیگر نیازی به تبدیل به یکدیگر نیست وفقط با یک مقدار چند رقمی عدد کار می کنیم.

اما توجه کنید که اگر زمان را به صورت یک عدد ساده در mysql ذخیره کنیم خودمان را از کارایی mysql برای کار با تاریخ و زمان محروم کرده ایم ، زیرا mysql نمی داند که این ارقام ما تاریخ هستند نه شماره شناسنامه یا تلفن !

با این حال اگر از دیتابیس فقط برای ذخیره داده ها استفاده می کنید و تمام عملیات ها را در php انجام می دهید ، این گزینه می تواند کارامد باشد.

در انتها ببینیم کدام یک برای استفاده ما بهتر است .اگر شما نیازی به دستکاری تاریخ ها در خود mysql ندارید ، گزینه آخری می تواند بهترین راه باشد.چون هم ساده است ، هم فضای کمتری از دیتابیس را اشغال می کند و هم سرعت خواندن و نوشتن داده ها در این روش زیاد است.

اما گاهی اوقات ، اگر نوع تاریخ به صورت DATETIME نباشد مسئله بسیار پیچیده می شود (مثلا اگر بخواهید افرادی را بیابید که امروز تولدشان است) در این صورت بهتر است از روش های ۱ و ۲ استفاده کنید.

امیدوارم به دردتون خورده باشه .موفقیت

منبع

13 Comments

  1. سلام
    من میخوام تاریخ رو با استفاده از date picker از کاربر بگیرم و در دیتابیس ذخیره کنم اما اول باید به میلادی تبدیلش کنم ولی نمیدونم چطوری
    میشه کمکم کنید؟

    1. سلام

      اگر از ورودی تاریخ html5 استفاده کنید فکر نمی کنم نیازی باشه تبدیل کنید چون خودش میلادی هست . فقط در دیتابیس نوع فیلدی که قراره تاریخ توش ذخیره بشه رو date بزارید

  2. فرض کنیم که اطلاعات با با روش استاندارد و بصورت یونیکس وارد دیتابیس کردیم اگه بخوام به بانک اطلاعاتی دستور بدیم که جداولی که تاریخشون بین
    ۱/۱/۱۳۹۱
    و
    ۵/۳/۱۳۹۱
    هست رو نشون بده باید چیکار کنیم

  3. سلام راستش یه خرده گیج شدم من یه جدول تو پایگاه داده دارم برای قیمت لحظه ای اجناس حالا باید چطور از تاریخ استفاده کنم برای وارد کردن تاریخ بوسیله QUERYواستفاده از آن

  4. مرسی. عال بود. من با آخری موافقم. من همیشه از حالت آخری استفاده میکنم و توابع کار روی تاریخ رو میزارم به عهده php چون اغلب هم با تاریخ شمسی کار دارم مجبورم به صورت تاریخ شمسی ذخیره کنم در دیتابیس و مثل عدد و رشته معمولی باهاش برخورد کنم :)

    1. سلام امیرجان

      ممنون ، این راهیه دیگه ولی اگه به صورت استانداردتر ذخیره بشه بعدها دست آدم باز تره .می تونه از همون تاریخ میلادی استفاده کنه ، با اون تاریخ تعامل کنه یا به هر چیز دیگه ای مثل شمسی یا قمری تبدیلش کنه و … .

  5. هر چی که می گذره بیشتر خوشحالم که به php رو نیاوردم اگه وقت شد کمی از هزاران تابعی که دات نت برای زمان ارائه کرده حتما می نویسم و یه کلاسی هم دارم که تاریخ شمسی رو به هر حالتی که بخواین تحویل می ده خیلی جالبه حتما می زارم دوستان لذتشو ببرن

    1. سلام محمد جان
      خوب خوشحال میشیم اگه کمی در مورد کار با تاریخ در net. توضیح بدین .با این حال کار کردن با تاریخ در php مشکل خاصی نداره و این رو سایت های بزرگی که باهاش نوشته شدن اثبات می کنه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

آخرین مقالات فتولیا در ایمیل شما

در خبرنامه ما عضو شوید و آخرین مطالب و مقالات آموزشی را اول شما دریافت کنید