แสดงบทความที่มีป้ายกำกับ programing แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ programing แสดงบทความทั้งหมด

วันศุกร์ที่ 13 กันยายน พ.ศ. 2556

วิธีแก้ปัญหา error MySQL server on ‘localhost’ (10048)

วิธีแก้ปัญหา error MySQL server on ‘localhost’ (10048)


ปัญหาเกิดจากการที่ port ที่เปิดอยู่ไม่เพียงพอต่อการใช้งาน จึงเกิดการชนกันของข้อมูล วิธีแก้ปัญหามีดังนี้
1. start -> run -> regedit.exe -> click OK.
2. หาคำว่า subkey:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters แล้วคลิ๊กเพื่อเลือก
3. เลือก Edit -> New หลังจากนั้นคลิ๊กเลือก DWORD 
4.พิมพ์ MaxUserPort หลังจากนั้นกด ENTER
5. ดับเบิลคลิก MaxUserPort , and tหลังจากนั้นใส่ค่าที่ต้องการซึ่งมีสองค่า คือ ฐานสิบ กับ ฐานสิบหก
ให้แก้ตัวเลขเป็น 500065534 (ฐานสิบ). 
6. Click OK.
7. Quit Registry Editor.

สร้าง index ในฐานข้อมูล MySQL

จากที่ตั้งใจไว้ตั้งแต่แรกคือเมื่อเจอประสบการณ์ทำงานอะไร ที่น่าจะเป็นประโยชน์แก่ผู้อื่น จะนำมาเขียนเล่าสูกันฟัง วันนี้ขอแนะนำการเพิ่มความเร็วในการค้นหาข้อมูลจากฐานข้อมูล MySQL เพียงแค่พิมพ์คำสั่งเดียวเท่านั้น เพื่อสร้าง index ของฟิลด์ที่ใช้ในการค้นหา
คำเตือน! การทดสอบแนะนำให้ทำบนเครื่องทดลองเท่านั้น เมื่อได้ผลลัพธ์ที่ต้องการแล้ว ค่อยไปปรับใช้กับเครื่องจริง
ฐานข้อมูลที่ทดลองปรับปรุง ใช้เก็บข้อมูลสินค้าของบริษัท ปัญหาที่พบคือเวลาค้นหาชื่อสินค้าโดยพิมพ์ชื่อแล้วกดค้นหา ต้องรอสักพักกว่าจะขึ้น ทั้งๆ ที่มีจำนวน record ประมาณ 60,000 แถว เท่านั้น เมื่อตรวจสอบรายละเอียดของ table แล้ว จะเป็นประมาณนี้
CREATE TABLE `items` (
  `item_id`       int(10) unsigned NOT NULL auto_increment,
  `item_name`     varchar(255) default NULL,
  `item_descr`    varchar(255) default NULL,
  `item_barcode`  varchar(255) default NULL,
  `item_total`    int(11) default '0',
  `item_status`   char(1) default NULL,
  PRIMARY KEY  (`item_id`)
);
เมื่อทดสอบการค้นหาข้อมูล โดยใช้คำสั่ง SELECT จะได้ผลลัพธ์ดังนี้
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+
| item_id | item_name            |
+---------+----------------------+
|   22434 | PNGS932A-31          |
+---------+----------------------+
1 row in set (0.17 sec)
จากตัวอย่าง ใช้เวลาในการค้นหา 0.17 วินาที
เพื่อเพิ่มความเร็วในการค้นหาฟิลด์ที่ใช้งานบ่อยๆ แนะนำให้ทำ index หรือ key กับฟิลด์นั้นๆ วิธีการคือใช้คำสั่ง ALTER TABLE ตามตัวอย่างดังนี้
mysql> ALTER TABLE items ADD KEY (item_name);
Query OK, 57625 rows affected (1.34 sec)
Records: 57625  Duplicates: 0  Warnings: 0
แล้วทดลองค้นหาโดยใช้คำสั่ง SELECT อีกครั้งหนึ่ง เพื่อเปรียบเทียบ
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+
| item_id | item_name            |
+---------+----------------------+
|   22434 | PNGS932A-31          |
+---------+----------------------+
1 row in set (0.01 sec)
ผลลัพธ์ที่ได้ จะใช้เวลาแค่ 0.01 วินาที เท่านั้น ซึ่งเร็วกว่ามาก เมื่อเปรียบเทียบกับการไม่สร้าง index
ทดสอบเอา index ออกอีกครั้ง แล้วทดสอบ SELECT อีกที ผลลัพธ์จะกลับมาช้าเหมือนเดิม
ตัวอย่างการเอา index ออกจากฟิลด์ item_name
mysql> ALTER TABLE items DROP KEY item_descr;
Query OK, 57625 rows affected (0.70 sec)
Records: 57625  Duplicates: 0  Warnings: 0
mysql> SELECT item_id,item_name FROM items WHERE item_name='PNGS932A-31';
+---------+----------------------+
| item_id | item_name            |
+---------+----------------------+
|   22434 | PNGS932A-31          |
+---------+----------------------+
1 row in set (0.17 sec)
คำแนะนำ
  • ทำ index กับฟิลด์ที่ใช้ค้นหาบ่อยๆ หรือใช้เป็นเงื่อนไขการ JOIN TABLE
  • ไม่จำเป็นเสมอไป หลังจากทำ index แล้วจะเร็วขึ้น ขึ้นอยู่กับการออกแบบฐานข้อมูลและคำสั่งที่ใช้ค้นหาด้วย
  • หากต้องการข้อมูลเพิ่มเติม แนะนำให้ดูจากข้อมูลอ้างอิง
