تبليغات

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

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

php-mysql-date-time-learn

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 در آوریم.به این صورت :

$mysqldate = date( 'Y-m-d H:i:s', $phpdate );
$phpdate = strtotime( $mysqldate );

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

$query = "UPDATE table SET
    datetimefield = FROM_UNIXTIME($phpdate)
    WHERE...";
$query = "SELECT UNIX_TIMESTAMP(datetimefield)
    FROM table WHERE...";

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

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

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

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

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

مقالات - برنامه نویسی تحت وب PHP

تبلیغات

مقالات

تبلیغات

ورود و خروج