PHP MySQL 준비문

준비문은 MySQL 인젝션 방지에 매우 유용합니다.

SQL 주입은 웹 양식 제출에 SQL 명령을 삽입하거나 도메인 이름이나 페이지 요청에 대한 쿼리 문자열을 입력하여 궁극적으로 서버를 속여 악성 SQL 명령을 실행하도록 하는 것입니다.


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

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

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

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

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

2. 데이터베이스 구문 분석, 컴파일, SQL 문 템플릿에 대한 쿼리 최적화 수행 및 결과를 출력하지 않고 저장합니다. 매개변수 값이 다를 경우 애플리케이션은 해당 명령문을 여러 번 실행할 수 있습니다.

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

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

· 준비된 문은 분석 시간을 크게 단축시키며, 한 번의 쿼리만 수행됩니다(문이 여러 번 실행되더라도).

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

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


MySQLi 준비 명령문

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

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $servername = "localhost";
 $username = "root";
 $password = "root";
 $dbname = "test";
 
 // 创建连接
 $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(?, ?, ?)"

SQL 문에서는 물음표(?)를 사용합니다. 여기서 물음표를 정수로 바꿀 수 있습니다. , 문자열, 복식 및 부울.

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

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

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

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

· i - 정수(정수형)

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

· s - 문자열(문자열)

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

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

데이터 유형을 지정하는 방법은 이전 섹션에서 소개했습니다.

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

위 코드 실행 결과:

새 레코드 삽입 성공

데이터가 있는지 확인 삽입 성공적인?


양식에 있는 데이터를 데이터베이스에 삽입해 보겠습니다.

먼저 HTML 페이지

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>PHP中文网</title>
 </head>
 <body>
 
 <form action="insert.php" method="post">
     Firstname: <input type="text" name="firstname" /><br/>
     Lastname: <input type="text" name="lastname" /><br/>
     email: <input type="text" name="email" /><br/>
     <input type="submit" />
 </form>
 </body>
 </html>

가 PHP 페이지

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $servername = "localhost";
 $username = "root";
 $password = "root";
 $dbname = "test";
 
 // 创建连接
 $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 = $_POST['firstname'];
 $lastname =$_POST['lastname'];
 $email = $_POST['email'];
 $stmt->execute();
 
 echo "新记录插入成功";
 
 $stmt->close();
 $conn->close();
 ?>

에 제출됩니다. 위의 두 프로그램을 통해 양식의 데이터를 데이터베이스

<🎜에 삽입할 수 있습니다. >

지속적인 학습
||
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $servername = "localhost"; $username = "root"; $password = "root"; $dbname = "test"; // 创建连接 $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(); ?>
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~