ข้อมูลอ้างอิง

การสร้าง FOREIGN KEY Constraints ใน MySQL

 การสร้าง FOREIGN KEY Constraints ใน MySQL
Saturday 23 January 2010 @ 4:22 pm
ส่วนใหญ่แล้วการออกแบบฐานข้อมูลจะมีการใช้บางฟิลด์ข้อมูล เพื่อเชื่อมโยงความสัมพันธ์ระหว่าง table ทำให้ต้องมีการคำนึงถึงเวลา เพิ่ม แก้ไข หรือ ลบฟิลด์ที่ใช้เชื่อมนั้น ไม่เช่นนั้นข้อมูลในฐานข้อมูลอาจมีปัญหาได้
MySQL สนับสนุนคุณสมบัติการใช้ FOREIGN KEY Constraints เพื่อแก้ไขปัญหานี้ได้ แต่ต้องใช้ table เป็นแบบ InnoDB ในบทความนี้ขออธิบายปัญหาที่เกิดขึ้น พร้อมยกตัวอย่างวิธีการใช้ FOREIGN KEY Constraints เพื่อป้องกันปัญหาได้
ตัวอย่างเช่น ต้องการสร้างฐานข้อมูลสำหรับเก็บชื่อ users และแต่ละคนเป็นสมาชิกได้ 1 กลุ่มจากตาราง groups เริ่มต้นออกแบบ table ง่ายๆ ได้ดังนี้
mysql> CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
);
mysql> CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id)
);
ใส่ข้อมูลทดสอบดังนี้
mysql> INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');
mysql> INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');
จากฐานข้อมูลตัวอย่าง เราใช้ฟิลด์ group_id ในการเชื่อมโยงความสัมพันธ์ระหว่าง groups และ users เพื่อระบุว่า แต่ละ users อยู่ใน group ใด
หากมีการแก้ไขข้อมูล เช่นต้องการลบ (DELETE) ข้อมูล group ที่ชื่อ ‘IT’ ออกจากฐานข้อมูล หากไม่มีวิธีการตรวจสอบ ไปลบแค่จากตาราง ‘groups’ จะทำให้ ข้อมูลของ ‘Mr.D’ ในตาราง ‘users’ มีปัญหาทันที เพราะไม่สามารถอ้างอิงกลับมายังชื่อ group ได้
โดยดีฟอลต์ การสร้าง table ใน MySQL หากไม่มีการระบุชนิด ในคำสั่ง ‘CREATE TABLE’ ตารางที่สร้างได้จะเป็นแบบ MyISAM ซึ่งไม่สามารถสร้าง FOREIGN KEY ได้
สามารถใช้คำสั่ง ‘SHOW ENGINES’ ใน mysql เพื่อตรวจสอบชนิดของ table ที่สร้างได้
mysql> SHOW ENGINES;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO      | Clustered, fault-tolerant tables                           | NULL         | NULL | NULL       |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
ถ้าจะใช้ FOREIGN KEY ได้นั้น table ที่มีการอ้างอิงกันทั้งหมด ต้องเป็นชนิด InnoDB คือต้องระบุออปชั่น ENGINE=InnoDB เวลาสร้าง table
เมื่อสร้างเป็น InnoDB แล้ว ระบุฟิลด์ที่ต้องการตรวจสอบ constraints ใน table ที่ใช้อ้างอิงไปยัง table อื่น
เช่นในที่นี้เราต้องการให้ table ‘users’ ใช้ฟิลด์ชื่อ group_id เพื่ออ้างอิงไปยัง table ‘groups’ เราต้องระบุ FOREIGN KEY ใน table ‘users’
วิธีการระบุการอ้างอิง FOREIGN KEY ฟิลด์ ‘group_id’ จาก table ‘groups’
FOREIGN KEY (group_id) REFERENCES groups(group_id)
วิธีการเปลี่ยน table จาก MyISAM ให้เป็น InnoDB และเพิ่ม FOREIGN KEY ทำได้ 2 วิธี
 1. ใช้คำสั่ง ‘ALTER TABLE’ เพื่อแก้ไข
 2. ใช้คำสั่ง ‘DROP TABLE’ ทิ้งไปแล้วสร้างใหม่ แต่ข้อมูลที่มีอยู่จะหายหมด

ใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิดเป็น InnoDB

เราสามารถใช้คำสั่ง ‘ALTER TABLE’ เพื่อเปลี่ยนชนิดของ table หรือแก้ไขฟิลด์ต่างๆ ได้
การใช้คำสั่ง ALTER TABLE เพื่อเปลี่ยนชนิด table เป็นแบบ InnoDB
mysql> ALTER TABLE groups ENGINE=InnoDB;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> ALTER TABLE users ENGINE=InnoDB;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0
เพิ่ม FOREIGN KEY ใน table ‘users’
mysql> ALTER TABLE `users` ADD FOREIGN KEY (group_id) REFERENCES groups(group_id);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0
หมายเหตุ ต้องดูผลลัพธ์การใช้คำสั่ง ALTER TABLE ด้วย ว่าการเปลี่ยนแปลง table สำเร็จหรือไม่

ลบแล้วสร้าง TABLE ใหม่แบบ InnoDB และใช้ FOREIGN KEY

ใช้คำสั่ง DROP TABLE เพื่อลบ table ‘users’
mysql> DROP TABLE users;
mysql> DROP TABLE groups;
ใช้คำสั่ง CREATE TABLE เพื่อสร้าง table ใหม่ แล้ว ใส่ข้อมูลลงไปเหมือนเดิม
mysql> CREATE TABLE groups (
 group_id     INT UNSIGNED NOT NULL,
 group_name   VARCHAR(255),
 PRIMARY KEY    (group_id)
) ENGINE=InnoDB;
mysql> INSERT INTO groups (group_id, group_name) VALUES
 (101, 'Accounting'),
 (102, 'Engineer'),
 (103, 'IT'),
 (104, 'Manager');
mysql> CREATE TABLE users (
 user_id      INT UNSIGNED NOT NULL,
 group_id     INT UNSIGNED NOT NULL,
 user_name    VARCHAR(255),
 PRIMARY KEY    (user_id),
 FOREIGN KEY (group_id) REFERENCES groups(group_id)
) ENGINE=InnoDB;
mysql> INSERT INTO users (user_id, group_id, user_name) VALUES
 (501, 101, 'Ms.A'),
 (502, 102, 'Ms.B'),
 (503, 102, 'Mr.C'),
 (504, 103, 'Mr.D'),
 (505, 104, 'Mr.E');
สังเกตสิ่งที่เพิ่มขึ้น

ข้อมูลอ้างอิง

วันจันทร์ที่ 9 กันยายน พ.ศ. 2556

10 หนทางในการทำเว็บสู่มาตรฐาน (ตอนที่ 2)

6. ใช้ HTML ให้ถูกต้อง
อักขระบางตัวเป็นอักขระที่ใช้ในโค้ดของ HTML เราไม่สามารถใช้มันภายในข้อความได้ เช่น & " < และ > แต่เราสามารถเปลี่ยนแปลงมันให้เป็น รหัสข้อความ เพื่อที่จะสามารถแสดงผลอย่างถูกต้องได้

    * & ให้ใช้ &amp; แทน
    * " ให้ใช้ &quote; แทน
    * < ให้ใช้ &lt; แทน
    * > ให้ใช้ &gt; แทน
    * ตัวอักษรอื่นๆ

