วันจันทร์ที่ 19 สิงหาคม พ.ศ. 2556

Running PHP 32-bit on 64-Bit Windows


I have recently started working on 64-bit Windows servers more often and thought I’d share some of my experiences along the way.
One of the issues I encountered was with the installation of PHP on a 64-bit Windows Server 2003 R2 machine. The server already had IIS 6.0 installed so I downloaded the latest distribution of PHP and installed it in the usual way as described here How To Install PHP on IIS 6.0

The installation of PHP on IIS is pretty straightforward so I was a little surprised when I was presented with the following error after browsing to http://localhost to check that everything was working.
The first thing I always do when troubleshooting a problem is to make Internet Explorer give me a useful error message to work with. You can do this by clicking Tools | Internet Options | Advanced and then unticking ‘Show friendly HTTP error messages’ as shown here
Once this was done I was able to see the actual error message being returned to the browser as shown here :


: error 1% is not a valid win32 appliction .
Since my previous experience with 64-bit Windows and IIS was pretty limited I hadn’t encountered this particular error message before but a quick scan through the various newsgroups and Google quickly revealed the cause of the problem.
Without realising it I was trying to load a 32-bit application (in this case PHP) inside a 64-bit worker process and it was this that was causing the 500 Internal Server error I was seeing in my browser. Since the latest Windows distribution of PHP from www.php.net is only available in 32-bit version you need to configure IIS to run in 32-bit mode if you are using a 64-bit version of Windows.
In order to configure IIS to run in 32-bit mode you need to execute the following command :
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
This will set the Enable32bitAppOnWin64 metabase property to True as shown here :
It is important to note that IIS 6.0 does not support running in both 32-bit and 64-bit modes at the same time - in other words this is an ‘all or nothing’ system wide setting which affects all IIS web sites on the server, so if you need to run both 32-bit and 64-bit applications in IIS you will either have to locate them on separate machines or run them all in 32-bit mode.
Now, when I browse to http://local/index.php the page loads correctly and I can run PHP applications on my 64-bit IIS server.


Save Ping Output in a text file

I know this is a variation of an already asked question but after research and several failed attempts I think I need some help.
I would like to ping two websites repeatedly and record the time and results in a text file.
I found this question Save Ping Output in a text file to be very helpful but the several versions I have tried do not work.
If I execute the following in a command window, it creates the text file in my users directory as I would expect with the repeated pings recorded correctly.
ping xxx.xxx.xxx.xxx -t > filename.txt
But if I create the following ping.dat file and save it on my desktop. When I run it, it both opens a cmd window with the just time in it and also creates the desired textfile on my desktop. Unfortunately the file only contains the time and not the ping results and the results are obviously not 3seconds apart like expected.
@ECHO OFF
:LOOPSTART
time /T
ping xxx.xxx.xxx.xxx -n 4 >> filename.txt
ping yyy.yyy.yyy.yyy -n 4 >> filename.txt
sleep -m 3000
GOTO LOOPSTART
I assumed that my problem was related to how I was trying to write the results but if I modify the batch file, deleting the '>> filename.txt' reference all it does is open a cmd window which instantly fills up with time stamps.
@ECHO OFF
:LOOPSTART
time /T
ping xxx.xxx.xxx.xxx -n 4
ping yyy.yyy.yyy.yyy -n 4
sleep -m 3000
GOTO LOOPSTART
Hence my questions are
A) Any idea what I am doing wrong?
B) How do I change the time stamp so that it is HH:MM:SS rather than HH:MM
All help appreciated.
S.
@LInker3000 Thanks for the reply. I should have mentioned this in my original question, but I have already tried that. When I added '>> filename.txt' to the timestamp, I now get a command window that fills up with "The process cannot acces the file because it is being used by another process.". Upon terminating the process, the created txt file only has one timestamp and the "Terminate Batch Job (Y/N)" text.

การตั้งค่า MySQL แก้ปัญหา ภาษาไทย กลายเป็น ??? หรือ อ่านไม่ออก

