PHP MySQL เตรียมงบ
งบเตรียมการป้องกันการฉีด MySQL เป็นประโยชน์อย่างมาก
งบเตรียมและพารามิเตอร์ที่ถูกผูกไว้
เตรียมงบสำหรับการดำเนินการส่วนใหญ่ของคำสั่ง SQL เดียวกันและดำเนินการได้อย่างมีประสิทธิภาพมากขึ้น
ผลงานของงบเตรียมดังต่อไปนี้:
การปรับสภาพ: สร้างแม่แบบคำสั่ง SQL ที่ส่งไปยังฐานข้อมูล ค่าของพารามิเตอร์ที่สงวนไว้ "?" มาร์ค ตัวอย่างเช่น:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
การวิเคราะห์ฐานข้อมูลรวบรวมดำเนินการเพิ่มประสิทธิภาพการค้นหาแม่แบบงบ SQL และเก็บผลที่ได้คือไม่เอาท์พุท
การดำเนินการ: ในที่สุดค่าของพารามิเตอร์ที่ส่งผ่านไปยังโปรแกรมประยุกต์ที่มีผลผูกพัน ( "?" มาร์ค), ฐานข้อมูลงบดำเนินการ การประยุกต์ใช้งานสามารถดำเนินการได้หลายครั้งถ้าค่าพารามิเตอร์ที่ไม่เหมือนกัน
เมื่อเทียบกับการดำเนินการโดยตรงของคำสั่ง SQL งบเตรียมมีสองข้อได้เปรียบหลัก:
เตรียมงบช่วยลดเวลาการวิเคราะห์เพียงแบบสอบถาม (แม้ว่างบจะดำเนินการ)
พารามิเตอร์ที่ถูกผูกไว้เพื่อลดแบนด์วิดธ์ของเซิร์ฟเวอร์คุณจะต้องส่งแบบสอบถามพารามิเตอร์แทนคำสั่งทั้งหมด
งบเตรียมต่อต้านการฉีด SQL เป็นประโยชน์อย่างมากเพราะหลังจากที่ใช้โปรโตคอลที่แตกต่างกันในการส่งค่าพารามิเตอร์เพื่อให้แน่ใจว่าถูกต้องของข้อมูล
MySQLi เตรียมงบ
ตัวอย่างต่อไปนี้ใช้ MySQLi ในงบเตรียมและผูกพารามิเตอร์ที่เกี่ยวข้อง:
ตัวอย่าง (MySQLi ใช้งบเตรียม)
$ Servername = "localhost";
$ username = "ชื่อผู้ใช้";
รหัสผ่าน $ = "รหัสผ่าน";
$ Dbname = "myDB";
// สร้างการเชื่อมต่อ
$ Conn = mysqli ใหม่ ($ ServerName, $ ชื่อผู้ใช้รหัสผ่าน $, $ dbname);
// ทดสอบการเชื่อมต่อ
ถ้า ($ conn-> connect_error) {
ตาย ( "การเชื่อมต่อล้มเหลว:" $ conn-> connect_error.);
}
// การปรับสภาพและมีผลผูกพัน
$ Stmt = $ conn-> เตรียมความพร้อม ( "INSERT INTO MyGuests (ชื่อ, นามสกุล, อีเมล) VALUES (,,) ???");
$ Stmt-> bind_param ( "SSS", $ FirstName, $ นามสกุล, อีเมล $);
// ตั้งค่าพารามิเตอร์และดำเนินการ
$ นามสกุล = "จอห์น";
$ นามสกุล = "โด";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
$ นามสกุล = "แมรี่";
$ นามสกุล = "หม้อ";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
$ นามสกุล = "จูลี่";
$ นามสกุล = "Dooley";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
echo "บันทึกใหม่จะถูกแทรกประสบความสำเร็จ";
$ Stmt-> close ();
$ Conn-> close ();
?>
แยกแต่ละบรรทัดของรหัสในตัวอย่างต่อไปนี้:
ในคำสั่ง SQL ที่เราใช้เครื่องหมายคำถาม (?) ที่นี่เราสามารถแทนที่เครื่องหมายคำถามจำนวนเต็มสตริงแม่นยำสองจุดลอยตัวและค่าบูลีน
ถัดไปให้เราดูที่ bind_param () ฟังก์ชัน:
พารามิเตอร์ฟังก์ชั่นการผูก SQL และบอกค่าของพารามิเตอร์ฐานข้อมูล "สสส" คอลัมน์การประมวลผลพารามิเตอร์ชนิดข้อมูลสำหรับพารามิเตอร์ที่เหลือ อักขระบอกฐานข้อมูลที่สตริงพารามิเตอร์
มีสี่ชนิดของพารามิเตอร์:
- I - จำนวนเต็ม (จำนวนเต็ม)
- D - คู่ (จุดแม่นยำสองลอย)
- s - สตริง (String)
- B - หยด (วัตถุขนาดใหญ่ไบนารี: วัตถุขนาดใหญ่ binary)
แต่ละพารามิเตอร์จะต้องระบุประเภท
พารามิเตอร์ชนิดข้อมูลบอกว่าฐานข้อมูลที่คุณสามารถลดความเสี่ยงของการฉีดของ SQL
หมายเหตุ: หากคุณต้องการแทรกข้อมูลเพิ่มเติม (ท่านผู้ใช้) ตรวจสอบข้อมูลเป็นสิ่งสำคัญมาก |
PDO เตรียมงบใน
ตัวอย่างต่อไปนี้เราจะใช้งบเตรียมใน PDO และพารามิเตอร์ที่มีผลผูกพัน:
ตัวอย่าง (PDO ใช้งบเตรียม)
$ Servername = "localhost";
$ username = "ชื่อผู้ใช้";
รหัสผ่าน $ = "รหัสผ่าน";
$ Dbname = "myDBPDO";
try {
$ Conn = ใหม่ PDO ( "MySQL: host = $ servername; dbname = $ dbname", $ ชื่อผู้ใช้รหัสผ่าน $);
// การตั้งค่าโหมดยกเว้นข้อผิดพลาด PDO
$ Conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
// การปรับสภาพและ SQL พารามิเตอร์ผูก
$ Stmt = $ conn-> เตรียมความพร้อม ( "INSERT INTO MyGuests (ชื่อ, นามสกุล, อีเมล์)
VALUES (: FirstName ,: นามสกุล ,: อีเมล) ");
$ Stmt-> bindParam ( ': FirstName', $ FirstName);
$ Stmt-> bindParam ( 'นามสกุล', $ นามสกุล);
$ Stmt-> bindParam ( 'อีเมล', $ อีเมล);
// แทรกแถว
$ นามสกุล = "จอห์น";
$ นามสกุล = "โด";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
// แทรกแถวอื่น
$ นามสกุล = "แมรี่";
$ นามสกุล = "หม้อ";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
// แทรกแถวอื่น
$ นามสกุล = "จูลี่";
$ นามสกุล = "Dooley";
$ อีเมล์ = "[email protected]";
$ Stmt-> รัน ();
echo "บันทึกใหม่จะถูกแทรกประสบความสำเร็จ";
}
catch (PDOException $ E)
{
.. echo $ SQL "<br>" $ E-> getMessage ();
}
$ Conn = null;
?>