โค๊ด:
<a href="http://www.example.com?page=1&amp;view=top">A &quot;Cool&quot; Link</a>
<code>&lt;div id=&quot;content&quot;&gt;Test information.&lt;/div&gt;</code>

7. ใช้ Tags และ Attributes เป็นตัวอักษรตัวพิมพ์เล็ก
tag และ attribute ต่างๆ รวมถึง event ต้องกำหนดให้เป็น ตัวอักษรตัวพิมพ์เล็กเท่านั้น เช่น <html> <table cellpadding="0"> <body onload="alert('xxx')">

โค๊ด:
<A href="#" onClick="doSomething();">Send us a message</A>
// ด้านบนเป็นโค้ดที่ไม่ถูกต้อง ชื่อ tag และ event ประกอบด้วยตัวอักษรตัวพิมพใหญ่

โค๊ด:
<a href="#" onclick="doSomething();">Send us a message</a>
// โค้ดที่แก้ไขแล้ว โดยเปลี่ยนเป็นตัวอักษรตัวพิมพ์เล็กทั้งหมด (ยกเว้น ภายใน Value และส่วนข้อความ)

8. ใช้ label ภายในฟอร์ม
element ต่างๆที่ต้องการการกรอกข้อมูลภายในฟอร์ม ต้องมีการกำหนดป้ายกำกับ หรือ label ที่สัมพันธ์กันไว้เสมอ ซึ่งป้ายกำกับนี้จะถูกใช้ในการอธิบายความหมายของสิ่งที่ต้องกรอกของเครื่อง อ่านสำหรับผู้พิการทางสายตา

    * กำหนด label ให้กับทุก element ที่ต้องกรอก และมองเห็นได้ภายในฟอร์ม (ยกเว้น input แบบ hidden)
    * กำหนด Attribute for ให้กับ label โดยสัมพันธ์กันกับ id ของ Element ที่ต้องกรอก

โค๊ด:
<p><label for="searchbox">Search: </label><input type="text" id="searchbox" /></p>
<p><input type="checkbox" id="remember" /><label for="remember"> Remember</label></p>

9. กำหนด alt ให้กับรูปภาพเสมอ
alt สำหรับใช้เป็นคำอธิบายที่เกี่ยวกับรูปภาพ และจะถูกใช้แสดงแทนเมื่อไม่สามารถแสดงรูปภาพได้ เราจำเป็นต้องการหนด alt โดยใช้ข้อความเพื่ออธิบายความหมายของรูปภาพ ไม่ควรปล่อยว่างไว้ และนอกจากนี้ เราควรกำหนด width และ height ที่ถูกต้องให้กับรูปภาพลงไปด้วย
ไม่ถูกต้อง :
โค๊ด:
<img src="picture.png" />
<img src="spacer.gif" alt="" />

ที่ถูกต้อง :
โค๊ด:
<img src="picture.png" alt="A warm sunset" width="450" height="350" />

10. ใช้ id และ class ให้ถูกต้อง
คุณสามารถกำหนดชื่อให้กับ id ได้เพียง tag เดียว ตลอดหน้าเพจ แต่สามารถกำหนด ค่าให้กับ class ในชื่อเดียวกันได้หลายๆครั้ง ตลอดทั้งหน้า

    * id มักจะถูกใช้ โดย Javascript ดังนั้นเราควรกำหนด id เพียงหนึ่งเดียวบนหน้าเพจ เนื่องจาก หากมี id มากกว่าหนึ่ง javascript จะแสดงข้อความผิดพลาดได้
    * class เราสามารถใช้ในการกำหนด style ให้ element นั้นๆได้ โดยที่ element ใดที่มีชื่อ class เดียวกันก็จะแสดงผลเหมือนๆกันตลอดทั้งหน้าเพจ

ไม่ถูกต้อง :
โค๊ด:
<p id="leftNav">Home</p>
<p id="leftNav">Contact</p>

ที่ถูกต้อง :
โค๊ด:
<p id="homeNav" class="leftNav">Home</p>
<p id="contactNav" class="leftNav">Contact</p>

บทสรุป เราสามารถตรวจสอบความถูกต้องของเว็บเพจเราได้ที่นี่

   http://validator.w3.org/
   http://jigsaw.w3.org/css-validator/
   http://www.cynthiasays.com/
   http://fae.cita.uiuc.edu/