การตั้งค่า MySQL แก้ปัญหา ภาษาไทย กลายเป็น ??? หรือ อ่านไม่ออก

รับรองว่าหลายๆคนต้องเคยเจอปัญหากับภาษาไทยเป็นเครื่องหมายคำถาม ?? กันมาแล้ว
ซึ่งสาเหตุมีเพียงเรื่องเดียวคือเรื่องของ charset ของ database
แต่เอ๊ะ ทำไมแก้ยังไงก็ไม่ได้ซะที ทั้งๆที่โฮสเก่าก็ใช้ได้ แต่โฮสใหม่ก็ทำเหมือนๆกันแต่ใช้ไม่ได้
มาดูกันครับว่าอะไรเป็นอะไร

เริ่มต้นตั้งแต่การติดตั้ง mysql
ใน การติดตั้ง mysql-server นั้นหากไม่มีการระบุ charset ใดๆ ก็จะมี default charset เป็น latin1_swedish_ci หากมีการระบุตอน compile ก็จะเป็น charset ตามที่ระบุไว้
อย่างไรก็ดีค่า default-charset สามารถเปลี่ยนแปลงภายหลังได้โดยการระบุไว้ในไฟล์ my.cnf
เมื่อ เราทำการสร้าง database ใหม่ database ก็จะมี charset ตามค่า default ในไฟล์ my.cnf หรือถ้าใน my.cnf ไม่มีการระบุก็จะเป็นค่า default ตอน compile

compile php with mysql
ในการ compile php นั้นเราจะต้อง configure --with-mysql=path เมื่อ compile เสร็จแล้ว สิ่งที่ได้รับคือ php จะทำการ connect mysql ด้วย charset ตามค่า default charset ของ mysql lib ซึ่งจะไม่สามารถเปลี่ยนได้ด้วย my.cnf หรือ php.ini

การตั้งค่าและการใช้งาน
แบบที่ 1
-- compile mysql เป็น default charset latin1
-- ไม่มีการกำหนด default charset ใน my.cnf
-- สร้าง database ใหม่ก็จะได้ charset เป็น latin1
-- เวลาใช้งาน php ก็ connect ด้วย charset latin1 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ ascii
-- การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย 
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1 

แบบที่ 2
-- compile mysql เป็น default charset latin1
-- แล้วกำหนด default charset ใน my.cnf เป็น utf8
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
-- แต่เวลาใช้งาน php ดัน connect ด้วย charset latin1 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย 
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1 

แบบที่ 3
-- compile mysql เป็น default charset utf8
-- กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8
-- เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ?? 
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย 

แบบที่ 4
-- compile mysql เป็น default charset utf8
-- กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8
-- เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บไปใช้กับระบบที่เป็น encoding tis-620 
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ?? 
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย 
หมาย เหตุ: แก้ encoding หน้าเว็บเป็น utf-8 ก็จะใช้งานได้ปกติ แต่จริงๆคือการเอา script แบบ ascii มาใช้ในระบบ unicode ผลที่จะตามมาคือขนาดของ field ในแต่ละตารางจะกำหนดไว้สั้นเกินไปเนื่องจาก utf-8 ใช้เนื้่อที่มากกว่าแบบ ascii 3 เท่า

แบบที่ 5
-- compile mysql เป็น default charset latin1
-- แล้วกำหนด default charset ใน my.cnf เป็น utf8
-- รวมถึงกำหนด init ใน my.cnf เป็น utf8 ด้วย
Code: [Select]
init-connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
-- และเวลาใช้งาน php จะ connect ด้วย utf8 ตาม init-connect ใน my.cnf
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ?? 
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย 

ขอแสดงตัวอย่างแค่ 5 แบบที่น่าจะพบมากที่สุดพอครับ

