■ 백엔드 ■/PHP2018.05.24 10:46

   prepare and bind_param


prepare는 SQL문 반복호출할때 효율성을 높히기 위해 사용되는 함수이다.


작동프로세스

  • SQL문 template가 작성되고 DB로 송신되는데 매개 변수가 "?"라는 값이 지정되지
    않은채로 대기중

  • DB는 SQL template에서 구문 분석, 컴파일 및 쿼리 최적화를 수행하고 아직 결과를 실행하지는 않고 저장단계

  • Execute를 통해서 프로그램이 매개 변수에 값을 바인드하고 DB 명령문 실행.
    프로그램에서 다른 값으로 원하는 만큼 여러 번 명령문을 실행할 수 있다.


SQL직접 실행 대비한 장점

  • 명령문은 쿼리 준비가 한 번만 수행되므로 구문 분석 시간이 줄어드는데, 명령문을 여러번 실행할 때 잇점이 있다.

  • bind_param의 매개변수들은 전체 쿼리가 아닌 변수만 보내지므로 서버에 대한 대역폭이 최소화 된다.

  • Prepared statements는 나중에 다른 프로토콜을 사용하여 전송되는 매개 변수 값이
    올바르게 이스케이프할 필요도 없다, SQL injection에 매우 유용하다.

  • If the original statement template is not derived from external input, SQL injection cannot occur.
    원본 SQL templete 구문이 외부입력으로 간섭을 받으면 SQL injection을 방어한다.


코드보기


<?php
$servername = "localhost";
$username = "root";
$password = "rhapsody3";
$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 = "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 "New records created successfully";
 
$stmt->close();
$conn->close();
?>

source : https://www.w3schools.com/php/php_mysql_prepared_statements.asp



코드 구문 설명


SQL에서 template작성

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


?를 정수, 문자열, double, blob 등으로 대체할 위치에 순서대로 값을 대입한다.

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


bind_param의 "sss" 는 데이터 유형을 나타내는데 s 문자는 mysql에 매개 변수가 문자열임을 명시하게 된다


매개 변수의 옵션은 아래와 같이 4가지 유형으로 나타낼 수 있다.


  • i : 정수
  • d : double
  • s : 문자열
  • b : BLOB

PDO 에서 작성될 경우 아래코드를 참조한다
<?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 = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

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

source : https://www.w3schools.com/php/php_mysql_prepared_statements.asp










Posted by SAP (Study And Programming) by serpiko

댓글을 달아 주세요