ฉันยกเลิกโปรเจ็กต์นี้เนื่องจากมีงานมากเกินไป ในขณะที่แนวคิดนี้ดูงี่เง่าในตอนแรก แต่ใช้งานได้จริงจนกระทั่งฉันพบปัญหามากมายในการทำการแบ่งหน้าและในแง่ของประสิทธิภาพ ฉันคิดว่าการจัดกลุ่มจะดีที่สุด ใช้สิ่งนี้ด้วยความเสี่ยงของคุณเอง การทำโปรเจ็กต์นี้เป็นเรื่องสนุก
นี่เป็นไลบรารี PHP ฟรี ใช้งานง่าย น้ำหนักเบา และ ทรงพลัง ซึ่งช่วยให้คุณสามารถเชื่อมต่อกับฐานข้อมูล MySQL หลายฐานข้อมูลด้วย PDO ฉันสร้างสิ่งนี้ขึ้นมาสำหรับ MySQL โดยเฉพาะ แต่ฉันเชื่อว่าสิ่งนี้จะใช้ได้กับ PostgreSQL, MariaDB, CouchDB ฯลฯ โปรดจำไว้ว่า นี่มีไว้สำหรับฐานข้อมูล SQL ดังนั้นมันจะไม่ทำงานกับระบบการจัดการฐานข้อมูลเช่น MongoDB และ Apache Cassandra
✔เชื่อมต่อกับฐานข้อมูล MySQL หลายแห่งโดยใช้ PDO
✔ดึงข้อมูลแถวจากหลายฐานข้อมูล
✔ ดำเนินการแทรกคิวรีอย่างมีประสิทธิภาพโดยทำเพียง 1 คิวรี แทนที่จะเพิ่มแถวใหม่ในทุกตารางในทุกฐานข้อมูล
✔ จัดเรียง จำกัด และจัดการผลลัพธ์/แถวได้อย่างง่ายดาย
✔ ปรับขนาดได้อย่างง่ายดาย เพียงเพิ่มฐานข้อมูล (ไม่จำเป็นต้องใช้ทาส มาสเตอร์ หรือคลัสเตอร์)
✔ สร้างตัวระบุที่ไม่ซ้ำอย่างแท้จริง (เรียกว่า MDGUID's)
➔ PHP 7+ & Apache/Nginx (ใช้ฟีเจอร์สำหรับ PHP 7 ขึ้นไป)
➔ MySQL 5.7+ (เพื่อชี้แจง MySQL 5.7 ทำงานได้ดี ดังนั้นเวอร์ชันที่สูงกว่า MySQL 5.7 จะดีมาก)
➔ ไดรเวอร์ฐานข้อมูลที่เข้ากันได้กับ PDO (อ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ที่นี่)
คุณสามารถใช้ MultiDatabasePDO เพื่อการใช้งานส่วนบุคคล การศึกษา และเชิงพาณิชย์ได้ภายใต้ข้อกำหนดต่อไปนี้:
➔ คุณไม่ได้ขาย ให้ หรือโฮสต์ (สำเนาต้นฉบับหรือสำเนาที่แก้ไข) ของไลบรารีนี้ให้กับผู้ใช้รายอื่น คุณต้องเชื่อมโยงพวกเขาเข้ากับพื้นที่เก็บข้อมูลนี้
➔ คุณไม่เปลี่ยนความคิดเห็นในไฟล์หรือลบออก การทำเช่นนี้จะทำให้ฉันคิดว่าคุณต้องการอ้างสิทธิ์เป็นของคุณเอง
1. เชื่อมต่อกับฐานข้อมูลของคุณ!
ก่อนที่คุณจะเริ่มต้น โปรดตรวจสอบให้แน่ใจว่าคุณเข้าใจพื้นฐานของ PDO เพียงดาวน์โหลดเวอร์ชันล่าสุดและรวมไฟล์ชื่อ MultiDatabasePDO .php
ซึ่งจะรวมคลาสพิเศษทั้งหมดให้คุณโดยอัตโนมัติ รหัสการตั้งค่าของคุณควรมีลักษณะดังนี้:
require " ./ MultiDatabasePDO / MultiDatabasePDO .php " ;
$ multiPDO = new WulfGamesYT MultiDatabasePDO MultiDatabasePDO ([
[ " mysql " , " 1.1.1.1 " , " database_1 " , " username " , " password " ],
[ " mysql " , " 2.2.2.2 " , " database_2 " , " username " , " password " ]
]);
ตอนนี้เราจำเป็นต้องตรวจสอบข้อผิดพลาดโดยใช้ฟังก์ชันง่ายๆ ที่เรียกว่า hasAnyErrors()
คุณสามารถแสดงรายการการเชื่อมต่อที่ล้มเหลวได้ด้วยฟังก์ชัน getFailedConnections()
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. การอ่านวิกิ & ใช้ห้องสมุดนี้อย่างถูกวิธี!
ต่อไป ฉันขอแนะนำให้อ่านเอกสารประกอบในวิกิเพื่อทำความเข้าใจว่าแต่ละฟังก์ชันทำอะไร นอกจากนี้ สิ่งสำคัญที่ควรทราบคือมีความแตกต่างบางประการระหว่างไลบรารีนี้และไลบรารี PDO มาตรฐาน โดยเฉพาะอย่างยิ่ง:
execute()
ให้ใช้ bindValue()
หรือ bindValues()
ORDER BY
, LIMIT
หรือ OFFSET
ในการสืบค้น SQL ของคุณได้ โปรดดูคู่มือนี้แทนAUTO INCREMENT
สำหรับคอลัมน์ ถ้าคุณมีคอลัมน์ ID ให้ใช้ฟังก์ชันนี้แทน 3. การตั้งค่าฐานข้อมูลและตารางของคุณ!
หากคุณวางแผนที่จะใช้ MultiDatabasePDO คุณต้องแน่ใจว่าตารางทั้งหมดของคุณจากทุกฐานข้อมูลที่คุณเชื่อมต่อมีโครงสร้างในลักษณะเดียวกัน:
ตัวอย่างเช่น สมมติว่าเรามี 2 ตารางต่อไปนี้จาก 2 ฐานข้อมูลที่แตกต่างกัน ทั้งที่มีโครงสร้างและชื่อเหมือนกัน แต่ละตัวอย่างใน README ด้านล่างนี้ใช้ตารางเหล่านี้ ตามความเป็นจริงแล้ว ตารางของคุณจะมีแถวนับพันหรือหลายล้านแถว ก่อนที่คุณจะต้องพิจารณาใช้ MultiDatabasePDO (หรือหากคุณต้องการเตรียมพร้อมสำหรับการปรับขนาดเว็บแอปของคุณ)
ตาราง "ผู้ใช้" จากฐานข้อมูล 1
ไอดี (int) | ชื่อผู้ใช้ (ข้อความ) | PassHash (ข้อความ) | อีเมล์ (ข้อความ) | ชื่อ (ข้อความ) | นามสกุล (ข้อความ) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | เลียม | อัลเลน |
2 | อินเดียนาโจนส์55 | npxCn975RSaP | [email protected] | อินเดียนา | โจนส์ |
3 | ยาบอยเทเบิลฟลิปเปอร์69 | BT7V2U6VJv2d | [email protected] | สตีฟ | โจนส์ |
ตาราง "ผู้ใช้" จากฐานข้อมูล 2
ไอดี (int) | ชื่อผู้ใช้ (ข้อความ) | PassHash (ข้อความ) | อีเมล์ (ข้อความ) | ชื่อ (ข้อความ) | นามสกุล (ข้อความ) |
---|---|---|---|---|---|
4 | จริงๆนะเพื่อน | 6XBmD4bzGP87 | [email protected] | เลียม | เมสัน |
5 | เฮลใช่บอย | เลย์TpTwvvMUM | [email protected] | จูลี่ | ครอสบี |
หากต้องการเลือกแถวจากฐานข้อมูลทั้งหมดและตารางทั้งหมด คุณสามารถทำได้เหมือนกับ PDO ปกติใน PHP:
$ selectQuery = $ multiPDO -> prepare ( " SELECT ID, Username, Email FROM Users WHERE Username = :username " );
$ selectQuery -> bindValue ( " :username " , " WulfGamesYT " );
$ selectQuery -> execute ();
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
สมมติว่าเรามีแบบฟอร์มและคุณสามารถโพสต์ข้อมูลลงในไฟล์ PHP ของคุณได้ และคุณต้องการแทรก 1 ระเบียนใหม่ลงในตารางจากฐานข้อมูลที่เรียกว่า "Users" สิ่งที่คุณต้องทำคือดังต่อไปนี้ โปรดทราบว่าสิ่งนี้จะถูกแทรกลงในตารางที่สองในตารางตัวอย่างด้านบน เนื่องจากมีจำนวนแถวต่ำที่สุด แทนที่จะใส่ ID ด้วยตนเองและใช้ประเภทข้อมูล int ในตารางของคุณ ให้ใช้ฟังก์ชัน generateMDGUID()
ด้านล่าง
$ longSQL = " INSERT INTO Users VALUES (6, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
โปรดสังเกตว่าด้วยวิธี execute()
ที่เราใส่ใน 2 พารามิเตอร์ สิ่งนี้จำเป็นสำหรับการแทรกแถวใหม่ เพราะมันจะบอกคลาสที่เรากำลังแทรก (โดยส่งผ่าน: จริง) แถวใหม่ลงในตารางที่เรียกว่า "ผู้ใช้" อย่าใส่อินพุตของผู้ใช้ที่ไม่น่าเชื่อถือเป็นพารามิเตอร์ตัวที่สอง เนื่องจากอาจเกิดการแทรก SQL ได้
โดยพื้นฐานแล้วจะเหมือนกับการทำแบบสอบถาม SELECT ซึ่งจะอัปเดตตารางทั้งหมดในฐานข้อมูลทั้งหมดที่ตรงกับส่วนคำสั่ง WHERE หากมีการระบุ ตัวอย่างเช่น:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
ตอนนี้ถ้าเราเรียกใช้แบบสอบถาม SELECT บนตารางทั้งหมดที่ชื่อ "ผู้ใช้" เราจะเห็นแถวที่อัปเดต
อีกครั้ง สิ่งที่เราต้องทำคือ:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
ตอนนี้ถ้าเราเรียกใช้แบบสอบถาม SELECT บนตารางทั้งหมดที่ชื่อ "ผู้ใช้" เราจะเห็นแถวที่อัปเดต
สิ่งสำคัญที่ควรทราบคือคุณไม่สามารถใช้ ORDER BY
, LIMIT
หรือ OFFSET
ในการสืบค้น SQL ของคุณเพื่อเรียงลำดับแถวทั้งหมดจากแต่ละฐานข้อมูล เฉพาะแถวในตารางปัจจุบันใน 1 ฐานข้อมูล แต่คุณต้องใช้ฟังก์ชันต่อไปนี้ที่มาพร้อมกับ MultiDatabasePDO ซึ่งทำให้ง่ายต่อการจัดระเบียบผลลัพธ์/แถวสุดท้ายของคุณ
การจัดลำดับผลลัพธ์ (แทน "ORDER BY"): คุณสามารถเรียงลำดับผลลัพธ์ได้เช่นเดียวกับที่คุณทำในการสืบค้น SQL โดยส่ง "ASC" หรือ "DESC" ไปยังพารามิเตอร์ตัวที่สองไปยังเมธอด sortBy()
นี่คือวิธีที่คุณเรียงลำดับคอลัมน์หมายเลข:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "ID" column in descending order.
$ selectQuery -> sortBy ( " ID " , " DESC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
นี่คือวิธีที่คุณเรียงลำดับคอลัมน์สตริง/วัตถุ:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "Username" column in ascending order.
$ selectQuery -> sortBy ( " Username " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
คุณสามารถสั่งซื้อหลายคอลัมน์หรือหลายครั้งได้หากต้องการ ในตัวอย่างด้านล่าง เราจะเรียงลำดับคอลัมน์ชื่อ "FirstName" จากมากไปน้อย จากนั้นจึงเรียงลำดับคอลัมน์ชื่อ "LastName" ซึ่งจะแสดงรายการผู้ใช้ในตารางตามลำดับตัวอักษร หากพวกเขามีชื่อเหมือนกัน ก็จะเรียงลำดับตามนามสกุลด้วย ใส่คอลัมน์ลำดับที่สำคัญที่สุดก่อน จากนั้นคอลัมน์ที่สำคัญที่สุดในตอนท้ายอย่างที่คุณเห็นในโค้ด:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort both the columns.
$ selectQuery -> sortBy ( " LastName " , " ASC " );
$ selectQuery -> sortBy ( " FirstName " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
แทนที่จะใช้ AUTO INCREMENT
หรือหากคุณต้องการวิธีสร้าง GUID ที่ไม่ซ้ำใครอย่างแท้จริงในหลายฐานข้อมูล คุณสามารถใช้ฟังก์ชันของเราที่เรียกว่า generateMDGUID()
ได้ ด้านล่างนี้คือคำแนะนำเกี่ยวกับวิธีการทำงานและวิธีที่รับประกันความเป็นเอกลักษณ์ 100% และตัวอย่างวิธีใช้ฟังก์ชันเมื่อแทรกแถวใหม่ลงในตารางของคุณ
วิธีการทำงานของ MDGUID และการรับประกันเอกลักษณ์:
ตัวอย่าง:
//Here we generate the MDGUID.
$ mdguid = $ multiPDO -> generateMDGUID ();
$ longSQL = " INSERT INTO Users VALUES (:mdguid, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :mdguid " => $ mdguid ,
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
หากคุณต้องการถามคำถาม โปรดติดต่อฉันทาง Twitter
ทวิตเตอร์: https://www.twitter.com/WulfGamesYT
หากคุณชอบไลบรารี่นี้ โปรดพิจารณานำมันมาแบ่งปันและแบ่งปันกับเพื่อนนักพัฒนาที่ชอบ PHP และ MySQL! คอยติดตามการอัปเดตและอย่าลืมรายงานข้อบกพร่องใด ๆ ที่คุณพบให้ฉัน ขอบคุณสำหรับการอ่าน!