티스토리 뷰
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
'■ 백엔드 ■ > PHP' 카테고리의 다른 글
php 웹페이지 엑세스 솔루션들 (0) | 2018.06.21 |
---|---|
json 한글이 ?로 깨질때 (0) | 2018.06.04 |
html에서 php 구문 사용하기 ( php에서 .html 파일 사용 하기 ) (0) | 2018.03.19 |
php 에서 <?php 가 아닌 <? 로 축약어 사용하기 (0) | 2018.03.19 |
PHP - PHPExcel 에서 Dropdown 리스트 생성하기 (0) | 2017.05.31 |
댓글