ผลกระทบ
ใน แต่ละแบบจะเห็นว่าระบบจะบังคับการใช้งานไปใน charset ใด charset หนึ่ง ซึ่งหากต้องการใช้งานระบบที่ต่างจาก default charset  ที่ตั้งค่าไว้ จะต้องกำหนดใน code php หลังจากทำการ connect และ select database แล้ว ดังนี้
Code: [Select]
mysql_query("SET NAMES 'charset_name' COLLATE 'collation_name';");
เช่น
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';");
หรือ
mysql_query("SET NAMES 'tis620' COLLATE 'tis620_thai_ci';");
หรือ
mysql_query("SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';");

การแก้ปัญหา
สำหรับ ระบบที่ติดตั้งใหม่ ไม่น่าจะมีปัญหามากนัก หากติดตั้งแล้วไม่แสดงผลอย่างที่ควรเป็น ก็ให้ตรวจสอบ collation ของ Database ที่สร้างใหม่ให้ตรงกับที่ต้องการก่อนที่จะทำการติดตั้ง script และก็ให้ทำการเพิ่มคำสั่ง
Code: [Select]
mysql_query("SET NAMES 'charset_name' COLLATE 'collation_name';");เข้าไปก็น่าจะหมดปัญหา

สำหรับ ระบบที่ใช้งานอยู่แล้วไม่มีปัญหาแต่มีปัญหาตอนย้ายโฮส ก็คงต้องหาข้อแตกต่างระหว่าง 2 server ออกมา โดยไล่ดูการตั้งค่าต่างๆของทั้ง 2 server ดังนี้
-- default charset ของ mysql lib
-- default charset ใน my.cnf
-- มีการกำหนด init connect ใน my.cnf หรือไม่
-- php connect ด้วย default charset อะไร
-- Database ที่สร้างไว้มี collation อะไร
-- Table ต่างๆใน database มี charset อะไร สอดคล้องกับ collation หรือไม่
-- ข้อมูลที่เก็บอยู่ใน table เก็บลักษณะใหน charset อะไร แสดงผลถูกต้องหรือไม่ (ทั้ง phpmyadmin และ หน้าเว็บ)
-- หน้าเว็บแสดงผลด้วย encoding อะไร
-- ข้อมูลที่ export ออกมาเป็น .sql export ด้วยวิธีใหน mysqldump, phpmyadmin เวอร์ชั่นอะไร, bigdump, ...
-- ไฟล์ .sql เปิดอ่านด้วย text editor อ่านออกหรือไม่ (แนะนำให้ใช้ notepad++ แล้วลองเปลี่ยน Format / Encoding ดูด้วย)


อ่านเรื่อง charset เพิ่มเติมได้ที่ http://www.thaihosttalk.com/th1/index.php?topic=6764.msg63194#msg63194
บทความที่เกี่ยวข้อง http://www.itwizard.info/technology/MySQL/MySQL_with_thai.html

ชนิด / ขนาด ของข้อมูลใน MySQL

TINYINT ขนาดที่เก็บ 1 ไบต์
UNSIGNED เก็บค่าจำนวนเต็ม 0 ถึง 255
SIGNED เก็บค่าจำนวนเต็ม -128 ถึง 127

SMALLINT ขนาดที่เก็บ 2 ไบต์
UNSIGNED เก็บค่าจำนวนเต็ม 0 ถึง 65535
SIGNED เก็บค่าจำนวนเต็ม -32768 ถึง 32767

MEDIUMINT ขนาดที่เก็บ 3 ไบต์
UNSIGNED เก็บค่าจำนวนเต็ม 0 ถึง 16777215
SIGNED เก็บค่าจำนวนเต็ม -8388608 ถึง 8388607

INT หรือ INTEGER ขนาดที่เก็บ 4 ไบต์
UNSIGNED เก็บค่าจำนวนเต็ม 0 ถึง 4294967295
SIGNED เก็บค่าจำนวนเต็ม -2147483648 ถึง 2147483647

BIGINT หรือ INTEGER ขนาดที่เก็บ 8 ไบต์
UNSIGNED เก็บค่าจำนวนเต็ม 0 ถึง 18446744073709551615
SIGNED เก็บค่าจำนวนเต็ม -9223372036854775808 ถึง 9223372036854775807

