Archive for the 'วิธีแก้ปัญหาเขียนโปรแกรม' Category

วิธีเรียกใช้ Call Stored Procedure ของ PHP 5.2.6

พอดีผมมีปัญหาในการเรียก Stored Procedure ด้วย mysql_query แบบธรรมดาซึ่งมันขึ้นว่า Stored Procedure Context ไม่เหมือนกัน หลังจากที่ไปลองๆอ่านจากหลายๆเว็บแล้ว ผมว่าคงเป็นปัญหาของ Version นี้ทางแก้ก็คือต้องรอ Version ต่อไป หรือไม่ก็ใช้ PDO ซะ !!

PDO คือตัวติดต่อกับฐานข้อมูลซึ่งไม่ได้ติดต่อได้เฉพาะ MySQL แต่ติดต่อได้มากมายไม่ว่าจะเป็น Oracle , MS SQL , PostgreSQL ฯลฯ ส่วนวิธีเรียกใช้นั้นไม่ยากเพียงแต่ต้องไปเปิด extension ของ php นะครับซึ่งใครจะใช้สำหรับ Database ตัวไหนมันจะเป็นชื่อประมาณนี้ pdo_Database เมื่อเปิดเสร็จแล้วมาดูวิธีการใช้งานเรียก Stored Procedure กันซึ่งเหมือนกับการ Query ข้อมูลเดะๆ

$pdo = new PDO('mysql:dbname=duocorevp;host=127.0.0.1;port=8889', 'root', 'root');
print '<h3>PDO: simple select</h3>';
foreach($pdo->query('call countUsers();') as $row)
{
print_r($row);
}

สังเกตุได้ว่าเหมือน Query เปะแต่จะเป็นแนวใช้ Object แทนแบบ functional เพิ่มเติดอีกนิดถ้าเรารู้อยู่แล้วว่ามันจะออกมาแถวเดียวเราสามารถทำแบบนี้ได้เลยนะครับ

$result = $pdo->query('call countUsers()')->fetch();

แต่การเขียนแบบนี้ ก็อาจมีข้อผิดพลาดเกิดขึ้นได้ในกรณีที่ไม่มีค่าส่งกลับมา ดังนั้นเราควรเขียนดักไว้สักเล็กน้อยแบบนี้

if($pdo->query('call countUsers()'))
$result = $pdo->fetch();
else
$result = null;

แบบนี้เป็นต้นครับ ไม่ยากเลยใช่ไหมครับวันนี้ผมลาไปก่อนแล้วครับ :)

10 ข้อแนะนำเวลาใช้ PHP MVC Framework

