ล่าสุดการพัฒนาเว็บบทเรียน
×

PHP เกี่ยวกับการสอน

PHP บ้าน PHP แนะนำ PHP ติดตั้ง PHP วากยสัมพันธ์ PHP ตัวแปร PHP Echo / พิมพ์ PHP ชนิดข้อมูล PHP เงื่อนไข PHP ค่าคงที่ PHP ผู้ประกอบการ PHP If...Else...Elseif PHP Switch PHP ในขณะที่ลูป PHP สำหรับลูป PHP ฟังก์ชั่น PHP แถว PHP เรียงลำดับอาร์เรย์ PHP Superglobals

PHP การจัดการ

PHP ฟอร์ม การจัดการ PHP ฟอร์ม การตรวจสอบ PHP ฟอร์ม จำเป็นต้องใช้ PHP ฟอร์ม URL/E-mail PHP ฟอร์ม สมบูรณ์

PHP สูง

PHP อาร์เรย์หลายมิติ PHP วันและเวลา PHP ประกอบด้วย PHP ไฟล์ การจัดการ PHP ไฟล์ เปิด / อ่าน PHP ไฟล์ สร้าง / เขียน PHP ไฟล์ อัปโหลด PHP Cookies PHP Sessions PHP ฟิลเตอร์ PHP Filters สูง PHP ผิดพลาด การจัดการ PHP ข้อยกเว้น

MySQL Database

MySQL ฐานข้อมูล MySQL สัมพันธ์ MySQL Create DB MySQL Create ตาราง MySQL Insert Data MySQL รับ ID เข้าครั้งสุดท้าย MySQL ใส่หลาย MySQL Prepared MySQL Select Data MySQL Delete Data MySQL Update Data MySQL Limit Data

PHP - XML

PHP XML parsers PHP SimpleXML Parser PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX แนะนำ AJAX PHP AJAX ฐานข้อมูล AJAX XML AJAX ค้นหาสด AJAX RSS Reader AJAX โพลล์

PHP Examples

PHP ตัวอย่าง PHP ทดสอบ PHP ใบรับรอง

PHP การอ้างอิง

PHP แถว PHP ปฏิทิน PHP วันที่ PHP ไดเรกทอรี PHP ผิดพลาด PHP ระบบแฟ้ม PHP กรอง PHP FTP PHP HTTP PHP Libxml PHP จดหมาย PHP คณิตศาสตร์ PHP อื่น ๆ PHP MySQLi PHP SimpleXML PHP เชือก PHP XML PHP Zip PHP ช่วงเวลา

 

PHPงบเตรียม


งบเตรียมจะมีประโยชน์มากกับการฉีด SQL


งบเตรียมและพารามิเตอร์ที่ถูกผูกไว้

งบเตรียมเป็นคุณสมบัติที่ใช้ในการดำเนินการเดียวกัน (or similar) คำสั่ง SQL ซ้ำ ๆ ที่มีประสิทธิภาพสูง

งบเตรียมพื้นทำงานเช่นนี้:

  1. เตรียม: แม่แบบคำสั่ง SQL จะถูกสร้างขึ้นและถูกส่งตัวไปยังฐานข้อมูล ค่าบางอย่างที่เหลือที่ไม่ได้ระบุเรียกว่าพารามิเตอร์ (labeled "?") ตัวอย่าง: INSERT INTO MyGuests VALUES(?, ?, ?)
  2. ฐานข้อมูลแยก, รวบรวมและดำเนินการเพิ่มประสิทธิภาพการค้นหาแม่แบบคำสั่ง SQL และเก็บผลที่ได้โดยไม่ต้องรันมัน
  3. ดำเนินการ: ในเวลาต่อมาแอพลิเคชันผูกค่าพารามิเตอร์และฐานข้อมูลรันคำสั่ง โปรแกรมประยุกต์อาจรันคำสั่งหลายครั้งตามที่มันต้องการที่มีค่าที่แตกต่าง

เมื่อเทียบกับการดำเนินการคำสั่ง SQL โดยตรงงบเตรียมมีสองข้อได้เปรียบหลัก:

  • เตรียมงบช่วยลดเวลาในการแยกการจัดทำแบบสอบถามที่มีการทำเพียงครั้งเดียว (although the statement is executed multiple times)
  • พารามิเตอร์ผูกพันลดแบนด์วิดธ์ไปยังเซิร์ฟเวอร์ที่คุณต้องการส่งพารามิเตอร์เท่านั้นในแต่ละครั้งและไม่แบบสอบถามทั้งหมด
  • งบเตรียมจะมีประโยชน์มากกับการฉีด SQL เพราะค่าพารามิเตอร์ซึ่งจะถูกส่งในภายหลังโดยใช้โปรโตคอลที่แตกต่างกันไม่จำเป็นต้องหนีออกมาได้อย่างถูกต้อง ถ้าแม่แบบคำสั่งเดิมจะไม่ได้มาจากการป้อนข้อมูลภายนอกฉีด SQL ไม่สามารถเกิดขึ้นได้

เตรียมงบใน MySQLi

ตัวอย่างต่อไปนี้ใช้งบเตรียมและพารามิเตอร์ที่ถูกผูกไว้ใน MySQLi:

ตัวอย่าง (MySQLi with Prepared Statements)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

สายรหัสที่จะอธิบายจากตัวอย่างข้างต้น:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

ใน SQL ของเราเราใส่เครื่องหมายคำถาม (?) ที่เราต้องการเพื่อทดแทนในจำนวนเต็มสตริงมูลค่าคู่หรือหยด

จากนั้นมีลักษณะที่เป็น bind_param() ฟังก์ชั่น:

$stmt->bind_param("sss", $firstname, $lastname, $email);

ฟังก์ชั่นนี้ผูกพารามิเตอร์แบบสอบถาม SQL ฐานข้อมูลและบอกสิ่งที่พารามิเตอร์ที่มี "sss" โต้แย้งแสดงรายการชนิดของข้อมูลที่พารามิเตอร์ ดัชนี S ตัวละครบอก MySQL พารามิเตอร์เป็นสตริง

อาร์กิวเมนต์อาจจะเป็นหนึ่งในสี่ประเภท:

  • ฉัน - จำนวนเต็ม
  • d - คู่
  • s - สตริง
  • ข - หยด

เราต้องมีหนึ่งในเหล่านี้สำหรับแต่ละพารามิเตอร์

โดยบอก MySQL สิ่งที่ประเภทของข้อมูลที่จะคาดหวังว่าเราลดความเสี่ยงของการฉีดของ SQL

หมายเหตุ: หากเราต้องการที่จะใส่ข้อมูลใด ๆ จากแหล่งภายนอก (like user input) มันเป็นสิ่งสำคัญมากที่ข้อมูลจะถูกสุขอนามัยและการตรวจสอบ


เตรียมงบใน PDO

ตัวอย่างต่อไปนี้ใช้งบเตรียมและพารามิเตอร์ที่ถูกผูกไว้ใน PDO:

ตัวอย่าง (PDO with Prepared Statements)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
    VALUES (:firstname, :lastname, :email)");
    $stmt->bindParam(':firstname', $firstname);
    $stmt->bindParam(':lastname', $lastname);
    $stmt->bindParam(':email', $email);

    // insert a row
    $firstname = "John";
    $lastname = "Doe";
    $email = "[email protected]";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "[email protected]";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "[email protected]";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>