PHP MySQL 준비문

PHP MySQL 준비된 문


준비된 문은 MySQL 주입을 방지하는 데 매우 유용합니다.


준비된 문과 바인딩된 매개변수

준비된 문은 동일한 여러 개의 SQL 문을 실행 효율성을 높이는 데 사용됩니다.

Prepared 문의 작동 원리는 다음과 같습니다.

1. 전처리: SQL 문 템플릿을 생성하여 데이터베이스로 보냅니다. 예약된 값은 "?"라는 매개변수로 표시됩니다. 예:

2. INSERT

INTO MyGuests(이름, 성, 이메일) VALUES(?, ?, ?)

3. 템플릿은 쿼리 최적화를 수행하고 결과를 출력하지 않고 저장합니다.

4. 실행: 마지막으로 애플리케이션 바인딩된 값을 매개변수("?" 표시)에 전달하면 데이터베이스가 해당 명령문을 실행합니다. 매개변수 값이 다를 경우 애플리케이션은 해당 명령문을 여러 번 실행할 수 있습니다.

SQL 문을 직접 실행하는 것에 비해 준비된 문은 두 가지 주요 장점이 있습니다.

· 전처리된 문은 분석 시간을 크게 단축하고 한 개의 쿼리만 수행합니다(문이 여러 번 실행되더라도).

· 매개변수를 바인딩하면 서버 대역폭이 줄어들므로 전체 문 대신 쿼리 매개변수만 보내면 됩니다.

· 매개변수 값이 전송된 후 다른 프로토콜을 사용하여 데이터의 적법성을 보장하기 때문에 전처리된 문은 SQL 주입에 매우 유용합니다.


MySQLi 준비된 문

다음 예에서는 MySQLi에서 준비된 문을 사용하고 해당 매개변수를 바인딩합니다.

예(MySQLi에서는 준비된 문을 사용합니다)

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 $dbname = "myDB";
 
 // 创建连接
 $conn = new mysqli($servername, $username, $password, $dbname);
 
 // 检测连接
 if ($conn->connect_error) {
     die("连接失败: " . $conn->connect_error);
 }
 
 // 预处理及绑定
 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)");
 $stmt->bind_param("sss", $firstname, $lastname, $email);
 
 // 设置参数并执行
 $firstname = "John";
 $lastname = "Doe";
 $email = "john@example.com";
 $stmt->execute();
 
 $firstname = "Mary";
 $lastname = "Moe";
 $email = "mary@example.com";
 $stmt->execute();
 
 $firstname = "Julie";
 $lastname = "Dooley";
 $email = "julie@example.com";
 $stmt->execute();
 
 echo "新记录插入成功";
 
 $stmt->close();
 $conn->close();
 ?>

다음 예의 각 코드 줄을 구문 분석합니다.

"INSERT INTO MyGuests(이름, 성, 이메일) VALUES(?, ?, ?)"

In SQL 문에서는 물음표(?)를 사용합니다. 여기서 물음표를 정수, 문자열, 배정밀도 부동 소수점 및 부울 값으로 바꿀 수 있습니다.

다음으로, bind_param() 함수를 살펴보겠습니다.

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

이 함수는 SQL 매개변수를 바인딩하고 데이터베이스에 매개변수의 값을 알려줍니다. "sss" 매개변수 열은 나머지 매개변수의 데이터 유형을 처리합니다. s 문자는 데이터베이스에 매개변수가 문자열임을 알려줍니다.

매개변수에는 다음과 같은 네 가지 유형이 있습니다.

·  i - 정수(정수 유형)

·   d - double(배정밀도 부동 소수점 유형)

·       s - 문자열(문자열)

·         b - BLOB(바이너리 대형 객체: 바이너리 대형 객체)

각 매개변수에는 유형을 지정해야 합니다.

매개변수의 데이터 유형을 데이터베이스에 알려 SQL 주입 위험을 줄일 수 있습니다.


참고: 다른 데이터(사용자 입력)를 삽입하려면 데이터 유효성 검사가 매우 중요합니다.

PDO에서 준비된 문장

다음 예에서는 PDO에서 준비된 문과 바인드 매개 변수를 사용합니다.

예(PDO는 준비된 문을 사용합니다)

<?php
 $servername = "localhost";
 $username = "username";
 $password = "password";
 $dbname = "myDBPDO";
 try {
     $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
     // 设置 PDO 错误模式为异常
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
     // 预处理 SQL 并绑定参数
     $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);
     // 插入行
     $firstname = "John";
     $lastname = "Doe";
     $email = "john@example.com";
     $stmt->execute();
     // 插入其他行
     $firstname = "Mary";
     $lastname = "Moe";
     $email = "mary@example.com";
     $stmt->execute();
     // 插入其他行
     $firstname = "Julie";
     $lastname = "Dooley";
     $email = "julie@example.com";
     $stmt->execute();
     echo "新记录插入成功";
 }
 catch(PDOException $e)
 {
     echo $sql . "<br>" . $e->getMessage();
 }
 $conn = null;
 ?>


지속적인 학습
||
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理及绑定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close(); ?>
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~