ห่างหายไปนานพอตัวแถมยังติดค้าง Barcamp Bangkok วันที่ 2 อีกถ้าว่างแล้วเดียวผมจะรีบเขียนเลยครับผม :) เอาละเข้าเรื่องกันเลยวันนี้ผมจะฝากข้อแนะนำง่ายๆไว้ละกันครับ 10 ข้อ

  1. แยก Business Logic ให้ออกจาก View อย่างชัดเจน เช่น ในโค้ดส่วนของ View ไม่ควรมีประมาณนี้ครับ
    if(user_login() && not_admin()) ควรจะเปลี่ยนให้เป็นตัวแปรแค่นี้พอ if($logged_in_and) เพื่อความง่ายในการอ่านและแยกส่วน Business Logic
  2. พยายามอย่าเขียนโค้ดซ้ำ ถ้ารู้ตัวว่ากำลังเขียนโค้ดซ้ำ ให้พยายามหาทางแก้ เช่น เขียน function is_login() ใน user class เพื่อถามว่า login รึยัง แต่ดันใช้ function นี้ในคลาสอื่นๆ ดังนั้นเราควรจะย้าย function is_login() ไปอยู่ภายใต้คลาสแม่ที่แต่ละ class อื่นๆของเราถูก implement ขึ้นมาเช่น Controller
  3. หลายๆ Framework จะไม่มีการกำหนดว่าเราต้องกำหนดชื่อในไฟล์และโฟลเดอร์ view อย่างไร และเวลาเรียกก็ต้องทำเอง ผมมีสิ่งที่ผมลองมาแล้ว รู้สึกว่าไม่ได้ผลคือการที่พยายามจะเรียก view ที่ประกอบกัน เช่นมี header footer จากภายใน Controller สรุปแล้วมันยุ่งเหยิงมาก ส่วนวิธีแก้ก็คือในไฟล์ view แต่ละหน้านั้นให้ include header footer ลงไปเลย แต่พยายามใช้เป็นแบบ function ทำเองจะได้ปรับแก้ไขสะดวกเพราะมันจะมีพวก parameter บางอย่างที่ต้องเปลี่ยนไปในแต่ละหน้าแต่ใช้ header ตัวเดียวกัน เช่น title
  4. เรื่องการ validation และเรื่องจัดการเวลาเกิด error เป็นสิ่งที่ไม่ควรละเลย เพราะเราต้องทำการ validation กันอยู่หลายๆหน้า ซึ่งมีลักษณะคล้ายกันดังนั้น ถ้าเขียนไม่ดีละก็เสียเวลาเขียนซ้ำบ่อยแน่
  5. ค่า Default เป็นเรื่องที่ไม่ควรละเลย เช่น ถ้าตัวแปรนี้ไม่ได้ถูก set มาควรมีค่าเป็นอะไรเพราะใช้บ่อยในพวก form
  6. ควรหา Editor ที่สามารถใช้กับ PHP Framework ของคุณได้ เพื่อประหยัดเวลาในการหา function ฯลฯ
  7. ก่อนลงมือเขียนจริง ควรสร้าง Class Diagram และ ER-Diagram ก่อน แต่ถ้าคุณไม่ถนัด เวลาทำงานเมื่อคุณสะกิดใจว่ามันผิดแปลก อย่าฝืนทำต่อแต่ต้องแก้ ให้เป็นไปอย่างที่มันควรจะเป็นซะ อย่าปล่อยปัญหาไว้
  8. ถ้า Framework ไม่มี Unit Test มาให้ควรใช้พวก Unit Test ของตัวอื่นมาใช้ซะ เพื่อระบบที่มีคุณภาพ เช่น Firephp เป็นตัวหนึ่งที่ใช้ได้
  9. หัดทำบ่อยๆจะได้ชิน และควรตั้งเป้าหมายให้มากขึ้น เช่น รองรับ i18n , การเปลี่ยน template ฯลฯ
  10. ค้นหา plugin ต่างๆก่อนที่คิดจะสร้างขึ้นมา ไม่แน่ว่าจะได้งานที่ดีกว่า และประหยัดเวลากว่า

วันนี้ก็ลากับ 10 ข้อง่ายๆสำหรับคนใช้ PHP MVC Framework นะครับ แต่ใช้ได้กับ Framework ตัวอื่นๆด้วยนะครับ โดยนี้คือความเห็นส่วนตัวของผมและงานที่ผมทำคือ Web Application ซึ่งมีอะไรมากมายจริงๆ

เข้าใจกับ jQuery Ajax Cross Domain

หลังจากที่ผมใช้ jQuery เป็น Javascript Framework หลักมาตลอดตอนนี้ ผมพึงได้ทำอะไรใหม่ๆ มากกว่าที่ผมทำอยู่เป็นประจำเช่น การทำ Web Service ที่ Javascript จะต้องเป็นคนเรียก วันนี้ผมก็พึุงได้รู้ว่าจริงๆแล้ว jQuery Ajax ไม่ได้โหลด Cross Domain ได้ทุก function หลังจากลอง Search ดูก็พึุงรู้ว่าจริงๆแล้วตอนนี้มีแค่

  • getJSON
  • getScript
  • $.ajax

เท่านั้นที่ทำได้ โดย $.ajax ก็คือการ setup ให้ datatype เป็น JSONP  หรือไม่ก็ Script เท่านั้นถึงทำได้ ดังนั้นเวลาเรียกให้ควร check เรื่องพวกนี้เป็นพิเศษ เพราะการทำภายใต้ domain เดียวกันนั้น คุณสามารถใช้พวก $.get , $.post ได้ตามสะดวก แต่พอจะทำ cross domain แล้วนั้นกลับทำไม่ได้ ดังนั้น ถ้าคิดจะทำ Web Service ที่ Javascript สามารถเรียกได้ ควรทดสอบด้วย getJSON หรือ getScript เท่านั้นครับ

ส่วนถ้าใช้กับพวก Server Side Script จะมีวิธีที่เรียกว่า Proxy ซึ่งทำให้สะดวกในการทำงาน ซึ่งเราสามารถใช้ได้ทุก Ajax เช่น $.get $.post ก็ใช้ได้หมด โดยมีตัวอย่างที่ทำเข้าใจอย่างมากของฝรั่งเขา ดูได้ที่นี้เลยครับ
http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html

ปล. สำหรับลิงค์ที่้ให้ไป อ่าน comment ด้วยจะได้เห็นทางเลือกที่เจ๋งๆอีกนิดหน่อย