(ขนาดที่เก็บของ INTEGER จะแปรตามค่าที่บันทึก)

FLOAT(x) ถ้า 0 <= x <= 24 ขนาดที่เก็บ 4 ไบต์ (ดู FLOAT)
ถ้า 25 <= x <= 53 ขนาดที่เก็บ 8 ไบต์ (ดู DOUBLE)
เก็บค่าจำนวนจริงแบบ IEEE 754

FLOAT ขนาดที่เก็บ 4 ไบต์
เก็บค่าจำนวนจริงแบบ IEEE 754
ตั้งแต่ -3.402823466E+38 ถึง -1.175494351E-38
และ 0
และ 1.175494351E-38 ถึง 3.402823466E+38

DOUBLE หรือ REAL ขนาดที่เก็บ 8 ไบต์
เก็บค่าจำนวนจริงแบบ IEEE 754
ตั้งแต่ -1.7976931348623157E+308 ถึง -2.2250738585072014E-308
และ 0
และ 2.2250738585072014E-308 ถึง 1.7976931348623157E+308

DECIMAL(m,d) หรือ NUMERIC(m,d) ถ้า d = 0 ขนาดที่เก็บคือ m+1 ไบต์ ถ้า d > 0 ขนาดที่เก็บคือ m+2 ไบต์
เก็นค่าเลขทศนิยมแบบระบุจำนวนหลัก m ทุกหลักรวมจุดทศนิยม และ d หลักหลังทศนิยม
เช่นถ้าต้องการเก็บค่าให้ได้มากที่สุดเพียง 9999.99 ให้กำหนดเป็น DECIMAL(7,2)

DATE ขนาดที่เก็บ 3 ไบต์
เก็บค่าวันที่ในรูปแบบ YYYY-MM-DD
โดยมีค่าตั้งแต่ 1000-01-01 ถึง 9999-12-31

DATETIME ขนาดที่เก็บ 8 ไบต์
เก็บค่าวันที่และเวลาในรูปแบบ YYYY-MM-DD HH:mm:SS
โดยมีค่าตั้งแต่ 1000-01-01 00:00:00 ถึง 9999-12-31 23:59:59

TIMESTAMP[(m)] ขนาดที่เก็บ 4 ไบต์
เก็บวันที่และเวลาในรูปแบบ String Timestamp
m = 14 หรือไม่กำหนด -> YYYYMMDDHHmmSS
m = 12 -> YYMMDDHHmmSS
m = 10 -> YYMMDDHHmm
m = 8 -> YYYYMMDD
m = 6 -> YYMMDD
m = 4 -> YYMM
m = 2 -> YY
โดยมีค่าตั้งแต่ 1970-01-01 00:00:00 ถึง 2037

TIME ขนาดที่เก็บ 3 ไบต์
เก็บค่าเวลาในรูปแบบ HH:mm:SS
โดยมีค่าตั้งแต่ 00:00:00 ถึง 23:59:59

YEAR[(2 หรือ 4)] ขนาดที่เก็บ 1 ไบต์
เก็บค่าปี 2 หรือ 4 หลัก
หากระบุเป็น 2 จะเก็บค่า 70 ถึง 69 หมายถึงปี 1970 ถึง 2069
หากระบุเป็น 4 จะเก็บค่า 1901 ถึง 2155
CHAR(m) ขนาดที่เก็บ m ไบต์ แต่ไม่เกิน 255 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือ encoding ที่ใช้อยู่

VARCHAR(m) ขนาดที่เก็บตามข้อมูลจริง มากที่สุด m ไบต์ แต่ไม่เกิน 255 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือ encoding ที่ใช้อยู่

CHAR จะเก็บขนาดตายตัว ส่วน VARCHAR จะเก็บตามขนาดของข้อมูลตัวอักษร

TINYBLOB หรือ TINYTEXT
ขนาดที่เก็บตามข้อมูลจริง +1 ไบต์ แต่ไม่เกิน 255 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือข้อมูล BINARY

