Category Archives: PHP

phpinfo()

<?php

// Show all information, defaults to INFO_ALL
phpinfo();

// Show just the module information.
// phpinfo(8) yields identical results.
phpinfo(INFO_MODULES);

?>

ref: php.net

HTML to PDF ตัวไหนดี

Source : http://www.jquerytips.com/

สวัสดีครับ หายหน้ากันอีกไปพักใหญ่ๆ แต่ว่าก็ยัง อัพเดทอยู่ใน Fan Page อยู่เรื่อยๆ นะ แต่ว่าถ้าเป็น บทความยาวๆ นี่มันท้อ แฮะ 555

แต่วันนี้ ยังไงก็มาแล้ว ก็จับประเด็น บางเรื่องมาเล่าสู่กันฟัง…

พอดีช่วงนี้ผมกำลัง ทำงานในส่วนออก Report พอดี ซึ่งที่ต้องการก็คือ ออก Report เป็น PDF อันที่จริงมันก็ไม่มีปัญหาอะไรหรอก Lib PDF มีอยู่ถมไป Zend_Pdf ซึ่งทำงานได้ละเอียดมากๆ ก็มีอยู่ แต่ด้วยความขี้เกียจ เลยไม่อยากไป Add Columns ไปสร้างสี แบ่งล๊อกอะไรให้มันวุ่นวาย

แล้วก็จำได้ด้วยว่าเคยเห็น Web ตั้งเยอะที่มัน Convert HTML เป็น PDF มันน่าจะมีใครทำ Lib อะไรมาให้ใช้บ้างน่า สรุปได้ แคนดิเดท มา 3 ตัว ประกอบไปด้วย

1. TCPDF

2. Dompdf

3. mPDF

ก็เลยค่อยๆลอง ไปทีละตัว โดยที่แต่ละตัว ก็มีข้อเด่น ข้อด้อยต่างกันไป ซึ่งแรกเริ่ม ผมก็ไล่มาเลย ตั้งแต่

TCPDF

ตัวนี้ค่อนข้างจะใช้ง่ายมาก ไม่ต้อง Config อะไรวุ่นวาย Font ก็มี ที่ Support ภาษาไทยมาให้ในตัว คือ “Freeserif” ไม่ต้องทำอะไรเท่าไหร่ ตอนแรกก็คิดว่าจะหยุดที่ตัวนี้แหละ แต่พอทำไปทำมาเกิดปัญหา คือมันสามารถอ่าน Stylesheet ได้แค่เล็กน้อยเท่านั้น พวก attrs ง่ายๆ อย่าง  color อะไรแบบนี้

แต่ว่ามันดันอ่านพวก float, padding, margin เพี้ยนๆ ไม่เหมือน HTML ที่ทำมาเท่าไหร่ ซึ่งมันยากมาก เพราะผมต้องทำ HTML เป็น table เกือบทั้งหมด เลยเปลี่ยนๆ ลองตัวใหม่

Dompdf

ตัวนี้ลองอ่าน Document แล้ว ก็ลองใช้งาน ถูกใจมากเลย ถึงจะ config ลำบากไปนิด แต่ว่าใช้งานง่าย โคดเขียนสวย Doc มีตัวอย่างเยอะ แล้วก็ดู ค่อนข้างโปรที่สุด แต่….

พอถึงเรื่องภาษาไทย ผมพยายาม Add Font ไทยเข้าไป มันก็ได้อยู่ ถึงจะลง Font ค่อนข้างลำบากหน่อย แต่พอเอามา Render จริงๆ font ไทย เนียนนะครับ ใช้ได้หมด แต่สระ เสือกกลายเป็น สี่เหลี่ยมหมด (คิดว่าคงมีวิธีแก้ แต่ตอนนี้ไม่ได้หาต่อแล้ว) ก็เลยข้ามไปก่อน กะว่าจะมาหาวิธีแก้ ที่ตัวนี้แหละ แต่ยังไงขอลอง ตัวถัดไปก่อน

mPDF

