PDO (PHP Data Object) เป็นสิ่งใหม่ใน PHP 5 เมื่อ PHP 6 กำลังจะออก PHP 6 จะใช้ PDO เพื่อประมวลผลฐานข้อมูลตามค่าเริ่มต้นเท่านั้น และจะย้ายส่วนขยายฐานข้อมูลทั้งหมดไปที่ PECL ดังนั้นค่าเริ่มต้นจึงไม่มีอีกต่อไป .php_mysql.dll และอื่น ๆ ฉันควรทำอย่างไร เราทำได้เพียงตามทันเวลาเท่านั้น ดังนั้นฉันจึงลองใช้ PDO (บทความนี้เป็นเพียงระดับเริ่มต้น ผู้เชี่ยวชาญสามารถข้ามไปได้ 555)
[PDO คืออะไร]
PDO เป็นฟีเจอร์ใหม่ที่สำคัญที่เพิ่มเข้ามาใน PHP 5 เพราะก่อน PHP 5 นั้น php4/php3 จะมีส่วนขยายฐานข้อมูลมากมายให้สื่อสารกับแต่ละส่วนได้ การเชื่อมต่อและการประมวลผล php_mysql.dll, php_pgsql.dll, php_mssql.dll, php_sqlite.dll และส่วนขยายอื่น ๆ ในการเชื่อมต่อ MySQL, PostgreSQL, MS SQL Server, SQLite ในทำนองเดียวกันเราต้องใช้ ADOdb, PEAR::DB, PHPlib : :คลาสนามธรรมของฐานข้อมูล เช่น DB นั้นยุ่งยากมากและไม่มีประสิทธิภาพในการช่วยเรา ท้ายที่สุดแล้ว ประสิทธิภาพของโค้ด PHP จะสูงมากจนเราสามารถเขียนมันใน C/C++ ได้โดยตรงได้อย่างไร ดังนั้นการเกิดขึ้นของ PDO จึงเป็นสิ่งที่หลีกเลี่ยงไม่ได้ ทุกคนควรยอมรับการใช้งานด้วยทัศนคติการเรียนรู้ที่สงบ บางทีคุณอาจพบว่ามันช่วยให้คุณประหยัดความพยายามได้มาก
[การติดตั้ง PDO]
ฉันใช้ Windows XP SP2 ดังนั้นกระบวนการทั้งหมดจึงดำเนินการบน Windows สำหรับ Linux/FreeBSD และแพลตฟอร์มอื่นๆ โปรดค้นหาข้อมูลและตั้งค่าการติดตั้งด้วยตัวเอง
ของฉันคือ PHP 5.1.4 ซึ่งมาพร้อมกับส่วนขยาย php_pdo.dll อยู่แล้ว แต่ต้องมีการตั้งค่าเล็กน้อยก่อนจึงจะสามารถใช้งานได้
เปิด c:windowsphp.ini ซึ่งเป็นไฟล์กำหนดค่า PHP ของฉัน และค้นหาบรรทัดต่อไปนี้:
extension_dir
นี่คือไดเร็กทอรีที่มีส่วนขยายของเราอยู่: C:php5ext จากนั้นฉันจะไป เปลี่ยนบรรทัดนี้เป็น:
extension_dir = "C:/php5/ext"
จากนั้นค้นหาภายใต้ php.ini:
;;;;;;;;;;;;;;;;;;;;;;;;
ส่วนขยายแบบไดนามิก ;
;;;;;;;;;;;;;;;;;;;;
มีหลายอย่างที่คล้ายกับ ;extension=php_mbstring.dll ด้านล่างนี้คือการกำหนดค่าสำหรับการโหลดส่วนขยาย PHP เพิ่มไว้ตอนท้าย ส่วนขยาย PDO ของเรา:
extension=php_pdo.dll
ส่วนขยาย=php_pdo_mysql.dll
ส่วนขยาย=php_pdo_pgsql.dll
ส่วนขยาย=php_pdo_sqlite.dll
ส่วนขยาย=php_pdo_mssql.dll
ส่วนขยาย=php_pdo_odbc.dll
ส่วนขยาย=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll
สามารถเพิ่มไดรเวอร์ PDO ต่างๆ ได้ แต่ php_pdo_oci8.dll ต่อไปนี้ เนื่องจากฉันไม่ได้ติดตั้งฐานข้อมูล Oralce จึงไม่มีสิ่งนี้ ดังนั้นฉันจึงใช้เครื่องหมายอัฒภาคเพื่อแสดงความคิดเห็น จากนั้นรีสตาร์ทเว็บเซิร์ฟเวอร์ของเรา IIS/Apache ของฉันคือ IIS เฮ้ คุณดูถูกฉัน บน Windows มันง่ายมาก
หลังจากรีสตาร์ท ให้เขียนไฟล์ phpinfo.php ในไดเร็กทอรีเอกสารของเว็บเซิร์ฟเวอร์ของเรา และเพิ่ม:
<?
phpinfo();
?>
จากนั้นเปิดเบราว์เซอร์ที่น่ารักของเรา: IE/FireFox ของฉันคือ FireFox 2.0 ฉันเพิ่งดาวน์โหลดมัน เยี่ยมมาก ฉันไม่กลัวซอฟต์แวร์โกง 555
ป้อนในเบราว์เซอร์: http://localhost/phpinfo.php . หากเส้นทางไปยังหน้านี้ไม่สอดคล้องกัน โปรดป้อนด้วยตนเอง
ในเนื้อหาเอาต์พุต หากคุณสามารถเห็นได้สำเร็จ:
PDO
เปิดใช้งานการสนับสนุน PDO แล้ว
ไดรเวอร์ PDO mysql, pgsql, sqlite, mssql, odbc, firebird
มีคำแนะนำไดรเวอร์ต่างๆ อยู่ด้านหลัง: PDO_Firebird, pdo_mssql, pdo_mysql, PDO_ODBC, pdo_pgsql,
pdo_sqlite .
[ทดสอบด่วน]
ฉันใช้ MySQL 4.0.26 แต่ฉันแนะนำให้ทุกคนใช้ MySQL 4.1.x หรือ MySQL 5.0.x เป็นการส่วนตัว เพราะเวอร์ชันเหล่านั้นมีสิ่งที่น่าสนใจมากมายที่ควรค่าแก่การเรียนรู้ สิ่งที่ PDO ของเราต้องเชื่อมต่อคือ MySQL 4.0 ของฉัน หากคุณยังไม่ได้ติดตั้ง MySQL โปรดติดตั้งด้วยตนเอง เราได้สร้าง MySQL และเพิ่ม table foo ลงในไลบรารีทดสอบ รวมถึงสี่ฟิลด์ เช่น ID ชื่อ เพศ และเวลา
เราเริ่มสร้างแอปพลิเคชัน PDO แรกและสร้างไฟล์ pdo.php ในไดเร็กทอรีเอกสารเว็บ:
<?php
$dsn = "mysql:host=localhost;dbname=test";
$db = PDO ใหม่($dsn, 'root', '');
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
สะท้อน $ นับ;
$db = โมฆะ;
?>
ฉันไม่เข้าใจความหมาย ค่อยๆ อธิบายกันดีกว่า บรรทัดนี้:
$dsn = "mysql:host=localhost;dbname=test";
คือการสร้าง DSN ของเรา (แหล่งข้อมูล) ดูข้อมูลภายใน: ประเภทฐานข้อมูลคือ mysql ที่อยู่โฮสต์คือ localhost และชื่อฐานข้อมูล เป็นการทดสอบข้อมูลเพียงไม่กี่ชิ้น วิธีสร้างแหล่งข้อมูลของฐานข้อมูลที่แตกต่างกันจะแตกต่างกัน
$db = new PDO($dsn, 'root', '');
เตรียมใช้งานออบเจ็กต์ PDO พารามิเตอร์ตัวแรกคือแหล่งข้อมูลของเรา พารามิเตอร์ตัวที่สองคือผู้ใช้ที่เชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูล และพารามิเตอร์ตัวที่สามคือรหัสผ่าน . เราไม่สามารถรับประกันได้ว่าการเชื่อมต่อจะสำเร็จ เราจะพูดถึงข้อยกเว้นในภายหลัง
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
echo $count;
เรียกออบเจ็กต์ PDO ที่เชื่อมต่อสำเร็จแล้วเพื่อดำเนินการค้นหา แบบสอบถามนี้เป็นการดำเนินการเพื่อแทรกบันทึก การใช้เมธอด PDO::exec() จะส่งกลับผลลัพธ์ที่ส่งผลต่อบันทึก ดังนั้นเราจึงส่งออกผลลัพธ์นี้ สุดท้ายนี้ คุณยังต้องสิ้นสุดทรัพยากรอ็อบเจ็กต์:
$db = null;
โดยค่าเริ่มต้น นี่ไม่ใช่การเชื่อมต่อที่ยาวนาน หากคุณต้องการเชื่อมต่อกับฐานข้อมูลเป็นเวลานาน คุณจะต้องเพิ่มพารามิเตอร์สุดท้าย: array(PDO::ATTR_PERSISTENT) => จริง) มันจะกลายเป็นแบบนี้:
$db = new PDO( $dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));
มันช่างเป็นการดำเนินการที่ง่ายดายมาก จากอันที่แล้ว แต่จะค่อนข้างคล้ายกับ ADOdb
[เรียนรู้ต่อ]
หากเราต้องการดึงข้อมูลเราควรใช้ฟังก์ชันการรับข้อมูล ($db ที่ใช้ด้านล่างนี้คืออ็อบเจ็กต์ทั้งหมดที่เชื่อมต่อด้านบน)
<?php
foreach($db->query("SELECT * FROM foo")){
print_r($แถว);
-
?>
นอกจากนี้เรายังสามารถใช้วิธีการได้มานี้:
<?php
$rs = $db->query("SELECT * FROM foo");
ในขณะที่($row = $rs->ดึงข้อมูล()){
print_r($แถว);
-
?>
หากคุณต้องการนำข้อมูลทั้งหมดไปไว้ในอาเรย์พร้อมกัน คุณสามารถทำได้:
<?php
$rs = $db->query("SELECT * FROM foo");
$result_arr = $rs->fetchAll();
print_r($ผลลัพธ์_arr);
?>
อาร์เรย์
([0] => อาร์เรย์(
[รหัส] => 1
[0] => 1
[name] => เฮย์เยลูเรน
[1] =>เฮย์เยลูเรน
[เพศ] =>ชาย[2] =>ชาย[เวลา] =>2006-10-28 23:14:23
[3] => 28-10-2549 23:14:23 น
-
}
สิ้น
เปลืองทรัพยากร
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($ผลลัพธ์_arr);
?>
ดูโค้ดด้านบน เมธอด setAttribute() คือการตั้งค่าคุณลักษณะบางอย่าง เช่น PDO::ATTR_CASE, PDO::ATTR_ERRMODE เป็นต้น สิ่งที่เราต้องตั้งค่าที่นี่คือ PDO::ATTR_CASE นั่นคือ เราใช้ดัชนีที่เกี่ยวข้องเพื่อรับข้อมูล เมื่อตั้งค่า มีหลายตัวเลือกว่าดัชนีที่เกี่ยวข้องเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก:
PDO::CASE_LOWER -- บังคับให้ชื่อคอลัมน์เป็นตัวพิมพ์เล็ก PDO::CASE_NATURAL -- ชื่อคอลัมน์จะเป็น ด้วยวิธีดั้งเดิม PDO::CASE_UPPER -- บังคับชื่อคอลัมน์ให้เป็นตัวพิมพ์ใหญ่
เราใช้เมธอด setFetchMode เพื่อกำหนดประเภทของค่าที่ส่งคืนเพื่อรับชุดผลลัพธ์ ประเภทเดียวกันคือ:
PDO::FETCH_ASSOC -- แบบฟอร์มอาร์เรย์ที่เชื่อมโยง ::FETCH_NUM -- แบบฟอร์มอาร์เรย์ดัชนีตัวเลข PDO::FETCH_BOTH -- ทั้งสองรูปแบบอาร์เรย์ ใช่ นี่คือค่าเริ่มต้น PDO::FETCH_OBJ - ในรูปแบบของวัตถุ คล้ายกับ mysql_fetch_object() ก่อนหน้า
แน่นอน ใช้ PDO::FETCH_ASSOC สิ่งที่จะใช้โดยเฉพาะขึ้นอยู่กับความต้องการของคุณเอง คู่มืออ้างอิงประเภทการซื้อกิจการอื่น ๆ
นอกจากวิธีการรับข้อมูลข้างต้นแล้ว ยังมีวิธีนี้อีกด้วย:
<?php
$rs = $db->prepare("SELECT * FROM foo");
$rs->ดำเนินการ();
ในขณะที่($row = $rs->ดึงข้อมูล()){
print_r($แถว);
-
?>
จริงๆ แล้วมันก็เกือบจะเหมือนกันเลย หากคุณต้องการรับผลลัพธ์ของฟิลด์ในบันทึกที่ระบุ คุณสามารถใช้ PDOStatement::fetchColumn():
<?php
$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
เสียงสะท้อน $col;
?>
โดยทั่วไป fetchColumn() ใช้ในการดำเนินการสถิติการนับ หรือบางบันทึกที่ต้องการเพียงฟิลด์เดียวก็ดำเนินการได้ง่าย
เพื่อสรุปการดำเนินการข้างต้นโดยย่อ:
การดำเนินการค้นหาส่วนใหญ่เป็น PDO::query(), PDO::exec() และ PDO::prepare() PDO::query() ส่วนใหญ่จะใช้สำหรับการดำเนินการที่ส่งคืนผลลัพธ์ที่บันทึกไว้ โดยเฉพาะการดำเนินการ SELECT PDO::exec() ส่วนใหญ่จะใช้สำหรับการดำเนินการที่ไม่ส่งคืนชุดผลลัพธ์ เช่น INSERT, UPDATE, DELETE และการดำเนินการอื่น ๆ ส่งคืน ผลลัพธ์คือจำนวนคอลัมน์ที่ได้รับผลกระทบจากการดำเนินการปัจจุบัน PDO::prepare() ส่วนใหญ่เป็นการดำเนินการล่วงหน้า คุณต้องใช้ $rs->execute() เพื่อดำเนินการคำสั่ง SQL ในการประมวลผลล่วงหน้า วิธีนี้สามารถผูกพารามิเตอร์และไม่สามารถอธิบายได้ง่ายๆ ในบทความนี้ คุณสามารถดูคู่มือและเอกสารอื่นๆ ได้ การดำเนินการหลักในการรับชุดผลลัพธ์คือ: PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL() PDOStatement::fetchColumn() เป็นฟิลด์ของเรกคอร์ดแรกที่ระบุในผลลัพธ์การดึงข้อมูล ค่าเริ่มต้นคือฟิลด์แรก PDOStatement::fetch() ใช้เพื่อรับบันทึก และ PDOStatement::fetchAll() ใช้เพื่อรับชุดบันทึกทั้งหมดเป็นชุดเดียว หากต้องการรับผลลัพธ์ คุณสามารถตั้งค่าประเภทของชุดผลลัพธ์ที่ต้องการผ่าน PDOStatement::setFetchMode .
นอกจากนี้ยังมีการดำเนินการโดยรอบสองรายการ การดำเนินการหนึ่งคือ PDO::lastInsertId() และ PDOStatement::rowCount() PDO::lastInsertId() ส่งคืนการดำเนินการแทรกครั้งล่าสุด และประเภทคอลัมน์คีย์หลักคือ ID การเพิ่มอัตโนมัติครั้งสุดท้าย PDOStatement::rowCount() ส่วนใหญ่จะใช้สำหรับชุดผลลัพธ์ที่ได้รับผลกระทบจากการดำเนินการ DELETE, INSERT และ UPDATE ของ PDO::query() และ PDO::prepare() และไม่ถูกต้องสำหรับเมธอด PDO::exec() และการดำเนินการ SELECT
[การจัดการข้อผิดพลาด]
คุณควรทำอย่างไรหากพบข้อผิดพลาดในโปรแกรม? เราอธิบายข้อมูลข้อผิดพลาดและการจัดการข้อยกเว้นของคลาส PDO ที่นี่
1. แนวทางเชิงวัตถุ
ก่อนอื่นมาดูวิธีจัดการกับข้อผิดพลาดในการเชื่อมต่อ ฯลฯ และใช้แนวทางเชิงวัตถุเพื่อจัดการ:
<?php
พยายาม {
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$db = โมฆะ;
} จับ (PDOException $e) {
พิมพ์ "ข้อผิดพลาด: " . $e->getMessage() .
ตาย();
-
?>
ที่นี่เราใช้คุณสมบัติการจัดการข้อยกเว้นเชิงวัตถุของ PHP 5 หากมีข้อยกเว้น เราจะเริ่มต้นมันโดยการเรียก PDOException เพื่อเริ่มต้นคลาสข้อยกเว้น
โครงสร้างแอตทริบิวต์ของคลาสข้อยกเว้น PDOException:
<?php
คลาส PDOException ขยายข้อยกเว้น
-
public $errorInfo = null; // สำหรับข้อมูลข้อผิดพลาด คุณสามารถเรียก PDO::errorInfo() หรือ PDOStatement::errorInfo() เพื่อเข้าถึง $message ที่มีการป้องกัน; // สำหรับข้อมูลข้อยกเว้น คุณสามารถลอง Exception::getMessage() เข้าถึงรหัสป้องกัน $code ; // รหัสข้อผิดพลาดสถานะ SQL ซึ่งสามารถเข้าถึงได้โดยใช้ข้อยกเว้น::getCode()
-
?>
คลาสการจัดการข้อยกเว้นนี้ถูกรวมเข้ากับคลาสการจัดการข้อยกเว้นในตัวของ PHP 5 มาดูโครงสร้างของคลาสการจัดการข้อยกเว้นในตัวของ PHP 5 กัน:
<?php
คลาสข้อยกเว้น
-
//คุณสมบัติป้องกัน $message = 'ข้อยกเว้นที่ไม่รู้จัก'; //ข้อความข้อยกเว้นป้องกัน $code = 0; //รหัสข้อยกเว้นที่ผู้ใช้กำหนดป้องกัน $file; //รหัส โดยที่เกิดข้อยกเว้น หมายเลขบรรทัด
// ฟังก์ชันสุดท้าย getMessage(); // ส่งคืนข้อมูลข้อยกเว้น ฟังก์ชันสุดท้าย getCode(); // ส่งคืนโค้ดข้อยกเว้น ฟังก์ชันสุดท้าย getFile(); // ส่งคืนชื่อไฟล์ที่มีข้อยกเว้นเกิดขึ้น ฟังก์ชันสุดท้าย getLine (); // Return หมายเลขบรรทัดโค้ดที่มีข้อยกเว้นเกิดขึ้น ฟังก์ชันสุดท้าย getTrace() // backtrace() ฟังก์ชันสุดท้าย getTraceAsString(); // getTrace() ข้อมูลจัดรูปแบบเป็นสตริง
-
?>
ตามลำดับ getFile() และ getLine() สามารถเรียกในโค้ดได้อย่างเหมาะสมเพื่อค้นหาข้อผิดพลาดและทำให้การแก้ไขจุดบกพร่องสะดวกยิ่งขึ้น
2. ใช้แนวทางเชิงกระบวนการ
เพื่อดูโค้ดก่อน:
<?
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$rs = $db->query("SELECT aa,bb,cc FROM foo");
ถ้า ($db->errorCode() != '00000'){
print_r($db->errorInfo());
ออก;
-
$arr = $rs->fetchAll();
print_r($arr);
$db = โมฆะ;
?>
ออบเจ็กต์ PDO และ PDOStatement มีเมธอด errorCode() และ errorInfo() หากไม่มีข้อผิดพลาด errorCode() จะส่งกลับ: 00000 มิฉะนั้นรหัสข้อผิดพลาดบางส่วนจะถูกส่งกลับ errorInfo() ส่งคืนอาร์เรย์ รวมถึงรหัสข้อผิดพลาดที่กำหนดโดยรหัสข้อผิดพลาด PHP และ MySQL และข้อมูลข้อผิดพลาด โครงสร้างอาร์เรย์จะเป็นดังนี้
:
-
[0] => 42S22
[1] => 1,054
[2] => คอลัมน์ที่ไม่รู้จัก 'aaa' ใน 'รายการฟิลด์'
)
หลังจากดำเนินการค้นหาแต่ละครั้ง ผลลัพธ์ของ errorCode() จะเป็นผลลัพธ์ล่าสุด ดังนั้นเราจึงสามารถควบคุมข้อความแสดงข้อผิดพลาดที่แสดงด้วยตนเองได้อย่างง่ายดาย
[สรุปง่ายๆ]
จากการใช้งานข้างต้น เราจะเห็นได้ว่า PDO นั้นทรงพลังจริงๆ นอกจากนี้ยังมีสิ่งอื่นๆ ที่ไม่ได้กล่าวถึง เช่น Binding parameter, Preprocessing, Stored Procedure, Transaction Processing และฟังก์ชันอื่นๆ นอกจากนี้ยังมีโครงสร้าง DSN การขยายข้อมูลที่แตกต่างกัน ฐานข้อมูล Oracle มีสิ่งพิเศษมากมายที่ต้องศึกษาและทำความเข้าใจในเชิงลึกเท่านั้น