BLOB หรือ TEXT
ขนาดที่เก็บตามข้อมูลจริง +2 ไบต์ แต่ไม่เกิน 65535 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือข้อมูล BINARY

MEDIUMBLOB หรือ MEDIUMTEXT
ขนาดที่เก็บตามข้อมูลจริง +3 ไบต์ แต่ไม่เกิน 16777215 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือข้อมูล BINARY

LONGBLOB หรือ LONGTEXT
ขนาดที่เก็บตามข้อมูลจริง +4 ไบต์ แต่ไม่เกิน 4294967295 ไบต์
เก็บค่าอักษรตามรหัส ASCII หรือข้อมูล BINARY

ENUM('value1','value2',...)
ขนาดที่เก็บ 1 หรือ 2 ไบต์ ตามจำนวนค่า value ซึ่งกำหนดได้มากที่สุด 65535 ค่า
เก็บค่าตาม value ที่กำหนด

SET('value1','value2',...)
ขนาดที่เก็บ 1, 2, 3, 4 หรือ 8 ไบต์ ตามจำนวนค่า value ซึ่งกำหนดได้มากที่สุด 64 ค่า
เก็บค่าตาม value ที่กำหนด

ENUM เก็บค่า value เพียงค่าเดียวต่อหนึ่งแถว
ส่วน SET สามารถเก็บ value ได้หลายๆ ค่าต่อหนึ่งแถว 
ตอบคำถาม

QUOTE
1. เป็นตัวอักขระทั่วๆไปความยาวไม่เกิน 255 ตัว

ควรใช้ VARCHAR ถ้าหากความยาวของสายอักขระไม่คงที่
หรือใช้ CHAR ถ้าหากความยาวของสายอักขระคงที่ตายตัว

QUOTE
2. เป็นทั้งตัวอักขระและตัวเลข และมีความยาวมากกว่า 1,000 ตัว

ควรใช้ TEXT, MEDIUMTEXT หรือ LONGTEXT ตามความเป็นไปได้ของความยาวของสายอักขระ

QUOTE
3. เป็นเลขจำนวนเต็ม สามารถคำนวนได้ แต่ไม่สามารถใส่เครื่องหมายจุลภาคได้ เช่น 100000 เป็นต้น

ควรใช้ TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT หรือ INTEGER ตามความเป็นไปได้ของจำนวนที่ใช้

QUOTE
4. เป็นตัวเลขจำนวนเต็ม สามารถคำนวนได้ และใส่เครื่องหมายจุลภาคเก็บเป็นข้อมูลได้ เช่น 100,000 เป็นต้น

ไม่สามารถทำได้ เนื่องจากข้อมูลตัวเลขไม่เก็บเครื่องหมายจุลภาค
ควรเรียกข้อมูลตัวเลขออกมา แล้วนำไปจัดรูปแบบใส่เครื่องหมายจุลภาคเอง

QUOTE
5. เป็นเลขที่มีจุดทศนิยม สามารถคำนวณได้ และใส่เครื่องหมายจุลภาคเก็บเป็นข้อมูลได้ เช่น 1,000.50 เป็นต้น

ควรใช้ FLOAT, DOUBLE หรือ REAL หากไม่ต้องการสนใจเรื่องจำนวนตำแหน่งทศนิยม
หรือใช้ DECIMAL หรือ NUMERIC หากต้องการระบุจำนวนหลักทั้งหน้าและหลังจุดทศนิยม
ส่วนเรื่องเครื่องหมายจุลภาคบอกแล้วในข้อ 4

QUOTE
ส่วนอีกคำถามนึงก็คือ ช่อง แอตทริบิวต์ ที่มีตัว binary, unsigned, unsigned zerofill ให้เลือก ไว้ทำอะไรเหรอครับ

BINARY เป็นตัวบ่งบอกว่าข้อมูลที่อยู่ภายในเป็นแบบ binary มนุษย์ไม่สามารถอ่านได้
UNSIGNED เป็นตัวบ่งบอกว่าข้อมูลตัวเลขจะเก็บเพียงค่าบวกและศูนย์
UNSIGNED ZEROFILL เหมือน UNSIGNED แต่จะเติม 0 ลงไปให้เต็มในหลักที่เหลืออยู่ทางซ้าย 


