Monthly Archives: กรกฎาคม 2012

แก้ระบบ error ของ CodeIgniter สำหรับ API


เดิมการแสดง error จะแสดงออกมาเป็น html แต่เมื่อเรานำ CI มาใช้เป็นระบบ API ถ้าแสดงแบบเดิมจะเกิดปัญหา app บน iphone / ipad ล่ม เพราะว่าข้อมูลที่ส่งออกไป กับที่ ios ทั้งหลายคาดว่าจะได้รับไม่ตรงกัน แก้ไม่ยากครับ แค่แทนที่ไฟล์ใน application/errors จาก code ด้านล่าง

error_404.php

<?php
global $application_folder;

// Get an article from the database, show a 404 page if the requested article was not found.

	$article = get_content($this->uri->uri_string());

	if(empty($article)){
		show_404($this->uri->uri_string());
	}

$datas['status'] = -1;
$datas['type'] = '404';
$datas['messageHeading'] = '404';
$datas['message'] = 'file not found';

$logs = "\n\n\n".date('Y-m-d H:i:s');
$logs = $logs."\n\tURL\t".$_SERVER['SERVER_ADDR'].$_SERVER['REQUEST_URI'];
$logs = $logs."\n\tPOST\t".print_r($_POST ,true);
$logs = $logs."\n\tRETURN\t".print_r($datas ,true);
$fp = fopen($application_folder.'/logs/error'.date('Y-m-d').'.txt' ,'a+');
flock($fp ,LOCK_EX);
fwrite($fp ,$logs);
flock($fp ,LOCK_UN);
fclose($fp);
exit(json_encode($datas));

error_db.php

<?php
global $application_folder;
$datas['status'] = -1;
$datas['code'] = 1;
$datas['type'] = 'database';
$datas['messageHeading'] = $heading;
$datas['message'] = 'database error';
$datas['message'] = $message;

$logs = "\n\n\n".date('Y-m-d H:i:s');
$logs = $logs."\n\tURL\t".$_SERVER['SERVER_ADDR'].$_SERVER['REQUEST_URI'];
$logs = $logs."\n\tPOST\t".print_r($_POST ,true);
$logs = $logs."\n\tRETURN\t".print_r($datas ,true);
$fp = fopen($application_folder.'/logs/error'.date('Y-m-d').'.txt' ,'a+');
flock($fp ,LOCK_EX);
fwrite($fp ,$logs);
flock($fp ,LOCK_UN);
fclose($fp);
exit(json_encode($datas));

error_general.php

<?php
global $application_folder;
$datas['status'] = -1;
$datas['type'] = 'general';
$datas['messageHeading'] = $heading;
$datas['message'] = $message;

$logs = "\n\n\n".date('Y-m-d H:i:s');
$logs = $logs."\n\tURL\t".$_SERVER['SERVER_ADDR'].$_SERVER['REQUEST_URI'];
$logs = $logs."\n\tPOST\t".print_r($_POST ,true);
$logs = $logs."\n\tRETURN\t".print_r($datas ,true);
$fp = fopen($application_folder.'/logs/error'.date('Y-m-d').'.txt' ,'a+');
flock($fp ,LOCK_EX);
fwrite($fp ,$logs);
flock($fp ,LOCK_UN);
fclose($fp);
exit(json_encode($datas));

error_php.php

<?php
global $application_folder;
$datas['status'] = -1;
$datas['type'] = 'php';
$datas['messageHeading'] = 'A PHP Error was encountered';
$datas['message'] = $message;
$datas['severity'] = $severity;
$datas['filepath'] = $filepath;
$datas['line'] = $line;

$logs = "\n\n\n".date('Y-m-d H:i:s');
$logs = $logs."\n\tURL\t".$_SERVER['SERVER_ADDR'].$_SERVER['REQUEST_URI'];
$logs = $logs."\n\tPOST\t".print_r($_POST ,true);
$logs = $logs."\n\tRETURN\t".print_r($datas ,true);
$fp = fopen($application_folder.'/logs/error'.date('Y-m-d').'.txt' ,'a+');
flock($fp ,LOCK_EX);
fwrite($fp ,$logs);
flock($fp ,LOCK_UN);
fclose($fp);
exit(json_encode($datas));

เท่านี้ error ทั้งหลายจะแปลงกายไปเป็น แบบ json และบันทึกลงไฟล์ใน application/logs เป็นรายวัน

Advertisements

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


วันนี้เข้าไปแก้งานบนระบบเก่าๆ เลยขอเขียนเตือนความจำเป็นอนุสรณ์ไว้ซะหน่อย
ปัจจุบัน ถ้าต้องการหาวันที่ย้อนหลังจะเขียนตามตัวอย่าง

$date = new DateTime('2012-07-09');
$date->sub(new DateInterval('P3D'));
echo $date->format('Y-m-j');

ซึ่งถ้าใช้กับ php ตัวที่เก่ากว่า 5.3 ลงมาจะมี error
Fatal error: Call to undefined method DateTime::sub() in
แก้ได้โดยไปเขียนแบบเก่าๆ คือ

$date = strtotime('-3 day' ,strtotime('2012-07-09')) ;
echo  date('Y-m-j' ,$date);

ดูเพิ่มเติม

%d bloggers like this: