ปัญหากับ mssql* ใน php เยอะนักก็หันมาใช้ ADODB ซะเลย

ปัญหากับ mssql* ใน php เยอะนักก็หันมาใช้ ADODB ซะเลย

ช่วงนี้ มีงานที่ต้องเขียน PHP เข้าไปทำงานกับ SQL server 2008 standard ทำให้เจอเรื่องปวดหัวเยอะ เพราะว่า infra ที่ใช้ก็ไม่นิ่งด้วย และโค้ดที่เคยเขียน mssql_connect ก็เคยทำงานได้ดีอยู่ ใน SQL 2005 Express พอมาเจอ ตัวใหม่ ก็ไปไม่เป็นกันเลยทีเดียว ปัญหาที่เจอก็คือ มัน connect database ไม่ได้ ทำยังไงก็ไม่ได้ งมกันเป็นวัน ไม่ว่าจะเป็น เรื่อง instant name, TCP/IP, firewall, ntwdblib.dll, httpd.conf โอยเยอะ เรียกว่า ลองกันมาหมดทุกวิถีทางแล้ว ก็ยัง connect ไม่ได้ สุดท้ายก็เลยตัดสินใจ เปลี่ยนไปใช้ตัวอื่นดีกว่าโดยตอนแรกชั่งใจ ระหว่าง ADODB, ODBC สุดท้ายเลือก ADODB เหตุผลไม่มีอะไรมากเลย เอาโค้ดตัวอย่างมาทดสอบแล้วใช้งานได้เลย รวมทั้งการทำงานของมันก็ไม่ได้ยากอะไร แก้โค้ดเอานิดหน่อย เดี๋ยวจะบอกให้ว่า ตรงไหนบ้าง

สำหรับการใช้ ADODB นั้น มันรองรับ database หลายประเภทมาก แต่ว่า มี database บางประเภทจะทำงานเฉพาะบน windows อย่างเดียวเท่านั้น ตัวไหนอย่างไรบ้าง อ้างอิงได้จาก http://www.phplens.com/adodb/supported.databases.html

ส่วนตัวที่ผมใช้ ก็คือ MSSQL 2008 Enterprise บน Windows Server 2008 (แค่ค่า license สองตัวนี้ก็หลักแสนบาทแล้วครับ แพง แต่เลี่ยงไม่ได้ เพราะว่า บริษัทใช้ software หลักๆทำงานบน MSSQL ครับ ผมต้องเขียนโปรแกรมเข้าไปแซะข้อมูลออกมาใช้) จึงเป็นที่มา

MSSQL ADODB Connection

คำสั่งสำหรับ connect เข้ากับ database ของ server ก่อนเริ่มการใช้งานอื่นๆต่อ

$mssql = new COM("ADODB.Connection"); $dsn = "DRIVER={SQL Server}; SERVER={DBSERVER\SA};UID={MSSQLUSER};PWD={MSSQLPASS}; DATABASE={DATABASENAME}"; $mssql->Open($dsn);

โดยเปลี่ยนค่า DBSERVER\SA ให้เป็น Instant ที่ตัวเองตั้งเอาไว้นะครับ และ MSSQLUSER คือ username ที่ใช้เชื่อมเข้า MSSQL , MSSQLPASS คือ รหัสผ่านเชื่อมเข้า MSSQL ท้ายสุดคือ DATABASENAME คือชื่อ database ครับ

QUERY ข้อมูล

คำสั่งสำหรับการ query ข้อมูล และการนำออกมาใช้

$query = "SELECT * FROM [DATABASENAME].[dbo].[tablename]"; $result = $mssql->Execute($query); while(!$result->EOF){ echo $result->Fields["field_name"]->Value; $result->MoveNext(); } $result->Close();

โดยอธิบายเป็น step ได้ดังนี้ 

  1. เอา query ที่จะดึง data มาเขียนใส่ตัวแปรเอาไว้ก่อน โดย version 2008 ผมทดสอบเขียน tablename เฉยๆ บางครั้งไม่ออกเลยเขียนแบบ DATABASENAME (เปลี่ยนเป็นของตัวเองด้วยนะ)
  2. สั่ง execute query ที่เราได้เขียนเตรียมเอาไว้ (ใครจะไม่เขียนเตรียมเอาไว้ แต่มาเขียน query สดในนี้เลยก็ไม่ว่ากันครับ)
  3. เป็นคำสั่งเพื่อตรวจสอบว่ามี row ที่ได้จากการ select หรือไม่ ถ้ามี ก็ให้ทำคำสั่งใน while ต่อ แต่ถ้าไม่มีแล้ว ก็ข้าม while ไปเลย
  4. แสดงผลค่าที่เก็บใน field ที่ชื่อ filed_name ออกมา
  5. สั่งให้เลื่อนไปที่ record ถัดไป และก็จะไปเริ่มทำงานที่ข้อ 3 ใหม่อีกรอบ 
  6. Close() นั้นเป็นการคืน ทรัพยากรกลับเข้ามาในระบบ ไม่มีก็ได้ ไม่ได้ว่าอะไร แต่เพื่อ performance ที่ดี ผมใช้ครับ ใครจะแถมท้ายด้วย unset ด้วยก็ได้ไม่ได้ว่าอะไรครับ

จัดไปเบาะๆเท่านี้ก่อน ก็ทำงานได้เยอะแล้วครับ เพราะว่าหลักๆแล้ว มันไม่ได้ขึ้นอยู่กับ function แต่ว่ามันขึ้นอยู่กับ QUERY ต่างหาก ว่าเราเขียนได้ผลลัพท์ตรงตามใจเราหรือเปล่า เพราะว่าถ้า query ผิดต่อให้มีตัวช่วยระดับเทพก็ช่วยอะไรไม่ได้ครับ

Create: Modify : 2013-03-07 11:45:05 Read : 5397 URL :