PHP PDO เตรียมงบและวิธีการจัดเก็บ
คู่มือการใช้งาน PHP PDO อ้างอิง
ฐานข้อมูลเป็นผู้ใหญ่มากขึ้นหลายคนสนับสนุนแนวคิดของงบที่เตรียมไว้
เป็นงบเตรียมอะไร? คิดว่ามันเป็นแม่แบบรวบรวมคุณต้องการที่จะเรียกใช้ SQL ซึ่งสามารถปรับแต่งโดยใช้พารามิเตอร์ตัวแปร งบเตรียมมีสองผลประโยชน์ที่สำคัญ:
- แบบสอบถามแก้ไขเท่านั้น (หรือการปรับสภาพ) ครั้งเดียว แต่สามารถดำเนินการได้หลายครั้งด้วยพารามิเตอร์เดียวกันหรือแตกต่างกัน เมื่อมีการสอบถามพร้อมฐานข้อมูลจะวิเคราะห์รวบรวมและดำเนินการตามแผนเพิ่มประสิทธิภาพการค้นหา สำหรับคำสั่งที่ซับซ้อนขั้นตอนนี้ใช้เวลานานถ้าคุณจะต้องทำซ้ำหลายครั้งกับพารามิเตอร์ที่แตกต่างกันแบบสอบถามเดียวกันแล้วกระบวนการจะช่วยลดความเร็วของการประยุกต์ใช้ โดยใช้คำสั่งหลีกเลี่ยงการเตรียมการทำซ้ำวิเคราะห์ / รวบรวม / รอบเพิ่มประสิทธิภาพ ในระยะสั้นงบเตรียมใช้ทรัพยากรน้อยลงและทำให้ทำงานได้เร็วขึ้น
- ให้พารามิเตอร์เพื่อเตรียมงบไม่จำเป็นต้องใช้เครื่องหมายคำพูดคนขับรถจะได้รับการจัดการโดยอัตโนมัติ หากใบสมัครเพียงใช้งบเตรียมเราสามารถมั่นใจได้ว่าจะไม่มีการฉีด SQL ( แต่ถ้าส่วนอื่น ๆ ของแบบสอบถามจะไม่หนีจากการป้อนข้อมูลที่จะสร้างแล้วยังคงมีความเสี่ยงของการฉีด SQL) ที่
เตรียมงบที่มีประโยชน์เพื่อให้พวกเขามีเพียงอย่างเดียวคือการประมวลผลแบบอะนาล็อกเมื่อคนขับไม่สนับสนุน PDO เพื่อให้แน่ใจว่าไม่คำนึงถึงว่าฐานข้อมูลมีฟังก์ชั่นที่คุณสามารถมั่นใจได้ว่าการใช้งานสามารถใช้รูปแบบการเข้าถึงข้อมูลเดียวกัน
แทรก PreparedStatements ซ้ำแล้วซ้ำอีก
ตัวอย่างต่อไปนี้โดยการแทนตัวยึดชื่อที่เหมาะสมที่มีชื่อและความคุ้มค่าในการดำเนินการการสอบถามแทรก
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
แทรก PreparedStatements ซ้ำแล้วซ้ำอีก
ตัวอย่างต่อไปนี้โดยการแทนชื่อและค่า? ยึดตำแหน่งที่จะดำเนินการสอบถามแทรก
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
ได้รับข้อมูลโดยใช้งบเตรียม
ตัวอย่างต่อไปนี้ในรูปแบบของการเข้าถึงคีย์ตามข้อมูลที่ให้ไว้แล้ว ท่านผู้ใช้ถูกปิดล้อมโดยอัตโนมัติในเครื่องหมายคำพูดจึงมีความเสี่ยงของ SQL โจมตีฉีดไม่มี
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
หากการสนับสนุนโปรแกรมควบคุมฐานข้อมูลแอพลิเคชันนี้ยังสามารถผูกเข้าและส่งออกพารามิเตอร์พารามิเตอร์ที่ส่งออกมักจะใช้เพื่อให้ได้ค่าจากการจัดเก็บ พารามิเตอร์ที่ส่งออกกว่าที่จะใช้ป้อนพารามิเตอร์ที่จะออกไปเล็กน้อยซับซ้อนมากขึ้นเพราะเมื่อมีผลผูกพันพารามิเตอร์การแสดงผลคุณต้องทราบพารามิเตอร์ของระยะเวลาที่กำหนด ถ้าค่าสำหรับพารามิเตอร์ที่มีค่ามากกว่าคำแนะนำที่มีผลผูกพันของความยาวก็จะเกิดข้อผิดพลาด
โทรขั้นตอนการเก็บไว้กับพารามิเตอร์การแสดงผล
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
นอกจากนี้คุณยังสามารถระบุทั้งเข้าและออกค่าของพารามิเตอร์ไวยากรณ์คือคล้ายกับพารามิเตอร์ที่ส่งออก ในตัวอย่างต่อไปสตริง "สวัสดี" จะถูกส่งผ่านไปยังขั้นตอนที่เก็บไว้เมื่อคืนขั้นตอนการเก็บสวัสดีจะถูกแทนที่ด้วยค่าตอบแทนของการจัดเก็บ
ด้วยอินพุต / พารามิเตอร์ที่ส่งออกจะเรียกเก็บขั้นตอน
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
การใช้งานที่ไม่ถูกต้องของตัวยึด
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>