ตัวนี้บอกตามตรง ตอนแรกผมค่อนข้างจะไม่สนใจ ด้วยความที่หน้าเว็บ ดูไม่โปร (ใช้ WordPress ไม่เปลี่ยน Theme) PageRank ไม่ขึ้นเลย Search หาก็ไม่ค่อยมีข้อมูล

แต่ก็ลองดู เพราะว่า คงใช้เวลาไม่นาน ดูตามตัวอย่างแล้ว เขียนตามนิดเดียวก็คงรู้ผล

แต่เรื่องไม่น่าเชื่อก็เกิดขึ้น คือ Lib ตัวนี้กับทำตามที่ผมต้องการได้ทุกอย่าง คือโจทย์ของผมมีว่า

– ต้องสามารถอ่าน CSS ได้

– ต้องสามารถแสดงผล ได้เหมือน HTML เพี้ยนได้ไม่เกิน 2%

– ต้องสามารถใช้งานกับภาษาไทยได้ 100%

– ใช้ง่ายไม่ต้องต่อ online กับ Service ภายนอกตัวอื่นๆ

– ต้องสามารถ ทำ Paging ในตัว PDF ได้

– ต้อง Config header + footer ได้

– ต้องอ่าน img แล้วนำเข้าไปได้

ไม่น่าเชื่อก็ต้องเชื่อแหละครับ Lib ตัวนี้ทำได้หมดเลย ได้มากกว่าที่ผมต้องการเสียอีก แถมระบบการ Config ก็เอื้อ แก้การประยุกต์ใช้งานมากๆ

มาลองดูตัวอย่างที่ผมทำการ Lab ไปนะครับ

สมมุติว่า ผมมี HTML ตามนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$html = <<<EOF
<div id=”wrapper”>
<div>
<div><img src=”/wp-content/uploads/archive/iannnnnAVATAR_normal.png” /></div>
<div>
<div>
<a href=”#”>Name<span>@username</span></a>
<small>4m</span>
</div>
<p lang=”th”>[THAI TEXT TO SHOW]</p>
<div>Footer text</div>
</div>
</div>
<div></div>
</div>
EOF;

?>

 

แล้วผมมี stylesheet ประมาณนี้