ขอบคุณข้อมูลจาก : http://www.goragod.com/


10 หนทางในการทำเว็บสู่มาตรฐาน (ตอนที่ 1)


เว็บมาตรฐานคืออะำไร ทำไมเราต้องทำเว็บสู่ความเป็นมาตรฐาน 

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

เว็บมาตรฐานมีประโยชน์อย่างไร

หลักการของการทำให้เป็นมาตรฐานก็คือการทำให้เว็บเราสามารถเปิดดูได้โดยไม่แตกต่างกันในแต่ละบราวเซอร์ ถึงแม้ว่าบราวเซอร์แต่ละตัวจะถูกออกแบบมาแตกต่างกัน โดยทั่วๆไปถึงแม้ว่าในปัจจุบันเว็บบราวเซอร์ยี่ห้อต่างๆอาจจะยังไม่ได้ก้าวเข้าสู่มาตรฐานเว็บมากนัก แต่แนวโน้มในอนาคต บราวเซอร์ต่างๆก็จะต้องก้าวเข้าสู่มาตรฐานอย่างแน่นอน ในเมื่อบราวเซอร์ต่างๆยังต้องก้าวเข้าสู่ความเป็นมาตรฐาน แล้วทำไมเราไม่ทำเว็บของเราให้มันเป็นมาตรฐานไปซะเลย เพื่อรองรับอนาคต(อันใกล้)

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

นอกจากนี้ประโยชน์ของเว็บมาตรฐานอีกอย่าง ก็คือ ผลทางด้าน SEO เนื่องจาก "แมงมุง" ของ SEO ค่ายต่างๆจะทำงานได้ง่ายกว่า หากมันสามารถเลือกรูปแบบที่เป็นมาตรฐานได้ ผมยกตัวอย่างนะครับ เราสามารถกำหนดหัวข้อของเว็บได้หลายลักษณะ โดยอาจใช้ <p class="logo">Web Title</p> หรือ <p class="header">Web Title</p> คำถามก็คือ "แมงมุม" จะรู้ได้ไงว่าอันไหนคือ "หัวข้อ" แต่หากเราออกแบบตามมาตรฐานเช่น <h1>Web Title</h1> "แมงมุม" ก็จะรู้ได้ทันทีว่านี่คือ "หัวข้อ" เนื่องจากมันก็จะเป็นมาตรฐานเดียวกันในทุกๆเว็บ

ต่อไปนี้จะเป็น 10 หนทางในการทำเว็บสู่ความเป็นมาตรฐาน

1. กำหนด DOCTYPE ให้ถูกต้อง
เพราะว่า DOCTYPE จะเป็นตัวบอกให้ Browser เลือกวิธีการจัดการแสดงผลที่ถูกต้องของเว็บเพจ การกำหนด DOCTYPE ที่ถูกต้องได้แก่

XHTML 1.1
เป็นการกำหนดให้เว็บของเรา "สะอาด" สุดๆ โดยไม่มีการกำหนด style ใดๆบนเว็บเพจ โดยให้ทำการกำหนด style ต่างๆไว้ใน CSS ภายนอกแทน และต้องกำหนดชนิดเอกสาร เป็น XML ด้วย
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

หมายเหตุ XHTML 1.1 ไม่รองรับใน IE ที่ต่ำกว่า 6 นะครับ

XHTML 1.0 Strict
คล้ายๆกับ XHTML 1.1 แหละครับ เพียงแต่ไม่ต้องกำหนดชนิดเอกสารเป็น XML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


XHTML 1.0 Transitional
แบบนี้ สามารถกำหนด CSS แบบ inline ในเว็บเพจได้ ทำให้สามารถรองรับได้ใน Browser ที่ไม่ได้เป็นมาตรฐานเช่น IE6
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


XHTML 1.0 Frameset
ชิ่ือก็บอกอยู่แล้วว่าใช้ร่วมกับ frame ครับ
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

2. กําหนด Namespace และภาษาเริ่มต้น
Namespace ใช้เพื่อบอกภาษาเริ่มต้นของเว็บไซต์ ซึ่งมีประโยชน์ในการกำหนดการอ่านเว็บโดยใช้เครื่องอ่านหรือการแสดงผลแบบอื่นๆนอกจากการมองเห็นโดยบราวเซอร์ เพื่อการอ่านได้ถูกต้อง