วิธีใส่ลูกน้ำให้กับตัวเลขใน php ทำง่ายๆ แค่ใช้ฟังก์ชั่น number_format() คืนค่าเป็น string
เมื่อเรารับค่าออกมาจาก mysql แล้วเอาฟังก์ชั่นนี้ไปใช้จะสะดวกมากขึ้น
CODE
$num = 1234.56;
echo number_format($num);
// 1,235
echo number_format($num, 2);
// 1,234.56


--------------------------------------------------------------------------------------------------------

การเพิ่มข้อมูลไบนารีเช่นรูปภาพลงใน mysql ควรใช้คำสั่ง addslashes() ลงไปด้วย
ให้สัญลักษณ์พิเศษที่มีอยู่ถูก escape เสียก่อน เพื่อไม่ให้ sql syntax ผิดพลาด
CODE
$image = get_file_contents("pic.jpg");
$image = addslashes($image);
$sql = "INSERT INTO sometable( im ) VALUES ( '$image' )";

วันพฤหัสบดีที่ 15 สิงหาคม พ.ศ. 2556

ereg() eregi() php function

ereg() เป็นฟังชั่นที่ใช้ตรวจสอบอักขระหรือคำ โดยให้ความสำคัญกับตัวอักษรตัวพิมพ์เล็กและตัวอักษรพิมพ์ใหญ่ 

รูปแบบการใช้งานฟังชั่น ereg()
อ้างถึง
ereg(string pattern,string master,array regs)

string pattern คือ เงื่อนไขที่กำหนดในการตรวจสอบสตริง
string master คือ ชุดสตริงต้นฉบับที่ต้องการตรวจสอบ
array regs คือ กำหนดชื่อตัวแปรอาเรย์ที่ต้องการให้เก็บค่าตัวอักขระเมื่อมีค่าเป็นจริง จะกำหนดหรือไม่ก็ได้

ตัวอย่างที่ 1 การใช้ฟังชั่น ereg()
โค๊ด:
<?
$word = array("sitting","swimming","walk","coming","put");
for($i=0;i<count($word);$i++)
{
       if(ereg("ing$",$word[$i]))
         echo $word[$i] . "<br>"
/*
ผลลัพธ์ที่ได้คือ
sitting
swimming
coming
*/
}
?>

pattern ที่ได้กำหนดไว้คือ ing$ หมายความว่าให้ตรวจสอบสตริงที่ลงท้ายด้วยคำว่า ing ถ้าผลการตรวจสอบพบคำว่า ing ฟังชั่น ereg() จะคืนค่าเป็นจริงกลับมาให้ และถ้าไม่พบจะคืนค่าเท็จ 