1
2
3
4
5
6
7
8
9
10
11
.row { background:url(/wp-content/uploads/archive/bg.jpg); }
.row { clear:both; width:500px; padding:10px; border-radius:5px; font-family:naipol; font-size:11px; background-color:#EEE; }
.picture { float:left; display:block; width:48px; height:48px; }
.picture img { width:48px; height:48px; border-radius:5px; }

.content { margin-left:60px; }
.content .header small { float:right; text-align:right; }
.content p { margin:0; padding: 5px 0; }
.content .footer { color:orange; }

.clear { clear:both; }

 

ผมลองเขียนโคดขึ้นมาเพื่อ Gen ออกมาดู

1
2
3
4
5
6
7
8
9
10
<?php
$mpdf = new mPDF();
//$mpdf->setDisplayMode(‘fullpage’);
//$mpdf->setAutoFont();

$mpdf->writeHTML($style, 1);
$mpdf->writeHTML($html);
$mpdf->Output();

?>

โดยที่ Stylesheet ผมใส่ไว้ในตัวแปล $style นะครับ

 

ผลลัพธ์ที่ออกมาของผม มาตามรูปข้างล่างนี้ครับ

ซึ่งเหมือนกับ HTML เป๊ะเลย เรื่องของ Font Thai ผมใช้ “Thonburi” เป็นตัว font ครับ

ที่สำคัญ Lib ตัวนี้ยังมีการ config font ที่ฉลาดมา และยังสามารถ Detect ภาษาให้เองได้ด้วยอีก

http://mpdf1.com/manual/index.php?tid=453

 

ลองไปเล่นดูนะครับ มันเหมาะกับการ Generate Reports, Coupons หรือ หน้าเว็บ มาก

 

สร้าง public_html ใน Ubuntu 12.04

Set ดังนี้

$ sudo a2enmod userdir
$ sudo service apache2 restart
$ mkdir ~/public_html && chmod 755 ~/public_html

เรียกใช้งานได้ดังนี้

http://localhost/~jack/

ตอนนี้สามารถเรียกใช้ไฟล์ html ได้แล้ว แต่ยังไม่สามารถใช้งาน php ได้ เพราะโดย default แล้วจะไม่สามารถใช้งานได้เนื่องจากเรื่องของความปลอดภัย แต่สามารถแก้ไขให้ใช้งานได้ดังนี้

เปิดไฟล์ php5.conf

sudo nano /etc/apache2/mods-available/php5.conf

comment out บรรทัด  php_admin_value engine Off

Before:


 <IfModule mod_userdir.c>
 <Directory /home/*/public_html>
 php_admin_value engine Off
 </Directory>
 </IfModule>

After:


 <IfModule mod_userdir.c>
 <Directory /home/*/public_html>
 # php_admin_value engine Off
 </Directory>
 </IfModule>

Save and exit, then reload apache2 configuration with following commad:

sudo /etc/init.d/apache2 reload

To testing PHP script work or not in the public_html directory, you can create some php script. In this case we are usingphpinfo, in terminal type following command

echo '<?php phpinfo(); ?>' > ~/public_html/info.php

If you done, open the web browser then access http://[hostname]/~username/info.php.

apache2 userdir module testing phpinfo  How to Enable and Configure Apache2 Userdir Module in Ubuntu Server 12.04

Link Reference :

Ref: How to Enable and Configure Apache2 userdir Module in Ubuntu Server 12.04

PHP : สร้าง Counter แบบละเอียด

สร้าง Counter แบบละเอียด โดยเก็บข้อมูลและแสดงแบบละเอียดเช่น Today, Yesterday,This Month, Last Month, This Year, Last Year (วันนี้ เมื่อวาน,เดือนนี้,เดือนก่อนนี้,ปีนี้,ปีก่อนนี้)

PHP Statistics

โดยใช้หมายเลข IP Address ในการนับจำนวนผู้เข้าชมอย่างแท้จริง สำหรับตัวอย่าง Script นี้ใช้การเก็บข้อมูลลงใน MySQL Database ประก่อบด้วย 2 ตารางหลัก ๆ คือ

Table Name
1. counter สำหรับตารางนี้เก็บข้อมูลรายวัน คือเก็บข้อมูลวันปัจจุบัน ว่ามีเข้ามาในเว็บไซต์กี่ IP และเมื่อขึ้นวันใหม่ข้อมูลจะถูก SUM และ Move ไว้ไปไว้ตาราง daily
2. daily สำหรับราตารางนี้จะเก็บข้อมูลในแต่ล่ะวันว่ามีกี่หมายเลข IP Address ที่เข้ามาชมเว็บไซต์ เป็นข้อมูลที่ถูก SUM ไว้ในแต่ล่ะวัน

MySQL Table

CREATE TABLE `counter` (
`DATE` date NOT NULL,
`IP` varchar(30) NOT NULL,
PRIMARY KEY (`DATE`,`IP`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `daily` (
`DATE` date NOT NULL,
`NUM` varchar(3) NOT NULL,
PRIMARY KEY (`DATE`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Concept การทำงาน
Concept ของ Script ตัวนี้ไม่ยาก คือในแต่ล่ะวันเมื่อ User ทำการเปิดหน้าเว็บ Page ขึ้นมา ก็จะถูก Insert ข้อมูลวันที่และ IP Address ลงในตาราง counter โดยในแต่ล่ะวันก็จะ Insert ข้อมูลทั้งหมด โดยหมายเลข IP Address จะไม่ซ้ำกัน ซึ่งจะได้ข้อมูล UNIQUE IP ที่ไม่ซ้ำกัน ของ

วันนั้น ๆ ลงในตาราง counter และ เมื่อมีการเปลี่ยนวันใหม่ ข้อมูลที่ถูก Insert ลงในตาราง counter ก็จะถูก SUM และ Move ไปไว้ในตาราง daily ซึ่งจะเก็บข้อมูลทุก ๆ วัน โดยโปรแกรมจะทำงานแบบนี้ซ้ำไปเรื่อย ๆ ไม่มีวันสิ้นสุด

สำหรับการ Query ตัว Statistics มาแสดงนั้นจะใช้ความสามารถของ function ของ MySQL ในการคำนวณ Query จากตาราง daily เพื่อนำข้อมูลมาแสดง

สำหรับ Code เต็ม ๆ ครับ

<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
<?
	//*** By Weerachai Nukitram ThaiCreate.Com ***//

	//*** Connect MySQL ***//
	mysql_connect("localhost","root","root");
	mysql_select_db("counter");

	//*** Select วันที่ในตาราง Counter ว่าปัจจุบันเก็บของวันที่เท่าไหร่  ***//
	//*** ถ้าเป็นของเมื่อวานให้ทำการ Update Counter ไปยังตาราง daily และลบข้อมูล เพื่อเก็บของวันปัจจุบัน ***//
	$strSQL = " SELECT DATE FROM counter LIMIT 0,1";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	if($objResult["DATE"] != date("Y-m-d"))
	{
		//*** บันทึกข้อมูลของเมื่อวานไปยังตาราง daily ***//
		$strSQL = " INSERT INTO daily (DATE,NUM) SELECT '".date('Y-m-d',strtotime("-1 day"))."',COUNT(*) AS intYesterday FROM  counter WHERE 1 AND DATE = '".date('Y-m-d',strtotime("-1 day"))."'";
		mysql_query($strSQL);

		//*** ลบข้อมูลของเมื่อวานในตาราง counter ***//
		$strSQL = " DELETE FROM counter WHERE DATE != '".date("Y-m-d")."' ";
		mysql_query($strSQL);
	}

	//*** Insert Counter ปัจจุบัน ***//
	$strSQL = " INSERT INTO counter (DATE,IP) VALUES ('".date("Y-m-d")."','".$_SERVER["REMOTE_ADDR"]."') ";
	mysql_query($strSQL);

	//******************** Get Counter ************************//

	// Today //
	$strSQL = " SELECT COUNT(DATE) AS CounterToday FROM counter WHERE DATE = '".date("Y-m-d")."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strToday = $objResult["CounterToday"];

	// Yesterday //
	$strSQL = " SELECT NUM FROM daily WHERE DATE = '".date('Y-m-d',strtotime("-1 day"))."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strYesterday = $objResult["NUM"];

	// This Month //
	$strSQL = " SELECT SUM(NUM) AS CountMonth FROM daily WHERE DATE_FORMAT(DATE,'%Y-%m')  = '".date('Y-m')."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strThisMonth = $objResult["CountMonth"];

	// Last Month //
	$strSQL = " SELECT SUM(NUM) AS CountMonth FROM daily WHERE DATE_FORMAT(DATE,'%Y-%m')  = '".date('Y-m',strtotime("-1 month"))."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strLastMonth = $objResult["CountMonth"];

	// This Year //
	$strSQL = " SELECT SUM(NUM) AS CountYear FROM daily WHERE DATE_FORMAT(DATE,'%Y')  = '".date('Y')."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strThisYear = $objResult["CountYear"];

	// Last Year //
	$strSQL = " SELECT SUM(NUM) AS CountYear FROM daily WHERE DATE_FORMAT(DATE,'%Y')  = '".date('Y',strtotime("-1 year"))."' ";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	$strLastYear = $objResult["CountYear"];

	//*** Close MySQL ***//
	mysql_close();
?>

<table width="183" border="1">
  <tr>
    <td colspan="2"><div align="center">Statistics</div></td>
  </tr>
  <tr>
    <td width="98">Today</td>
    <td width="75"><div align="center"><?=number_format($strToday,0);?></div></td>
  </tr>
  <tr>
    <td>Yesterday</td>
    <td><div align="center"><?=number_format($strYesterday,0);?></div></td>
  </tr>
  <tr>
    <td>This Month </td>
    <td><div align="center"><?=number_format($strThisMonth,0);?></div></td>
  </tr>
  <tr>
    <td>Last Month </td>
    <td><div align="center"><?=number_format($strLastMonth,0);?></div></td>
  </tr>
  <tr>
    <td>This Year </td>
    <td><div align="center"><?=number_format($strThisYear,0);?></div></td>
  </tr>
  <tr>
    <td>Last Year </td>
    <td><div align="center"><?=number_format($strLastYear,0);?></div></td>
  </tr>
</table>
</body>
<html>

Screenshot
PHP Statistics

คัดลอกมาจาก : http://www.thaicreate.com

PHP : การโชว์ thumbnail

ไฟล์ภาพขนาดเล็ก (Thumbnail) เก็บอยู่ที่ “./thumbnail/”
ส่วนภาพขนาดใหญ่เก็บอยู่ที่ “./uploads/”
ดังนั้นเวลาแสดงภาพให้นำภาพที่ “./thumbnail/” มาแสดง แต่เวลาสร้างลิงค์ไปที่ไฟล์รูปภาพขนาดใหญ่ให้ชี้ไปที่ “./uploads/”

<?
	$imgPathUpload = "./uploads/";
	$imgPathThumbnail = "./thumbnail/";
	$dirHandle = opendir($imgPathThumbnail);
	while ($file = readdir($dirHandle)) {
		if(!is_dir($file) && strpos($file, '.jpg')>0 || strpos($file, '.gif')>0 || strpos($file, '.png')>0) {
			if (strpos($file,"thumb_")===FALSE) 
				echo ("<a href=$imgPathUpload$file><img src=$imgPathThumbnail$file></a>");
		}
	} 
	closedir($dirHandle);
?> 

PHP: Upload และปรับเปลี่ยนขนาดรูปภาพ

!! ถ้า upload ไม่ผ่าน ให้เซ็ต permission เป็น 777
แต่ถ้ายัง upload ไม่ผ่านอีก อาจเป็นเพราะไม่สามารถเซ็ต permission จาก ftp client ได้
ให้ไปเซ็ต permission ที่ panel ให้เป็น 777

$_FILES[‘var’][‘tmp_name’] แสดงเท็มสำหรับการอัพโหลด
$_FILES[‘var’][‘name’] แสดงชื่อไฟล์
$_FILES[‘var’][‘size’] แสดงขนาดของไฟล์มีหน่วยเป็นไบต์
$_FILES[‘var’][‘type’] แสดงประเภทของไฟล์
$_FILES[‘var’][‘error’] แสดงรายละเอียดข้อผิดพลาด

ไฟล์ .html

</pre>
<form action="upload_resize.php" enctype="multipart/form-data" method="post">
<h2>Form upload and resize image.</h2>
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    <input type="file" name="fileupload" />

    <input type="submit" value="submit" />
    <input type="reset" value="Reset" />
  </form>
<pre>

ไฟล์ .php

<?php 
	function imageResize( $ext, $ori_file, $new_file )
	{
		$max_imageSize = 400;
		$ori_size = getimagesize($ori_file);
		$ori_w = $ori_size[0];
		$ori_h = $ori_size[1];
		
		if($ori_w > $ori_h) {
			$new_w = $max_imageSize;
			$new_h = round(($new_w/$ori_w) * $ori_h);
		}
		else
		{
			$new_h = $max_imageSize;
			$new_w = round(($new_h/$ori_h) * $ori_w);
		}
	
		if ($ext == "jpg" or $ext == "jpeg") {
			$ori_img = imagecreatefromjpeg($ori_file);
		} else
		if ($ext == "png") {
			$ori_img = imagecreatefrompng($ori_file);
		} else
		if ($ext == "gif") {
			$ori_img = imagecreatefromgif($ori_file);
		} 

		$new_img = imagecreatetruecolor($new_w, $new_h);
		imagecopyresized($new_img, $ori_img, 0, 0, 0, 0, $new_w, $new_h, $ori_w, $ori_h);
		if ($ext == "jpg" or $ext == "jpeg") {
			imagejpeg($new_img, $new_file); 
		} else
		if ($ext == "png") {
			imagepng($new_img, $new_file); 
		} else
		if ($ext == "gif") {
			imagegif($new_img, $new_file); 
		}
		
		imagedestroy($ori_img);
		imagedestroy($new_img);
	}

	$imagePath = "./uploads/";
	$new_file = $imagePath . "test_resize.jpg";
	//echo $new_file;
	echo "<br>";

	$fileupload = $_FILES['fileupload']['tmp_name'];
	$fileupload_name = $_FILES['fileupload']['name'];
	$fileupload_size = $_FILES['fileupload']['size'];
	$fileupload_type = $_FILES['fileupload']['type'];

	echo $fileupload;
	echo "<br>";
	echo $fileupload_name;
	echo "<br>";

	$ext = strtolower(end(explode('.', $fileupload_name)));
	
	if ($ext == "jpg" or $ext == "jpeg" or $ext == "png" or $ext=="gif") {
		copy($fileupload, $imagePath . $fileupload_name);
 	
		$ori_file = $imagePath . $fileupload_name;
		imageResize( $ext, $ori_file, $new_file );
		unlink($fileupload);
		
		echo "<H1>Upload and resize complete</h1>";
	} else {
		echo "<h1>Error</h1>";
	}
?>

ที่มา: thaicreate.com/

PHP: เปลี่ยนขนาดรูปภาพ JPEG

<?php
	function imageResize( $ori_file, $new_file )
	{
		$max_imageSize = 100;
		$ori_size = getimagesize($ori_file);
		$ori_w = $ori_size[0];
		$ori_h = $ori_size[1];

		if($ori_w > $ori_h) {
			$new_w = $max_imageSize;
			$new_h = round(($new_w/$ori_w) * $ori_h);
		}
		else
		{
			$new_h = $max_imageSize;
			$new_w = round(($new_h/$ori_h) * $ori_w);
		}

		$ori_img = imagecreatefromjpeg($ori_file);
		$new_img = imagecreatetruecolor($new_w, $new_h);
		imagecopyresized($new_img, $ori_img, 0, 0, 0, 0, $new_w, $new_h, $ori_w, $ori_h);

		imagejpeg($new_img, $new_file);
		imagedestroy($ori_img);
		imagedestroy($new_img);
	}

	$imagePath = "./images/";
	$ori_file = $imagePath . "test.jpg";
	$new_file = $imagePath . "test_resize.jpg";

	echo "<H1>Start resizing image</h1>";
	imageResize( $ori_file, $new_file );

	echo "<H1>Resize complete</h1>";
	echo "<img src='$ori_file'>";
	echo "<img src='$new_file'>";
?>

PHP : ติดต่อฐานข้อมูล MySQL ด้วย php

<?php
$con = mysql_connect("localhost","mysql_user","mysql_pwd");
if (!$con)
{
	die('Could not connect: ' . mysql_error());
}

$sql = "SELECT * FROM Person";
mysql_query($sql,$con);

// some code

mysql_close($con);
?>
<?php
$con = mysql_connect("localhost","mysql_user","mysql_pwd");
if (!$con)
{
	die('Could not connect: ' . mysql_error());
}

$sql = "CREATE DATABASE my_db";
if (mysql_query($sql,$con))
{
	echo "Database my_db created";
}
else
{
	echo "Error creating database: " . mysql_error();
}
?>

ที่มา : www.w3schools.com/

กรณีที่ต้องการใช้ภาษาไทยให้กำหนด Collation เป็น utf8_unicode_ci ดังนี้

<?php
	$dbhost = 'localhost';
	$dbname = 'dbxxx';
	$dbuser = 'userxxx';
	$dbpass = 'passxxx';

	$conn = mysql_connect($dbhost, $dbuser, $dbpass) 
             or die ('Error connecting to mysql');
	mysql_select_db($dbname);
	mysql_query("SET NAMES UTF8");
	$sql = "SELECT * FROM sometable";

	if ($objQuery = mysql_query($sql, $conn))
	{
		echo "OK";		
	}
	else
	{
		echo "Error " . mysql_error();
	}
	mysql_close($conn);
?>