ตอน : มาสร้าง Guest Book ด้วยไพธอนและ MySQL กันดีกว่า !!
สวัสดีครับ ตอนเช้าตรู่วันศุกร์ ..
วันนี้ผมอยากชวนเพื่อน ๆ มาสร้าง Guest book ด้วยภาษาไพธอนกัน
ซึ่งเขียนเป็น CGI Script แบบง่าย ๆ พอได้เป็นไอเดียกันเพื่อพัฒนาต่อไปครับ !!
ก่อนอื่นเพื่อน ๆ ต้องทำตามเงื่อนไขต่อไปนี้ครับ !!
1. ติดตั้ง Web Server แนะนำเป็น Apache จะดีมากครับ
2. ติดตั้ง MySQL
3. ติดตั้งโมดูลอินเตอร์เฟสระหว่าง Python และ Mysql
ขั้นตอนคร่าว ๆ คือ
ต้องมีฐานข้อมูลภายใน MySQL ซึ่งผมสร้างไว้ด้วยโค๊ดดังนี้ครับ !!
create database guestbook;
use guestbook;
create table tb(ucontent varchar(255), uname varchar(200));
จากนั้นเขียนสคริปต์ CGi ดังนี้ครับ !!
#!/dev/python23/python
print "Content-type: text/htmln"
import MySQLdb,cgi
def putThaiMeta():
return """< head >< STYLE >H1 {
FONT-FAMILY: Tahoma, "MS Sans Serif", sans-serif; FONT-SIZE: 12pt; FONT-WEIGHT: normal}
TD {FONT-FAMILY: Tahoma, "MS Sans Serif", sans-serif; FONT-SIZE: 11pt; FONT-STYLE: normal; FONT-WEIGHT: normal}
BODY {FONT-FAMILY: Tahoma,"MS Sans Serif", sans-serif; FONT-SIZE: 11pt; FONT-STYLE: normal; FONT-WEIGHT: normal}
< /STYLE >
< META http-equiv="Content-Type" content="text/html; charset=TIS-620" >< /head >"""
def update(ucontent,uname):
conn = MySQLdb.connect("localhost","root","1234","guestbook")
cursor = conn.cursor()
sql = "insert into tb values('%s','%s')"%(ucontent,uname)
cursor.execute(sql)
cursor.close()
conn.close()
def view():
conn = MySQLdb.connect("localhost","root","1234","guestbook")
cursor = conn.cursor()
cursor.execute("select * from tb_guestbook")
rows = cursor.fetchall()
cursor.close()
conn.close()
print "< html >%s< body >"%(putThaiMeta())
for i in range(len(rows)):
print rows[i][0],rows[i][1], '
'
def printform():
print '''< form name="form1" method="post" action="guestbook.cgi" >< input type="text" name="ucontent" >< input type="text" name="uname" >
< input type="submit" name="Submit" value="Submit" >< /form >'''
form = cgi.FieldStorage()
if len(form)==0:
view()
printform()
else:
update(form['ucontent'].value,form['uname'].value)
view()
printform()
print "</body></html>"
หลักการทำงานอธิบายได้ดังนี้ครับ
- บรรทัดบนสุดบอกไดเร็คทอรี่ที่ตั้งของไฟล์ python.exe ที่ได้ติดตั้งในระบบปฏิบัติการเรียบร้อยแล้ว
- บรรทัดสอง เขียนส่วนหัวของ HTML content (เป็นกฎกติกาข้อตกลงของ w3c ครับ)
- ฟังก์ชั่นที่ทำงานมีทั้งหมด 4 ฟังก์ชั่น ได้แก่
putThaiMeta() อันนี้เป็นสไตล์ชีตส่วย ๆ ช่วยให้ใช้ฟอนต์อ่านสบายตา (ผมใช้ tahoma)
update(ucontent,uname) ฟังก์ชั่นนี้สำหรับอัพเดทข้อมูลจากฟอร์มใส่ลงไปในฐานข้อมูล MySQL ต้องการอาร์กิวเมนต์สองตัว คือ ข้อความและชื่อที่ผู้ใช้งานป้อนเข้ามา
view() ฟังก์ชั่นนี้ใช้แสดงข้อมูลภายในฐานข้อมูลของเรา !!
printform() เป็นฟังก์ชั่นให้แสดงฟอร์มให้ปรากฎเป็นรูปแบบของ HTML อันนี้ตั้งชื่อฟอร์มว่า form1 มี method = post, action = guestbook.cgi และมีเท็กซ์บ็อกสองอันคือ ucontent,uname สุดท้ายคือปุ่ม submit รายละเอียดส่วนนี้ต้องอาศัยความรู้เรื่อง HTML เพื่อน ๆ ต้องอ่านรายละเอียดส่วนนั้นก่อนครับถึงจะเข้าใจเนื้อหาที่ผมอธิบายเกี่ยวกับฟอร์ม
และส่วนสุดท้ายคือโปรแกรมหลักมีใจความว่า
form = cgi.FieldStorage()
if len(form)==0:
view()
printform()
else:
update(form['ucontent'].value,form['uname'].value)
view()
printform()
ให้อ่านฟอร์มต่าง ๆ ออกมาจากเอกสาร HTML เก็บไว้ในอ็อบเจ็ค form (เป็นอ็อบเจ็ค)
จากนั้นตรวจสอบว่า form ตอนนี้เป็นลีสต์ มีความยาวเท่ากับ 0 มั้ย (คือไม่มีการกรอกอะไรใส่มาเลย ถ้าใช่ให้เรียก view() และ printform()
ถ้าหากว่าไม่ใช่แสดงว่าผู้ใช้ได้ป้อนข้อความเข้ามา ดังนั้นให้นำค่าที่ได้ไปป้อนให้กับฟังก์ชั่น update() ด้วยชื่อและสิ่งที่ผู้ใช้ป้อนเข้ามา เมื่อข้อมูลถูกป้อนเข้าสู่ฐานข้อมูลเรียบร้อยแล้ว จากนั้นให้เรียกฟังก์ชั่น view() และ printform() ตามลำดับ
คำสั่งสุดท้ายให้ปิดแท็กด้วย </body> และ </html>
สังเกตว่า guestbook ของเรานั้นใช้ไฟล์เพียงหนึ่งไฟล์เท่านั้น..
ตัวอย่างนี้พอให้ไอเดียในการพัฒนาครับ..
ปัญหาอาจเกิดขึ้นถ้าผู้ใช้กด Refresh ที่บราวเซอร์เพราะ ข้อมูลจะถูกอัพเดทอีกครั้ง..
แบบนี้ผิด หนังสือ อนไซด์ ASP และ ASP.NET ของ Provision บอกว่าให้อ่านฐานข้อมูลก่อนว่าได้มีการป้อนสิ่งนั้นลงไปแล้วหรือไม่ ถ้าไม่ก็อัพเดท แต่ถ้ามีแล้ว ก็ไม่อัพเดท .. แต่ผมว่าแนวคิดนั้น ทำให้เครื่อง Server ทำงานช้าลงไปเพราะต้องวิ่งเข้าไปในฐานข้อมูล Mysql อีกครั้้ง เพียงเพื่อเช็คว่ามีข้อมูลหรือยัง...
วิธีแก้ปัญหาที่ฉลาดกว่านั้นคือ.. เก็บ cookie ดีกว่า.. กล่าวคือ ก่อนอัพเดทก็เขียนเป็นคุกกี้ไว้ ถ้ากด refresh แล้วมีข้อมูลอยู่ในคุ๊กกี้ ก็ไม่ต้องอัพเดท อย่างนี้ดีกว่า เร็วกกว่า รัดกุมกว่า.. ครับ..
เอาล่ะ เนื้อหาได้อธิบายคร่าว ๆ พอเป็นสังเขปนะครับ..
หวังว่าเพื่อน ๆ ได้ไอเดียเอาไปพัฒนาต่อยอดกันได้..
ผมอยากกล่าวปิดท้ายนิดนึงว่า ปัจจุบันนี้เว็บไซด์ที่ออกแบบได้ดี ๆ เค้าจะไม่ค่อยใช้วิธีที่เราทำเว็บทั่วไปครับ.. แต่เค้าจะใช้วิธีการสังเคราะห์เอกสารออกมาเป็น xml จากนั้นนำ XSLT ซึ่งเป็นเทมเพลตของเอกสาร XML นั้นไปแสดงผลลัพธ์ที่ต้องการ ซึ่งเรื่อง xML พูดกันได้จบใน ห้านาที แต่เทคโนโลยีรอบข้าง XML พูดกันยาว เช่น XSLT, XPath, XLink, XPoint,XPointer, Schema, DTD, SAX, DOM เป็นต้น...
เอาล่ะครับ.. อย่างไรผมขอปิดบอความของวันนี้ เอาไว้เพียงแค่นี้ก่อนเพราะเดี๋ยวจะไปออกไปไกลเกิดไป.. พบกันใหม่โอกาสหน้านะครับ.. สำหรับวันนี้ขอกล่าวคำว่า "สวัสดี" !!!!