Tag Archive พีเอชพี

PHP วันที่ เวลา คำนวณ

ตัวอย่างการเพิ่ม ลด แสดงเวลา คำนวณ ช่วงเวลาใน php[code language=”php” title=”phpMonthsDiff.php”]<?php
$date = new DateTime(‘now’);
echo ‘<br>วันเวลาปัจจุบัน ‘, $date->format(‘d/m/Y’);
echo ‘<br>ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ ‘, $date->format(‘m/d/Y’);
$dateUS = new DateTime(‘now’, new DateTimeZone(‘America/New_York’));
echo ‘<br>เวลาของเค้าคือ ‘, $dateUS->format(‘m/d/Y H:i:s’);
echo ‘<br>ถ้าเป็น MySQL จะเก็บแบบนี้ ‘, $date->format(‘Y-m-d H:i:s’);
echo ‘<br>ถ้าเป็น ISO 8601 จะเก็บแบบนี้ ‘, $date->format(‘c’);
echo ‘<br>ถ้าเป็น Unix จะเก็บแบบนี้ ‘, $date->format(‘U’);
echo ‘<hr>’;
echo ‘<br>เพิ่มอีก 1 วัน ‘, $date->modify(‘+1 day’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 7 วัน ‘, $date->modify(‘+1 day’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 1 เดือน ‘, $date->modify(‘+1 month’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 1 ปี ‘, $date->modify(‘+1 year’)->format(‘d/m/Y’);
echo ‘<hr>’;
echo ‘<br>ลดอีก 1 วัน ‘, $date->modify(‘-1 day’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 7 วัน ‘, $date->modify(‘-1 day’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 1 เดือน ‘, $date->modify(‘-1 month’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 1 ปี ‘, $date->modify(‘-1 year’)->format(‘d/m/Y’);
echo ‘<hr>’;
$timeStart = DateTime::createFromFormat(‘d/m/Y’, ‘5/8/1982’);
echo ‘<br>ฉันเกิดวันที่ ‘, $timeStart->format(‘d/m/Y’);
echo ‘<hr>’;
echo ‘<br>อายุ ‘, $timeStart->diff($date)->format(‘%y’), ‘ ปี ‘, $timeStart->diff($date)->format(‘%m’), ‘ เดือน ‘, $timeStart->diff($date)->format(‘%d’), ‘ วัน’;
echo ‘<br>คิดอายุเป็น ‘, $timeStart->diff($date)->format(‘%a’), ‘ วัน’;
echo ‘<br>ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจุบันคือ xxx BETWEEN ‘, $timeStart->format(‘Y-m-d 00:00:00’), ‘ AND ‘, $date->format(‘Y-m-d 23:59:59’);
[/code]

ผลที่ได้

วันเวลาปัจจุบัน 11/11/2016
ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ 11/11/2016
เวลาของเค้าคือ 11/11/2016 14:29:35
ถ้าเป็น MySQL จะเก็บแบบนี้ 2016-11-11 20:29:35
ถ้าเป็น ISO 8601 จะเก็บแบบนี้ 2016-11-11T20:29:35+01:00
ถ้าเป็น Unix จะเก็บแบบนี้ 1478892575


เพิ่มอีก 1 วัน 12/11/2016
เพิ่มอีก 7 วัน 13/11/2016
เพิ่มอีก 1 เดือน 13/12/2016
เพิ่มอีก 1 ปี 13/12/2017


ลดอีก 1 วัน 12/12/2017
ลดอีก 7 วัน 11/12/2017
ลดอีก 1 เดือน 11/11/2017
ลดอีก 1 ปี 11/11/2016


ฉันเกิดวันที่ 05/08/1982


อายุ 34 ปี 3 เดือน 6 วัน
คิดอายุเป็น 12517 วัน
ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจะปัญคือ xxx BETWEEN 1982-08-05 00:00:00 AND 2016-11-11 23:59:59

ถ้าต้องการหาจำนวนเดือน ให้อ่าน นับ เดือนโดย PHP อ่านเพิ่มเติม date — Format a local time/date, The DateTimeZone class, The DateInterval class

นับ เดือนโดย PHP

หลายวันก่อนมีสมาชิกในชมรมคนทำเว็บโพสว่า php คิดเดือนให้ผิด เชื่อถือไม่ได้ เราก็ใช้ php มานาน ก็คิดว่าเค้าเขียน code ผิดรึเปล่า แต่เค้าก็บอกว่าลบ code ออกไปแล้ว แต่ก็ให้ตัวอย่างวันที่มา ลองเขียน code date_diff ดูมันนับผิดจริงๆ ลองไล่หาสาเหตุดูเข้าใจว่ามันคิดผิดเพราะนับเป็นวัน สาเหตุ คือ php จะแปลงวันที่เป็นตัวเลข timestamp อย่าง

  • 2010-04-28 22:41:43 = 1272508903
  • 2007-02-14 20:25:25 จะเป็น 1171502725

และแต่ละเดือนมีวันไม่เท่ากัน แถมบางปีเดือนกุมพาพันธ์ ก็มี 28 / 29 วัน แต่ date_diff ของ php เหมือนจะไม่ได้คิดเรื่องนี้ เอาเวลาตายตัวมาคิด ทำให้ต้องใช้วิธี แยกปี แยกเดือน แล้วเอามาใส่สูตรเอาเอง

[code language=”php” title=”phpMonthsDiff.php”]<?php

$dateRanges = [
[’01/02/2016′, ’01/03/2016′],
[’01/02/2016′, ’01/04/2016′],
[’01/11/2013′, ’30/11/2013′],
[’01/01/2013′, ’31/12/2013′],
[’31/01/2011′, ’28/02/2011′],
[’01/09/2009′, ’01/05/2010′],
[’01/01/2013′, ’31/03/2013′],
[’15/02/2013′, ’15/04/2013′],
[’01/02/1985′, ’31/12/2013′],
];

foreach ($dateRanges as $range) {
list($dateStart, $dateEnd) = $range;

$timeStart = DateTime::createFromFormat(‘d/m/Y’, $dateStart);
$timeEnd = DateTime::createFromFormat(‘d/m/Y’, $dateEnd);

$months = $timeStart->diff($timeEnd)->format(‘%m’);

echo ‘<br>’, $dateStart, ‘ => ‘, $dateEnd, ‘ = ‘, $months, ‘ months’;
}
echo ‘<hr>’;
foreach ($dateRanges as $range) {
list($dateStart, $dateEnd) = $range;

$timeStart = DateTime::createFromFormat(‘d/m/Y’, $dateStart);
$timeEnd = DateTime::createFromFormat(‘d/m/Y’, $dateEnd);

$months = abs(($timeEnd->format(‘Y’) – $timeStart->format(‘Y’)) * 12 + ($timeEnd->format(‘m’) – $timeStart->format(‘m’)));

echo ‘<br>’, $dateStart, ‘ => ‘, $dateEnd, ‘ = ‘, $months, ‘ months’;
}
[/code]

ผลที่ได้คือ

  • 01/02/2016 => 01/03/2016 = 1 months
  • 01/02/2016 => 01/04/2016 = 2 months
  • 01/11/2013 => 30/11/2013 = 0 months
  • 01/01/2013 => 31/12/2013 = 11 months
  • 31/01/2011 => 28/02/2011 = 0 months
  • 01/09/2009 => 01/05/2010 = 8 months
  • 01/01/2013 => 31/03/2013 = 2 months
  • 15/02/2013 => 15/04/2013 = 2 months
  • 01/02/1985 => 31/12/2013 = 10 months

  • 01/02/2016 => 01/03/2016 = 1 months
  • 01/02/2016 => 01/04/2016 = 2 months
  • 01/11/2013 => 30/11/2013 = 0 months
  • 01/01/2013 => 31/12/2013 = 11 months
  • 31/01/2011 => 28/02/2011 = 1 months
  • 01/09/2009 => 01/05/2010 = 8 months
  • 01/01/2013 => 31/03/2013 = 2 months
  • 15/02/2013 => 15/04/2013 = 2 months
  • 01/02/1985 => 31/12/2013 = 346 months

laravel / PHP error 500

เจอ error 500 หลังจาก upload งานที่เขียนโดยใช้ laravel ทั้งๆที่เทสในเครื่องแล้ว หาสาเหตุอยู่นานก็ไม่เจอ

การตรวจสอบขั้นต้นที่เจอในเว็บทั่วๆไปคือ ให้ตั้ง permission ใหม่โดย

  • folder ให้เซ็ตเป็น 755 โดย[code type=”text” title=”chmod”]find . -type d -exec chmod 755 {} \;[/code]
  • และตั้งไฟล์เป็น 644[code type=”text” title=”chmod”]find . -type f -exec chmod 644 {} \;[/code]
  • ถ้าไม่หาย อาจะเพราะ user ที่ run apache กับ ftp หรือ เจ้าของไฟล์เป็นคนละ user กัน ทำให้การทำงานทำได้ไม่สมบูรณ์ แก้ได้โดยคำสั่ง chmod -R o+w โดยถ้าเก็บงานไว้ที่ /colume1/web/CMS_linux ก็ใช้[code type=”text” title=”chmod”]chmod -R o+w /colume1/web/CMS_linux[/code]

    ถ้าไม่เข้าใจอ่าน การเปลี่ยนสิทธิอนุญาตในไฟล์หรือไดเร็กทอรี

จัดระเบียบเซิร์ฟเวอร์

ในครั้งแรกที่เราเรียนเขียนเว็บจะถูกสอนให้เก็บไฟล์ ในโฟลเดอร์ public_html หรือ www เพื่อจะได้เรียกใช้ได้จากเว็บ พอเว็บเราโตขึ้นมันทำให้สับสน และมีปัญหาตามมา เช่น

  1. จากที่อาจจะมีแค่ joomla อยู่อย่างเดียว ก็จะใส่ phpbb เพิ่มเข้าไป ถ้าไม่ย้ายไฟล์ joomla ไปไว้ใน folder ย่อย ก็ต้องใส่ phpbb ไปใน folder ย่อยเวลาจะเรียกใช้ก็เรียก domain1.com/phpbb  ถ้าไม่ถูกใจ phpMyAdmin ตัวเก่าๆที่ติดมากับโฮสต์ จะใช้ตัวใหม่ก็สร้าง folder phpMyAdmin ขึ้นมา ไปเรื่อยๆ แล้วมันจะมีปัญหาอะไรละ
    • ถ้าจะเปลี่ยนจากจูมล่าเป็น wordpress ก็ต้องมาหาว่า folder นี้เป็นของ joomla นะ ต้องดูให้แน่ใจว่ามันไม่ถูกใช้โดยโป��แกรมอ��่น จะท���้งไว้ก็เสียพื้นที่ไปเปล่าๆ
    • การ update อัตโนมัติของบางโปรแกรมอย่าง prestashop ให้วิธีลบทั้งโฟลเดอร์ออกไปทั้งหมด แล้วแตกไฟล์เข้าไปใหม่ ถ้าใน folder นั้นๆ มีไฟล์ของโปรแกรมอื่นละ มันก็ล่มโดยที่เราไม่รู้ตัว
    • บางครั้งโปรแกรมต้องใช้การ config ที่ต่างกัน อย่าง joomla จะเตือนถ้าพบว่า magic_quotes_gpc  เปิดอยู่ แต่โปรแกรมโบราณต้องเปิดไว้ ถ้าเราก็บแยกโพลเดอร์ก็สามารถใช้ .htaccess เปิดปิดได้ตามความต้องการ
  2. จะสร้างเว็บใหม่ ใช้ joomla เหมือนกัน ไว้ที่เดียวกัน บางครั้งสับสน ว่าโพลเดอร์นี้ เป็นของโดเมนไหน

ถ้าเราเก็บไฟล์โดยใช้รูปแบบ public_html/domain1.com, public_html/domain2.com, public_html/ domain3.com ก็จะแก้ปัญหาข้อ 2 ได้

ในแต่ละ domain ก็แบ่งย่อยเป็น joomla, phpbb อีก ให้โปรแกรมแต่ละตัวแยกอิสระต่อกัน

แต่ การที่จะให้ผู้ใช้ลูกค้าของเราดูเว็บ แบบ http://domain1.com/domain1.com/Joomla คงไม่ดีแน่ ทั้งในเรื่องความสะดวกและ SEO เราสามารถใช้ ไฟล์ .htaccess  point ชี้ root diretory ให้เราใหม่

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ public_html  ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์ ตามตัวอย่างเลยครับ[sourcecode langlage=”text”]
    # BlueHost.com
    # .htaccess main domain to subdirectory redirect
    # Do not change this line.
    RewriteEngine on
    # Change example.com to be your main domain.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    # Change ‘subdirectory’ to be the directory you will use for your main domain.
    RewriteCond %{REQUEST_URI} !^/subdirectory/
    # Don’t change the following two lines.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Change ‘subdirectory’ to be the directory you will use for your main domain.
    RewriteRule ^(.*)$ /subdirectory/$1
    # Change example.com to be your main domain again.
    # Change ‘subdirectory’ to be the directory you will use for your main domain
    # followed by / then the main file for your site, index.php, index.html, etc.
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteRule ^(/)?$ subdirectory/index.html [L]
    [/sourcecode] copy คู่มือของเซิร์ฟเวอร์มานั่นละ แต่กลัวลืมเลยขอ note ไว้หน่อยหนึ่ง
  3. แก้ example.com เป็น domain ของเรา แก้ subdirectory เป็นโฟลเดอร์ของเรา
  4. ทดลองเข้า โดเมน domain ของเรา จะพบว่าเราเห็นไฟล์ในโฟลเดอร์ subdirectory อีกชั้นหนึ่งไม่ใช่ ตัว public_html

ปิด magic_quotes ด้วย htaccess

Joomla 3 จะมีปัญหาภาพไม่ขี้น ไม่สามารถติดตั้งได้ เพราะว่าเปิด magic_quotes_gpc ไว้ ถ้าเราไม่สามารถปิด ใน php.ini ได้ (เช่าแชร์เซิร์ฟเวอร์เค้าใช้ต้องทำใจ) หรือมีโปรแกรมโบราณสมัยพระเจ้าหลุยส์ที่สิบสามอยู่ด้วย ทำให้ปิดไม่ได้ เราก็สามารถทำได้ด้วยไฟล์ .htaccess

  1. เปิดไฟล์ .htaccess ในโฟลเดอร์ที่เก็บไฟล์จูมล่าไว้ ถ้าไม่มี ก็สามารถสร้างขึ้นมาใหม่ได้ ด้วย โปรแกรม notepad แล้ว save เป็นชื่อ .htaccess ตรง Save As Type เลือกเป็น All Files (*.*)
  2. พิมพ์
    [sourcecode language=”text”]
    # disabel magic_quotes for joomla
    php_flag magic_quotes off
    php_flag magic_quotes_gpc off
    php_value magic_quotes 0
    php_value magic_quotes_gpc 0
    [/sourcecode]

คำนวนวันที่ใน PHP

วันนี้เข้าไปแก้งานบนระบบเก่าๆ เลยขอเขียนเตือนความจำเป็นอนุสรณ์ไว้ซะหน่อย
ปัจจุบัน ถ้าต้องการหาวันที่ย้อนหลังจะเขียนตามตัวอย่าง
[sourcecode language=”php”]
$date = new DateTime(‘2012-07-09’);
$date->sub(new DateInterval(‘P3D’));
echo $date->format(‘Y-m-j’);
[/sourcecode]
ซึ่งถ้าใช้กับ php ตัวที่เก่ากว่า 5.3 ลงมาจะมี error
Fatal error: Call to undefined method DateTime::sub() in
แก้ได้โดยไปเขียนแบบเก่าๆ คือ
[sourcecode language=”php”]
$date = strtotime(‘-3 day’ ,strtotime(‘2012-07-09’)) ;
echo date(‘Y-m-j’ ,$date);
[/sourcecode]
ดูเพิ่มเติม