การขึ้นบรรทัดใหม่ของไฟล์ด้วย Ruby บน Windows

วันนี้ด้วยการจะทำการจัดการกับ Textfile แต่ก็ติดปัญหาเล็กน้อยว่า ทำไมใช้ myfile.puts แล้วไม่มีการขึ้นบรรทัดใหม่ให้บน Windows ก็งงไปพักใหญ่ ใช้ print หรือ write ก็แล้วโดยใส่ \n แล้วก็ไม่ติด จนกระทั่งลองทำไฟล์ปกติขึ้นมาอันหนึ่งแล้ว ลองเอาไปเปิดดูใน Ruby ก็เห็นว่าเขาเขียนด้วย \r\n โดย \n จริงๆคือการขึ้นบรรทัดใหม่ ส่วน \r ก็คือ carriage return ซึ่งเป็นตัวอักษรตัวหนึ่งใน ASCII ซึ่งใน windows คงหมายถึงกด “enter” ดังนั้นวิธีแก้ปัญหาก็ค้นพบแล้วก็คือการใส่ \r\n เพื่อการขึ้นบรรทัดใหม่ โดยใช้กับคำสั่ง write หรือ print ก็ได้ (แต่ใช้กะ puts มะได้นะ)

ตัวอย่างเช่น
myfile = File.new(“test.txt”,”w”)
3.times { myfile.write(“hello\r\n”) }
myfile.close

ประมาณนี้เป็นต้น ลองทำดูครับ :)

JRuby on Rails บน Google App Engine

วันนี้ผมทำได้ตั้งแต่บ่ายๆละแต่พึงมีเวลาพอจะมาเขียน Blog ต่อในเรื่องของ Google App Engine ผมมีตัวที่ทำเสร็จแล้วให้ทุกท่านสามารถลองไป Deploy บน GAE ได้เลยโดยดาวโหลดได้เลยจากไฟล์นี้ HelloRails ได้เลยครับ ผมขอสรุปวิธีทำดังนี้ครับ

โดยก่อนเริ่มเราต้องมี gem ดังนี้ก่อน

  • Rails
  • Rake
  • Warbler

เสร็จแล้วทำตามขั้นตอนดังนี้

  1. เราก็สร้าง project Rails ตามปกติ
  2. เข้าไปใน folder project rails จาก command-line พิมพ์ warble pluginize
  3. เสร็จแล้วตามด้วย warble config ครับ
  4. ใน vendor/rails ให้เราลบโฟลเดอร์ activerecord ออก
  5. ตามด้วยลบโฟลเดอร์ test ที่ิอยู่ในโฟลเดอร์ดังนี้ actionmailer , actionpack , activeresource , activesupport , railties
  6. เสร็จแล้วให้โหลด 4 ไฟล์ jar หลักเหมือนเมื่อวานคือ JRuby-GAE-Jar
  7. เสร็จแล้วโหลดไฟล์ Gae-Ruby-lib.zip นี้มาแตก zip ใส่ใน lib ครับ
  8. คราวนี้เราก็สร้างไฟล์ และแก้ไขไฟล์ตามไฟล์นี้ครับ google_app_engine.rb
  9. โดยดูจากคำว่า file แล้วก็ตัวอักษรภายในนั้นและที่จะอยู่ในไฟล์แต่ละไฟล์ ถ้าไฟล์ไหนมีข้อมูลอยู่แล้วให้ลบทิ้งหมด แล้วคัดลอกไฟล์ google_app_engine ใส่ไปเลย
  10. เสร็จแล้วก็เข้า command-line พิมพ์ warble ในโฟลเดอร์ project Rails ของเรา

ส่วนถ้าไม่ใช้ Windows เราสามารถที่จะทำแบบนี้ได้เลย

  • rails ชื่อโปรเจคrails -m google_app_engine.rb

แล้วทุกอย่างก็จะเสร็จพร้อมลุย แต่อันนี้ต้องมี JRuby นะสำหรับคนที่จะใช้ script นี้ แต่ด้านบนตามขั้นตอนผมใช้ ruby ธรรมดา แต่การใช้ script จะไม่มีไฟล์ big_table_servlet_store.rb ครับ ไม่รู้ว่าจำเป็นไหมแต่ตอนผมทำเป็นขั้นตอนพอเอาไฟล์นี้มาใส่ก็หาย เลยคิดว่าน่าจะเกี่ยวแต่คนเขียน script อาจจะลืม

Next Page »