PHP 완전 자율 학습 매뉴...login
PHP 완전 자율 학습 매뉴얼
작가:php.cn  업데이트 시간:2022-04-15 13:53:54

PHP MySQL 준비문



준비된 문장은 MySQL 인젝션을 방지하는데 매우 유용합니다.


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

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

추천 비디오 튜토리얼: "mysql 튜토리얼" http://www.php.cn/course/list/51.html

문 전처리는 다음과 같이 작동합니다.

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

INSERT
INTO MyGuests(이름, 성, 이메일) VALUES(?, ?, ?)
  1. SQL 문 템플릿에 대한 데이터베이스 구문 분석, 컴파일, 쿼리 최적화 및 결과를 출력하지 않고 저장합니다.

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

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

  • 전처리된 문을 사용하면 분석 시간이 크게 단축되고, 하나의 쿼리만 수행됩니다. (문이 여러 번 실행되었지만)

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

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


MySQLi prepare 문

다음 예에서는 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 (firstname, lastname, email) VALUES(?, ?, ?)"
SQL 문에서는 물음표(?)를 사용합니다. 정수, 문자열, 복식 및 부울이 포함된 물음표.

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

$stmt->bind_param("sss", $firstname, $lastname, $email);
이 함수는 SQL 매개변수를 바인딩하고 데이터베이스에 매개변수의 값을 알려줍니다. "sss" 매개변수 열은 나머지 매개변수의 데이터 유형을 처리합니다. s 문자는 데이터베이스에 매개변수가 문자열임을 알려줍니다.

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

  • i - 정수(정수 유형)

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

  • s - 문자열(string)

  • b - BLOB(binary Large Object: 바이너리 대형 개체)

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

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

Note注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。


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 중국어 웹사이트