0x01: ทดสอบว่าติดตั้ง PDO เรียบร้อยแล้ว
เรียกใช้รหัสต่อไปนี้ หากพารามิเตอร์ไม่ถูกต้องหมายความว่าติดตั้ง PDO แล้ว หากไม่มีวัตถุให้แก้ไขไฟล์การกำหนดค่า PHP php.ini และยกเลิกความคิดเห็นใน php_pdo_yourssqlserverhere.extis ก่อนหน้า
การคัดลอกรหัสมีดังนี้:
$ test = new PDO ();
0x02: เชื่อมต่อกับฐานข้อมูล
เรียกใช้เซิร์ฟเวอร์ Apache และยืนยันว่าเซิร์ฟเวอร์ทำงานแล้วและการติดตั้ง PDO นั้นสำเร็จ จากนั้นให้เชื่อมต่อกับฐานข้อมูล
การคัดลอกรหัสมีดังนี้:
$ dsn = 'mysql: dbname = demo; host = localhost; port = 3306';
$ username = 'root';
$ password = 'password_here';
พยายาม {
$ db = new PDO ($ dsn, $ username, $ รหัสผ่าน);
} catch (pdoexception $ e) {
ตาย ('ไม่สามารถเชื่อมต่อกับฐานข้อมูล:
- $ e);
-
0x03: แบบสอบถามพื้นฐาน
การใช้แบบสอบถามและ EXEC ใน PDO ทำให้ฐานข้อมูลแบบสอบถามง่ายมาก หากคุณต้องการได้รับจำนวนแถวของผลลัพธ์การสืบค้นมันมีประโยชน์มากสำหรับคำสั่งค้นหาแบบสอบถาม
การคัดลอกรหัสมีดังนี้:
$ attement = <<< SQL
เลือก *
จาก `อาหาร '
โดยที่ `Healthy` = 0
SQL;
$ foods = $ db-> query ($ attement);
หากคำถามด้านบนถูกต้องตอนนี้ $ Foods เป็นวัตถุคำสั่ง PDO ซึ่งเราสามารถรับผลลัพธ์ที่เราต้องการและจำนวนชุดผลลัพธ์ที่เราได้สอบถามทั้งหมด
0x04: รับจำนวนแถว
หากคุณใช้ฐานข้อมูล MySQL คำสั่ง PDO มีวิธี RowCount เพื่อรับจำนวนแถวในชุดผลลัพธ์ดังที่แสดงในรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
echo $ foods-> rowcount;
0x05: ชุดผลลัพธ์ Traversal
สถิติ PDO สามารถข้ามได้โดยใช้คำสั่ง forech ดังที่แสดงในรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
foreach ($ foods-> fetchall () เป็น $ food) {
echo $ food ['name'] -
-
-
PDO ยังรองรับวิธีการดึงข้อมูลซึ่งส่งคืนผลลัพธ์แรกเท่านั้น
0x06: หลบหนีอักขระพิเศษที่ป้อนโดยผู้ใช้
PDO จัดเตรียมวิธีการที่เรียกว่าใบเสนอราคาซึ่งช่วยให้อักขระพิเศษสามารถหลบหนีจากสถานที่ที่มีเครื่องหมายคำพูดในสตริงอินพุต
การคัดลอกรหัสมีดังนี้:
$ input = นี่คือ 'A' 'Danger'rous str'ing
หลังจากถ่ายโอนโดยใช้วิธีใบเสนอราคา:
การคัดลอกรหัสมีดังนี้:
$ db-> quote ($ input): 'นี่คือ/' s/'a/'/'/' pretty danger/'rous str/' ing '
0x07: exec ()
PDO สามารถใช้วิธี EXEC () เพื่อใช้การอัปเดตลบและแทรกการดำเนินการ หลังจากดำเนินการแล้วมันจะส่งคืนจำนวนแถวที่ได้รับผลกระทบ:
การคัดลอกรหัสมีดังนี้:
$ attement = <<< SQL
ลบออกจาก `อาหาร '
โดยที่ `Healthy` = 1;
SQL;
echo $ db-> exec ($ attement);
0x08: คำสั่งประมวลผลล่วงหน้า
แม้ว่าวิธีการและการสืบค้นของ EXEC ยังคงใช้กันอย่างแพร่หลายและสนับสนุนใน PHP แต่เว็บไซต์ทางการของ PHP ยังคงต้องการให้ทุกคนใช้งบการประมวลผลล่วงหน้าเพื่อแทนที่พวกเขา ทำไม ส่วนใหญ่เป็นเพราะ: ปลอดภัยกว่า คำสั่งประมวลผลล่วงหน้าไม่ได้แทรกพารามิเตอร์โดยตรงลงในแบบสอบถามจริงซึ่งหลีกเลี่ยงการฉีด SQL ที่มีศักยภาพจำนวนมาก
อย่างไรก็ตามด้วยเหตุผลบางอย่าง PDO ไม่ได้ใช้การประมวลผลล่วงหน้าจริง ๆ มันจำลองวิธีการประมวลผลล่วงหน้าแทรกข้อมูลพารามิเตอร์ลงในคำสั่งก่อนที่จะส่งคำสั่งไปยังเซิร์ฟเวอร์ SQL ซึ่งทำให้บางระบบมีความไวต่อการฉีด SQL
หาก SQL Server ของคุณไม่สนับสนุนการประมวลผลล่วงหน้าเราสามารถแก้ไขปัญหานี้ได้อย่างง่ายดายโดยการผ่านพารามิเตอร์ในระหว่างการเริ่มต้น PDO ดังนี้:
การคัดลอกรหัสมีดังนี้:
$ db-> setAttribute (pdo :: attr_emulate_prepares, false);
นี่คือคำแถลงการประมวลผลล่วงหน้าครั้งแรกของเรา:
การคัดลอกรหัสมีดังนี้:
$ attement = $ db-> เตรียม ('เลือก * จากอาหารที่ `name` =? และ` Healthy` =?');
$ attement2 = $ db-> เตรียม ('เลือก * จากอาหารที่ `name` =: ชื่อและ` สุขภาพ' =: สุขภาพดี) ';
ดังที่แสดงในรหัสข้างต้นมีสองวิธีในการสร้างพารามิเตอร์ชื่อและนิรนาม (ไม่สามารถปรากฏในคำสั่งเดียวในเวลาเดียวกัน) จากนั้นคุณสามารถใช้ bindValue เพื่อพิมพ์ในอินพุตของคุณ:
การคัดลอกรหัสมีดังนี้:
$ attement-> bindValue (1, 'เค้ก');
$ attement-> bindValue (2, true);
$ attement2-> bindValue (': ชื่อ', 'พาย');
$ attement2-> bindValue (': สุขภาพดี', เท็จ);
โปรดทราบว่าเมื่อใช้พารามิเตอร์ชื่อคุณต้องรวมลำไส้ใหญ่ (:) PDO ยังมีวิธี BindParam ซึ่งสามารถผูกค่าตัวเลขโดยการอ้างอิงนั่นคือมันจะมองหาค่าตัวเลขที่สอดคล้องกันเท่านั้นเมื่อมีการดำเนินการคำสั่ง
สิ่งเดียวที่ต้องทำในตอนนี้คือการดำเนินการคำสั่งของเรา:
การคัดลอกรหัสมีดังนี้:
$ attement-> execute ();
$ attement2-> execute ();
// รับผลลัพธ์ของเรา:
$ cake = $ attement-> fetch ();
$ pie = $ attement2-> fetch ();
เพื่อหลีกเลี่ยงการใช้เพียงชิ้นส่วนรหัส bindValue คุณสามารถใช้อาร์เรย์เพื่อให้วิธีการดำเนินการเป็นพารามิเตอร์เช่นนี้:
การคัดลอกรหัสมีดังนี้:
$ attement-> execute (array (1 => 'cake', 2 => true));
$ attement2-> execute (array (': name' => 'Pie', ': Healthy' => false));
0x09: ธุรกรรม
การทำธุรกรรมคือการดำเนินการชุดของการสืบค้น แต่ไม่ได้บันทึกผลกระทบต่อฐานข้อมูล ข้อได้เปรียบของสิ่งนี้คือถ้าคุณดำเนินการคำสั่งแทรกการพึ่งพาซึ่งกันและกัน 4 ครั้งเมื่อล้มเหลวคุณสามารถย้อนกลับเพื่อให้ข้อมูลอื่นไม่สามารถแทรกลงในฐานข้อมูลได้เพื่อให้แน่ใจว่าสามารถแทรกฟิลด์ที่พึ่งพาซึ่งกันและกันได้อย่างถูกต้อง คุณต้องตรวจสอบให้แน่ใจว่าเอ็นจินฐานข้อมูลที่คุณใช้การสนับสนุนธุรกรรม
0x10: เริ่มธุรกรรม
คุณสามารถใช้วิธีการเริ่มต้น () เพื่อเริ่มการทำธุรกรรม:
การคัดลอกรหัสมีดังนี้:
$ db-> artialTransaction ();
$ db-> Intransaction (); // จริง!
จากนั้นคุณสามารถดำเนินการตามคำสั่งการดำเนินการฐานข้อมูลของคุณต่อไปและส่งธุรกรรมในตอนท้าย:
การคัดลอกรหัสมีดังนี้:
$ db-> commit ();
นอกจากนี้ยังมีวิธีการย้อนกลับ () ที่คล้ายกับ MySQLI แต่มันไม่ได้ย้อนกลับทุกประเภท (ตัวอย่างเช่นการใช้ตารางดร็อปใน MySQL) วิธีนี้ไม่น่าเชื่อถือจริงๆฉันขอแนะนำให้พยายามหลีกเลี่ยงการพึ่งพาวิธีนี้
0x11: ตัวเลือกที่มีประโยชน์อื่น ๆ
มีหลายตัวเลือกที่คุณสามารถพิจารณาได้ สิ่งเหล่านี้สามารถป้อนเป็นพารามิเตอร์ที่สี่เมื่อวัตถุของคุณเริ่มต้น
การคัดลอกรหัสมีดังนี้:
$ options = array ($ optup1 => $ value1, $ opption [.. ]);
$ db = new PDO ($ dsn, $ username, $ รหัสผ่าน, $ ตัวเลือก);
pdo :: attr_default_fetch_mode
คุณสามารถเลือกชุดผลลัพธ์ประเภท PDO ที่จะกลับมาเช่น pdo :: fetch_assoc ซึ่งจะช่วยให้คุณใช้เงิน $ ผลลัพธ์ ['column_name'] หรือ pdo :: fetch_obj ซึ่งจะส่งคืนวัตถุที่ไม่ระบุชื่อเพื่อให้คุณสามารถใช้ $ result-> column_name
นอกจากนี้คุณยังสามารถใส่ผลลัพธ์ลงในคลาสที่เฉพาะเจาะจง (รุ่น) โดยการตั้งค่าโหมดการอ่านสำหรับแต่ละแบบสอบถามเช่นนี้:
การคัดลอกรหัสมีดังนี้:
$ query = $ db-> query ('เลือก * จาก `foods`');
$ foods = $ query-> fetchall (pdo :: fetch_class, 'อาหาร');
pdo :: attr_errmode
เราได้อธิบายสิ่งนี้ไว้ข้างต้น แต่ผู้ที่ชอบ Trycatch จำเป็นต้องใช้: PDO :: errmode_exception หากคุณต้องการส่งคำเตือน PHP ด้วยเหตุผลใดก็ตามให้ใช้ PDO :: errmode_warning
pdo :: attr_timeout
เมื่อคุณกังวลเกี่ยวกับเวลาในการโหลดคุณสามารถใช้คุณสมบัตินี้เพื่อระบุเวลาหมดเวลาสำหรับการสืบค้นของคุณในไม่กี่วินาที โปรดทราบว่าหากเวลาที่คุณตั้งค่าเกินกว่าเวลาข้อยกเว้น e_warning เริ่มต้นจะถูกโยนเว้นแต่จะมีการเปลี่ยนแปลง pdo :: attr_errmode