ตัวอย่างที่ 2 การใช้ฟังชั่น ereg()
โค๊ด:
<?
$date = "2009-10-03";
if(ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$date,$time))
{
      echo "รูปแบบวันที่เดิม $date <br>";
      echo "รูปแบบวันที่ใหม่ $time[2]/$time[1]/$time[0]"
}
else
{
     echo "รูปแบบวันที่ไม่ถูกต้อง";
}
/*
ผลลัพธ์คือ
รูปแบบวันที่เดิม 2009-10-03
รูปแบบวันที่ใหม่ 03/10/2009
*/
?>
จากตัวอย่างกำหนด pattern เป็น ([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ซึ่งมีความหมายดังนี้
([0-9]{4}) คือ ต้องเป็นตัวเลขและมีจำนวน 4 ตัวเท่านั้น
([0-9]{1,2}) คือ ต้องเป็นตัวเลข และ มีน้อยสุด 1 ตัว และมากสุด 2 ตัว
ส่วนเครื่องหมาย - (ขีดกลาง) ใช้เพื่อใช้คั่นระหว่าง pattern แต่ละตัว เพื่อตรวจสอบรูปแบบข้อมูลวันที่ว่าตรงตามแบบ YYYY-MM-DD หรือไม่ 
$time เป็นตัวแปร์อาเรย์เก็บค่าของแต่ละ pattern ไว้เรียกใช้โดยเรียงลำดับดังนี้ $time[0] $time[1] $time[2]

ตัวอย่างที่ 3 การใช้ฟังชั่น ereg()
โค๊ด:
<?
$domain = "datatan.net";
if(ereg("\.com|\.net|\.org",$domain,$dot))
    echo "ชื่อโดเมน $domain มีนามสกุลเป็น $dot[0]"
/*
ผลลัพธ์ที่ได้คือ
ชื่อโดเมน datatan.net มีนามสกุลเป็น .net
*/
?>
จากตัวอย่าง pattern คือ \.com|\.net|\.org หมายความว่าให้ตรวจสอบชุดสตริงที่มีคำว่า .com .net .org ตัวใดตัวหนึ่งอยู่หรือไม่
การตรวจสอบอักขระจุด . จะต้องมีเครื่องหมาย \ วางข้างหน้า เพื่อให้รู้ว่าเป็นอักขระไม่ใช่สัญลักณ์ใดๆ  


หมายเหตุ: ฟังชั่น ereg() จะให้ความสำคัญกับอักษรตัวใหญ่และตัวเล็ก ถ้าไม่ต้องการให้ความสำคัญกับอักษรตัวเล็กตัวใหญ่ให้ใช้งานฟังชั่น eregi() ซึ่งมีรูปแบบการใช้งานเหมือนกับฟังชั่น ereg()


http://forum.datatan.net/index.php/topic,591.0.html



วันพุธที่ 14 สิงหาคม พ.ศ. 2556

reset AUTO_INCREMENT (นับ id ใหม่ หรือ นับ id ต่อ โดยไม่กระโดดข้าม )

สมมติตารางคุณมี id ตั้งแต่ 1 ถึง 4 แต่พอลบตัว id=4 ทิ้ง ก็ให้สั่ง

sql  " ALTER TABLE NAMETABLE AUTO_INCREMENT=1 "

EX.
id  1,2,3,4,5,6,10 >> sql >> delete id  3 >> Insert 1 >> 1,2,4,5,6,10,11

EX.
id  1,2,3,4,5,6,10 >> sql >> delete id 10 >> Insert 1 >> 1,2,3,4,5,6,10

จะเป้นการกำหนด AUTO_INCREMENT เริ่มต้นที่ 1 ใหม่ จากนั้นหากคุณเพิ่มเข้า แถว ใหม่เข้าไปอีก id จะไปนับตัวสุดท้ายที่มีอยู่ที่ 3 และถัดไปจะเป็น 4 กล่าวคือ สั่ง SQL ข้างต้นทุกครั้ง ที่มีการสั่งลบแถวสุดท้ายออกไป


###############################################
reset AUTO_INCREMENT

คือ ลบ culumn id ทิ้งไป แล้วจากนั้นก็เพิ่ม column id เข้าไปใหม่ เป็นแบบ
auto_increment primary key นั่นก็คือ

step 1
ALTER IGNORE TABLE NAMETABLE DROP id;
id  1,2,3,4,5,6,10 >> delete field id
step 2
ALTER TABLEชื่อตาราง ADD id INT( 30 ) UNSIGNED AUTO_INCREMENT PRIMARY KEY FIRST;
sql >> id  1,2,3,4,5,6,7



 แต่ว่า ปกติไม่แนะนำให้ทำครับ ถ้าเกิด id ไป relative กับ table อื่นจะมั่วได้ แม้ในการใช้งานจริง สุดท้าย id มันอาจจะไม่เรียงต่อเนื่องสวยสักหน่อย แต่ user ก็ไม่ได้มาสนใจอะไรนักแล้ว ยกเว้นว่า id นั้น จะเป็น line_id เฉพาะตารางนั้นๆ ไม่เกี่ยวข้องกับตารางภายนอก