XHTML 1.1
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
XHTML 1.0
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
3. กำหนด META Tags
meta tag สามารถใช้ระบุค่าหลายๆอย่างเกี่ยวกับเว็บเพจเช่น
http-equiv เป็น meta tag ที่สำคัญที่สุด ใช้ร่วมกับ DOCTYPE เพื่อกำหนดการแสดงผลหน้าเพจของคุณได้อย่างถูกต้อง
language เป็นองค์ประกอบสำคัญสำหรับ XML หากคุณใช้ XHTML 1.1 บนภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ
description และ keywords ใช้เพื่อระบุรายละเอียดย่อเกี่ยวกับเพจหรือเว็บไซต์นั้นๆ
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="language" content="en" />
<meta name="description" content="Updating Windows using Microsoft Update" />
<meta name="keywords" content="updating, windows, microsoft, update, techworld" />

คุณต้องระบุ meta tag ไว้ภายใน element <head> ของเว็บไซต์ และระบุ language และ charset ของ http-equiv รวมถึง การกำหนดการเข้ารหัสของ XML ใน XHTML 1.1 ให้สอดคล้องกันด้วย

4. มีการระบุ title และ heading
เราสามารถแบ่งเพจออกเป็นส่วนต่าง ๆ แล้วใช้ <h1> ถีง <h6> เพื่อเป็นคำอธิบายของส่วนย่อยต่างๆแต่ละส่วน

เราควรจะบุหน้าเพจด้วย title โดยการกำหนด tag <title> เพียง tag เดียวภายใน <head> ต่อ 1 หน้า
<title>Smashing Magazine</title>
ใช้ <h1> ภายในเนื่อหาของเพจ ที่สอดคล้องกับ <title> และมีเพียงหนึ่งเดียว บนหน้าเพจเช่นกัน
<h1>Smashing Magazine: We smash you with the information that makes your </h1>
ภายใน tag เช่น <h1> ถึง <h6> หากมีองค์ประกอบเป็นรูปภาพเพียงอย่างเดียว คุณจะต้องระบุข้อความ เพื่อให้ reader อ่านแทน (เนื่องจาก reader ไม่สามารถทำความเข้าใจกับรูปภาพได้) นอกจากการระบุภายใน alt ของรูปภาพนั้นๆแล้ว
การระบุที่ไม่ถูกต้อง :

<h2><img src="logo.png" alt="Smashing Magazine" /></h2>

การระบุที่ถูกต้อง :

<h2><img src="logo.png" alt="Smashing Magazine" />Smashing Magazine</h2>

5. ใช้งาน Javascript อย่างถูกต้อง
หากคุณมีการใช้งาน Javascript ภายในเว็บเพจ คุณควรกำหนดข้อมูลภายใน <script> ให้ถูกต้อง

เนื่องจากข้อความภายใน <script> ของ HTML ถูกมองว่าเป็น CDATA (character data) แต่บน XHTML ถูกมองเป็น PCDATA (parsed character data) ซึ่ง PCDATA จะถูกประมวลผลโดย W3C validator ดังนั้น เราจึงควรกำหนดชนิดของข้อความภายใน <script> ให้เป็น CDATA  ให้ถูกต้อง, นอกจากนี้ในเครื่องช่วยในการอ่านเว็บเพจ อาจทำงานผิดพลาดได้ หากการกำหนดชนิดของข้อมูลภายใน <script> ไม่ถูกต้อง
<script type="text/javascript">
   //<![CDATA[
   $(function() {
     $('#divone').tipsy({fade: true, gravity: 'n'});
     $('#divtwo').tipsy({fade: true, gravity: 'n'});
   });
   //]]>
</script>


credit: http://www.goragod.com/knowledge/%E0%B8%97%E0%B8%B3%E0%B9%84%E0%B8%87%E0%B9%83%E0%B8%AB%E0%B9%89%E0%B8%9C%E0%B9%88%E0%B8%B2%E0%B8%99%E0%B8%95%E0%B8%B2%E0%B8%A1%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%81%E0%B8%B3%E0%B8%AB%E0%B8%99%E0%B8%94%E0%B8%82%E0%B8%AD%E0%B8%87%20W3C.html#module=knowledge-10_หนทางในการทำเว็บสู่มาตรฐาน_(ตอนที่_1)&page=1