PHPLIB เป็นไลบรารีส่วนขยายของ PHP เราสามารถใช้เพื่อดำเนินการต่างๆ บนฐานข้อมูลได้อย่างง่ายดาย อย่างไรก็ตาม หากคุณต้องการใช้หลายฐานข้อมูล บทความนี้จะแนะนำวิธีขยาย PHPLIB เพื่อให้คุณใช้งานได้ คุณมีสิ่งที่ดีที่สุดจากทั้งสองโลก คุณสามารถใช้หลายฐานข้อมูลในขณะที่ใช้ PHPLIB และคุณยังสามารถเรียนรู้เกี่ยวกับการเขียนโปรแกรมเชิงวัตถุและวิธีขยายไลบรารี
การจัดการฐานข้อมูล
คุณสามารถใส่ตารางใดก็ได้ในฐานข้อมูลขนาดใหญ่ อย่างไรก็ตาม เมื่อเวลาผ่านไป ฐานข้อมูลจะมีขนาดใหญ่ขึ้นเรื่อยๆ เซิร์ฟเวอร์อาจไม่สามารถติดตามงาน IO ได้ หรืออาจมีหน่วยความจำไม่เพียงพอที่จะรับมือกับการเข้าถึงทั้งหมด การแยกข้อมูลที่มีอยู่เป็นเรื่องยากมาก ก็ควรที่จะเริ่มต้นด้วยฐานข้อมูลที่แยกจากกันและใช้การจัดการฐานข้อมูลที่มีประสิทธิภาพ หากคุณมีเว็บไซต์ที่จำหน่ายหนังสือ คุณอาจมีรายชื่อผู้แต่ง รายการราคาหนังสือ และรายการสินค้าคงคลังและคำสั่งซื้อในปัจจุบัน เมื่อธุรกิจของคุณเติบโตขึ้น คำสั่งซื้อก็จะเติบโตต่อไป และการประมวลผลคำสั่งซื้อแต่ละรายการจำเป็นต้องมีการเข้าถึงดิสก์จำนวนมาก เป็นไปได้มากว่าคุณจะนำคำสั่งซื้อทั้งหมดของคุณเข้าสู่ระบบบัญชี ณ จุดใดจุดหนึ่ง
ตอนนี้ใส่คำสั่งลงในฐานข้อมูลแยกต่างหาก เนื่องจากสินค้าคงคลังได้รับการอัปเดตผ่านคำสั่งซื้อ ปริมาณสินค้าคงคลังจึงอยู่ในฐานข้อมูลเดียวกันด้วย
รายชื่อผู้แต่งและรายชื่อหนังสือเป็นข้อมูลคงที่ที่ต้องอ่านบ่อยๆแต่ไม่ค่อยได้อัพเดท ในทางปฏิบัติ การอัปเดตบันทึกของผู้เขียนอาจจำเป็นต้องดำเนินการทุกๆ 5 ปีเฉพาะเมื่อผู้เขียนเขียนหนังสือเล่มใหม่ (หรือเสียชีวิต) เซิร์ฟเวอร์ที่โฮสต์ข้อมูลนี้สามารถกำหนดค่าให้แตกต่างจากเซิร์ฟเวอร์ที่โฮสต์ฐานข้อมูลคำสั่งซื้อโดยสิ้นเชิง
ประกอบด้วย PHPLIB
PHPLIB เข้าถึงฐานข้อมูล SQL ผ่านคลาสที่เรียกว่า DB_Sql ขึ้นอยู่กับประเภทของฐานข้อมูลที่คุณต้องการใช้ ให้รวมไฟล์ inc ต่างๆ ไว้ในโค้ดของคุณ ในตัวอย่างนี้ ฉันใช้เวอร์ชัน MySQL
หากต้องการใช้ DB_Sql ในโค้ดของคุณ ให้ติดตั้งไฟล์ PHPLIB ในไดเรกทอรีของตนเอง จากนั้น ค้นหาไดเร็กทอรี cgi-bin ของคุณและสร้างไดเร็กทอรี phplib ถัดจากไดเร็กทอรี cgi-bin จากนั้น คัดลอกไฟล์ PHPLIB .inc ทั้งหมดไปยังไดเร็กทอรี phplib สุดท้าย แก้ไขไฟล์ php.inc เพียงเปลี่ยนบรรทัด "include_path=" เป็นไดเร็กทอรี phplib
include_path คือไดเร็กทอรีที่ PHP ค้นหาเมื่อใช้ include() หรือ need() ในเวิร์กสเตชัน NT ของฉัน เส้นทาง include คือ:
include_path
= ".;i:/project52/includes;i:/project52/phplib";
ในระบบของคุณ
ให้เพิ่มinclude_path = ".;/home/httpd/include;/home/httpd/phplib";
ที่ด้านบนของหน้า PHP แต่ละหน้า
- PHP
ต้องการ (common.php);
- -
common.php3 อยู่ในไดเร็กทอรีรวมและมีข้อมูลและฟังก์ชันทั้งหมดที่ใช้โดยแต่ละหน้า ในตัวอย่างนี้ common.php คือ:
- PHP
ต้องการ(db_mysql.inc);
ต้องการ (ct_sql.inc);
ต้องการ (session.inc);
ต้องการ (auth.inc);
ต้องการ(perm.inc);
ต้องการ (user.inc);
ต้องการ (page.inc);
- >
หากคุณต้องการทราบวัตถุประสงค์ของไฟล์ inc แต่ละไฟล์ คุณสามารถอ่านเอกสาร PHPLIB ได้ที่ http://phplib.netuse.de Db_mysql.inc มีคำจำกัดความของคลาส DB_SQL ทั้งหมด หากคุณต้องการใช้ PostGreSQL แทน MySQL เพียงใช้ db_pgsql.inc แทน db_mysql.inc มีไฟล์ .inc อื่นๆ อีก 10 ไฟล์สำหรับใช้กับ MS SQL, Oracle, Sybase หรือฐานข้อมูลอื่นๆ
โปรดทราบว่าในตัวอย่างนี้ need() และ include() เหมือนกันทุกประการ อย่างไรก็ตาม หากวางไว้ในโค้ดหรือใช้ในคำสั่ง if การใช้ Require() และ include จะแตกต่างอย่างสิ้นเชิงและให้ผลลัพธ์การทำงานที่แตกต่างกัน
การขยาย PHPLIB
PHPLIB เข้าถึงฐานข้อมูลผ่านอ็อบเจ็กต์ที่สร้างโดยคลาส DB_Sql Db_mysql.inc มีคลาส DB_Sql ที่ได้รับการแก้ไขสำหรับ MySQL เราจะขยาย DB_sql โดยการเพิ่มโค้ดลงใน common.php หลังบรรทัดที่มี db_mysql.inc
DB_Sql มีฟังก์ชันมากมายสำหรับการสืบค้น สิ่งที่เราต้องแก้ไขคือ:
<? PHP
/* สาธารณะ: การจัดการการเชื่อมต่อ*/
ฟังก์ชั่นเชื่อมต่อ($Database = "", $Host = "", $User = "", $Password = "") {
/* จัดการการเชื่อมต่อเริ่มต้น */
ถ้า ("" == $ฐานข้อมูล)
$ฐานข้อมูล = $this->ฐานข้อมูล;
ถ้า ("" == $โฮสต์)
$โฮสต์ = $นี่->โฮสต์;
ถ้า ("" == $ผู้ใช้)
$User = $this->ผู้ใช้;
ถ้า ("" == $รหัสผ่าน)
$Password = $this->Password;
/* สร้างการเชื่อมต่อและเลือกฐานข้อมูล*/
ถ้า ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($โฮสต์, $ผู้ใช้, $รหัสผ่าน);
ถ้า (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) ล้มเหลว");
กลับ 0;
-
ถ้า ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("ไม่สามารถใช้ฐานข้อมูลได้ ".$this->ฐานข้อมูล);
กลับ 0;
-
}
ส่งคืน $this->Link_ID;
-
- >
ค้นหาฟังก์ชันเชื่อมต่อ() ใน db_mysql.inc ของคุณ (หรือไฟล์ .inc ที่เกี่ยวข้องกับฐานข้อมูลอื่นๆ) จากนั้นคัดลอกไปที่ common.php และวางไว้ด้านหลังโค้ดที่มี db_mysql.inc ในตอนท้าย คุณต้องเพิ่มด้วย มันห่อหุ้มไว้เป็นคำจำกัดความของคลาส
ฉันพบว่าโค้ดอ่านยากนิดหน่อย ดังนั้นฉันจึงทำให้โค้ดที่คัดลอกอ่านง่ายขึ้นก่อน:
<? PHP
/* สาธารณะ: การจัดการการเชื่อมต่อ*/
ฟังก์ชั่นเชื่อมต่อ($Database = "", $Host = "", $User = "", $Password = "") {
/* จัดการการเชื่อมต่อเริ่มต้น */
ถ้า ("" == $ฐานข้อมูล) {
$ฐานข้อมูล = $this->ฐานข้อมูล;
-
ถ้า ("" == $โฮสต์) {
$Host = $this->โฮสต์;
-
ถ้า ("" == ผู้ใช้ $) {
$User = $this->ผู้ใช้;
-
ถ้า ("" == $รหัสผ่าน) {
$รหัสผ่าน = $this->รหัสผ่าน;
-
/* ทำการเชื่อมต่อและเลือกฐานข้อมูล */
ถ้า ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($โฮสต์, $ผู้ใช้, $รหัสผ่าน);
ถ้า (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) ล้มเหลว");
กลับ 0;
-
ถ้า ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("ไม่สามารถใช้ฐานข้อมูลได้ ".$this->ฐานข้อมูล);
กลับ 0;
-
-
ส่งคืน $this->Link_ID;
-
- >
ฉันปรับตำแหน่งของวงเล็บและเพิ่มวงเล็บปีกกาก่อนและหลังบรรทัดเดียว ในคำสั่ง if ของ PHP คุณไม่จำเป็นต้องมีวงเล็บหากมีโค้ดเพียงบรรทัดเดียว แต่ถ้าคุณเพิ่มโค้ดอีกหนึ่งบรรทัด จะเกิดข้อผิดพลาดทันที ดังนั้นฉันขอแนะนำให้คุณเพิ่มวงเล็บเพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อเพิ่มโค้ดในภายหลัง
ก่อนที่จะเปลี่ยนรหัสการเชื่อมต่อ คุณต้องทำความเข้าใจวิธีการทำงานของการเชื่อมต่อ () ก่อน โดยจะตรวจสอบว่ามีการเชื่อมต่ออยู่หรือไม่ หากไม่มีการเชื่อมต่อ จะสร้างการเชื่อมต่อ ก่อนการสืบค้นฐานข้อมูลแต่ละครั้ง ให้เรียกใช้ฟังก์ชันเชื่อมต่อ () นี้ก่อน ขออภัย ระบบจะเลือกฐานข้อมูลเมื่อเชื่อมต่อเป็นครั้งแรกเท่านั้น หากหน้า PHP ของคุณใช้ฐานข้อมูลมากกว่าหนึ่งฐานข้อมูล Connect() จะไม่เลือกฐานข้อมูลอื่น
มีหลายวิธีในการเปลี่ยนรหัส เราจำเป็นต้องเลือกวิธีที่มีผลกระทบต่อ PHPLIB น้อยที่สุด และช่วยให้เราสามารถแสดงสถานะการเชื่อมต่อฐานข้อมูลเมื่อเราต้องการวิเคราะห์ปัญหา เราจำเป็นต้องบันทึกรหัสการเชื่อมต่อและชื่อฐานข้อมูลไว้นอก PHPLIB เพียงเพิ่ม common.php:
<? PHP
$db_connection = 0; // ID ของการเชื่อมต่อฐานข้อมูล
$db_database = ""; // สถานะฐานข้อมูลปัจจุบัน? >
ต่อไป เราจะแก้ไข PHPLIB เพื่อจัดเก็บ ID การเชื่อมต่อและชื่อฐานข้อมูลในตัวแปรเหล่านี้ คุณสามารถตั้งค่าและใช้ชื่อตัวแปรเดียวกันในโค้ดอื่นได้ เมื่อวิเคราะห์ปัญหา หากคุณต้องการทราบว่ามีการใช้ฐานข้อมูลใด เพียงใส่โค้ดต่อไปนี้ลงในเพจ:
<? PHP
พิมพ์(" db_database: " . $db_database . "");
- >
เราจะทำให้การเชื่อมต่อ() ใช้ตัวแปรใหม่เหล่านี้ได้อย่างไร? เราสามารถเพิ่มบรรทัดที่ด้านบน:
<? PHP
-
โกลบอล $db_connect, $db_database;
/* จัดการค่าเริ่มต้น */
- >
ด้วยโค้ดเหล่านี้ คุณจะสามารถเข้าถึงตัวแปรใหม่ได้โดยเชื่อมต่อ()
หลังจากกำหนด $db_database แล้ว ให้เพิ่ม:
- PHP
ฟังก์ชั่น db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
โกลบอล $db_connect;
ถ้า(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
-
กลับ($db_connect);
-
ฟังก์ชั่น db_database($db_database_new="") {
โกลบอล $db_database;
ถ้า(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
-
กลับ($db_database);
-
- >
ตราบใดที่คุณกำหนดฟังก์ชันสาธารณะเหล่านี้เพียงครั้งเดียว คุณสามารถใช้ตัวแปรสาธารณะเหล่านี้ในตำแหน่งต่างๆ ได้โดยไม่ต้องเพิ่มการประกาศส่วนกลาง ต่อไปนี้เป็นฟังก์ชันสาธารณะที่ใช้ฟังก์ชัน db ข้างต้น:
<? PHP
ฟังก์ชั่นเชื่อมต่อ($Database = "", $Host = "", $User = "", $Password = "") {
/* จัดการการเชื่อมต่อเริ่มต้น */
ถ้า ("" == $ฐานข้อมูล) {
$ฐานข้อมูล = $this->ฐานข้อมูล;
-
ถ้า ("" == $โฮสต์) {
$Host = $this->โฮสต์;
-
ถ้า ("" == ผู้ใช้ $) {
$User = $this->ผู้ใช้;
-
ถ้า ("" == $รหัสผ่าน) {
$รหัสผ่าน = $this->รหัสผ่าน;
-
/* ทำการเชื่อมต่อและเลือกฐานข้อมูล */
ถ้า (0 == db_connect()) {
$this->Link_ID = db_connect($โฮสต์, $ผู้ใช้, $รหัสผ่าน);
ถ้า (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) ล้มเหลว");
กลับ 0;
-
-
ถ้า (0 != db_connect()) {
ถ้า($ฐานข้อมูล != db_database()) {
$นี่->ฐานข้อมูล = db_database($ฐานข้อมูล))
ถ้า(ว่าง($นี่->ฐานข้อมูล)) {
$this->halt("ไม่สามารถใช้ฐานข้อมูลได้ " . $this->ฐานข้อมูล);
กลับ 0;
-
-
-
ส่งคืน $this->Link_ID;
-
- >
โปรดใส่ใจกับการเปลี่ยนแปลงต่อไปนี้:
การทดสอบฐานข้อมูลจะแยกออกจากการทดสอบการเชื่อมต่อ ดังนั้นแม้ว่า Connect() จะมีการเชื่อมต่อในปัจจุบัน แต่ก็ยังสามารถตรวจสอบได้ว่าจะเปลี่ยนเป็นฐานข้อมูลอื่นหรือไม่ ซึ่งหมายความว่า db_connect() เปรียบเทียบกับ 0 บ่อยกว่าเมื่อก่อนถึงสองเท่า แต่จำเป็นต้องมีการประมวลผลพิเศษนี้
เราเก็บการเชื่อมต่อฐานข้อมูลและการเลือกฐานข้อมูลไว้นอก PHPLIB เพื่อให้คุณสามารถใช้ฟังก์ชันการเลือกฐานข้อมูลเดียวกันได้ทุกที่ในโค้ด PHP ของคุณ
อย่างไรก็ตาม มีข้อจำกัดในการประมวลผลในปัจจุบัน เราถือว่าโฮสต์ ผู้ใช้ และรหัสผ่านเดียวกันนั้นถูกใช้สำหรับฐานข้อมูลทั้งหมด หากฐานข้อมูลของคุณมีสิทธิ์ที่แตกต่างกันสำหรับผู้ใช้ที่แตกต่างกัน คุณต้องสร้างการเชื่อมต่อพิเศษเพื่อเข้าถึงฐานข้อมูล ยังไง? เพียงกำหนดตัวแปรต่อไปนี้:
<? PHP
$db_host = "";
$db_user = "";
$db_pass = "";
- >
โดยการขยายฟังก์ชัน db_database() ให้เปรียบเทียบผู้ใช้ปัจจุบันและโฮสต์กับผู้ใช้และโฮสต์ที่กำหนด คุณยังสามารถเพิ่ม:
<? PHP
$db_type = "";
- >
ตัวแปรนี้ใช้เพื่อจัดเก็บประเภทของฐานข้อมูล mysql หรือ Oracle เป็นต้น วิธีนี้ทำให้คุณสามารถเข้าถึงฐานข้อมูลได้หลายฐานข้อมูล
แต่การเปลี่ยนโค้ดเพื่อจัดการกับฐานข้อมูลหลายประเภทนั้นค่อนข้างซับซ้อน คุณต้องเปลี่ยนฟังก์ชันคิวรี รวมถึงฟังก์ชันการรวมและการเลือกด้วย คุณอาจเชื่อมต่อผ่าน ODBC ของ PHP ได้ จากนั้นใช้ตัวเลือก ODBC ของ PHPLIB เพื่อจัดการ ODBC จัดการหลายฐานข้อมูลด้วยวิธีทั่วไป ดังนั้นจะช้าลง ODBC อนุญาตให้คุณใช้รหัสเดียวกันเพื่อจัดการฐานข้อมูลหลายประเภท แต่จะมีปัญหาเมื่อจำเป็นต้องใช้วันที่ในรูปแบบการประมวลผลที่แตกต่างกันและจะมีความแตกต่างที่แปลกประหลาดระหว่างฐานข้อมูลด้วย ODBC ทำให้การเชื่อมต่อง่ายขึ้น แต่ไม่ได้แก้ไขวิธีที่ฐานข้อมูลตีความข้อมูลและ SQL
ตอนนี้เรามาเรียนรู้วิธีกำหนดคลาสอ็อบเจ็กต์ใหม่ ฟังก์ชั่นเชื่อมต่อ () ถูกห่อหุ้มไว้ในคำจำกัดความของคลาส:
- PHP
คลาส DB_Sql {
-
- >
เมื่อเราคัดลอกฟังก์ชันนี้ไปยัง common.php เราต้องกำหนดคลาส DB_Sql ใหม่ เราสามารถสรุปการเชื่อมต่อ () ได้ดังนี้:
- PHP
คลาส db_DB_Sql ขยาย DB_Sql {
-
- >
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของ "extends" เราสามารถดูหัวข้อเกี่ยวกับออบเจ็กต์และคลาสในเอกสาร PHP ได้ พูดง่ายๆ ก็คือ คำจำกัดความใดๆ ในส่วนขยายจะแทนที่และแทนที่คำจำกัดความก่อนหน้าทั้งหมด
db_DB_Sql สามารถใช้งานได้แล้ว เมื่อคุณกำหนดค่า PHPLIB คุณจะสร้างคำสั่งต่อไปนี้:
<? PHP
$x = DB_Sql ใหม่;
- > เปลี่ยนเป็น: <? PHP
$x = db_DB_Sql ใหม่;
- >
วิธีนี้ทำให้คุณสามารถใช้คลาสที่แก้ไขแทนคลาสก่อนหน้าได้
เมื่อเกิดข้อผิดพลาดขณะเชื่อมต่อกับฐานข้อมูล คุณสามารถส่งออกสถานะการเชื่อมต่อปัจจุบันในฟังก์ชันภายนอกได้ หากเกิดข้อผิดพลาดในคำสั่ง SQL คุณยังสามารถคัดลอกฟังก์ชัน query() ใน DB_Sql ไปยัง db_DB_Sql ใน common.PHP แล้วแทรกคำสั่งเอาต์พุตเพื่อดูว่าคำสั่ง SQL ปัจจุบันคืออะไร
คุณยังสามารถเขียนข้อมูลข้อผิดพลาดหรือการวินิจฉัยลงในดิสก์ไฟล์ได้ โดยการกำหนด
$db_log_file = "t:/diag.txt";
หรือไฟล์ข้อความที่คล้ายกัน หากใช้ Windows คุณต้องตรวจสอบให้แน่ใจว่ามีไดเรกทอรีอยู่ ไม่เช่นนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาด
จากนั้นกำหนดฟังก์ชัน:
<? PHP
ฟังก์ชั่น db_log($db_log_message) {
globals $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message"rn");
fclose($db_log_f);
-
- >
ในกรณีที่คุณต้องการบันทึกข้อมูล ให้เพิ่มรหัสต่อไปนี้:
<? PHP
db_log("ฐานข้อมูลปัจจุบัน: " . db_database());
- >
จริงๆ แล้ว คุณสามารถใช้ไฟล์บันทึกในตัวหรือไฟล์บันทึกของระบบได้ แต่คุณจะต้องค้นหาข้อมูลชิ้นเล็กๆ ในไฟล์จำนวนมาก ดังนั้นไฟล์บันทึกแยกต่างหากนี้จะช่วยคุณในการทดสอบ ฉันขอแนะนำให้เขียนโค้ดต่อไปนี้ก่อนและหลังการบันทึก:
<? PHP
db_log("ฐานข้อมูลปัจจุบัน: " . db_database());
db_database("รายการหนังสือ");
db_log("ฐานข้อมูลปัจจุบัน: " . db_database());
- >
เมื่อเข้าถึงข้อมูล อย่าลืมใช้ฐานข้อมูลที่ถูกต้อง ไม่ใช่ฐานข้อมูลที่กำหนดใน PHPLIB คุณสามารถสร้างฟังก์ชัน wrapper สำหรับฐานข้อมูลหรือเปลี่ยนฟังก์ชันที่คุณใช้ได้ หากคุณใช้ mysql_query() คุณสามารถใช้ db_database() ก่อน คุณสามารถใช้
<? PHP
$result = mysql_db_query(db_database("bookcatalogue"), "select * from?",
db_connect());
- > ซึ่งแนะนำฟังก์ชัน: <? PHP
ฟังก์ชั่น db_query($db_query_database, $db_query_sql) {
กลับ (mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
-
- >
แทนที่จะเป็น
<? PHP
db_database("รายการหนังสือ");
$result = mysql_query("select * from?", db_connect());
- ตอนนี้
คุณสามารถทำมันได้
ใช้ PHPLIB (หรือซอฟต์แวร์ที่คล้ายกัน) เพื่อเข้าถึงหลายฐานข้อมูล
.ขยายคลาส/วัตถุ
. ใส่การทดสอบวินิจฉัย
. สร้างไฟล์บันทึก