이 기사에서는 PHP에서 데이터베이스를 운영하기 위해 준비된 명령문(코드 포함)을 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
오늘 기사의 내용은 실제로 매우 기본적입니다. 그러나 현대 개발에서는 모두가 프레임워크를 사용하고, 이를 직접 패키징하는 사람은 거의 없습니다. 데이터베이스 작업 코드. 그래서 이번에는 데이터베이스의 관련 확장에 준비된 문의 내용을 검토해 보겠습니다.
Prepared 문은 실행하려는 SQL 문의 컴파일된 템플릿으로 생각할 수 있으며, 이는 변수 매개 변수를 사용하여 제어할 수 있습니다. 준비된 문은 두 가지 주요 이점을 가져올 수 있습니다.
쿼리는 한 번만 구문 분석(또는 전처리)하면 되지만 동일하거나 다른 매개변수를 사용하여 여러 번 실행할 수 있습니다. 쿼리가 준비되면 데이터베이스는 쿼리 실행 계획을 분석, 컴파일 및 최적화합니다. 복잡한 쿼리의 경우 이 프로세스가 더 오래 걸리며, 동일한 쿼리를 다른 매개변수로 여러 번 반복해야 하는 경우 애플리케이션 속도가 크게 느려질 수 있습니다. 준비된 문을 사용하면 반복적인 분석/컴파일/최적화 주기를 피할 수 있습니다. 간단히 말해서, 준비된 명령문은 더 적은 리소스를 사용하므로 더 빠르게 실행됩니다.
준비된 문에 제공된 매개변수는 따옴표로 묶을 필요가 없으며 드라이버가 자동으로 처리합니다. 애플리케이션이 준비된 명령문만 사용하는 경우 SQL 주입이 발생하지 않는다고 확신할 수 있습니다. (그러나 쿼리의 다른 부분이 이스케이프되지 않은 입력으로 구성되면 여전히 SQL 주입 위험이 있습니다.)
위 내용은 공식 문서에서 발췌한 내용이지만, 실제로 준비된 문장이 우리에게 가져다 주는 가장 직관적인 이점은 SQL 주입을 효과적으로 방지할 수 있다는 것입니다. SQL 인젝션 내용에 관해서는 앞으로 MySQL을 배울 때 심도있게 공부할 것이므로 여기서는 길게 소개하지 않겠습니다. 어쨌든, 준비된 구문만 있으면 이 작업은 완료될 수 있습니다.
PHP 확장 중에서 PDO는 이미 주류 핵심 데이터베이스 확장 라이브러리이며, 당연히 준비된 문에 대한 지원도 매우 포괄적입니다.
$pdo = new PDO('mysql:host=localhost;port=3306;dbname=blog_test', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // :xxx 占位符 $stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (:username, :password, :salt)"); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->bindParam(':salt', $salt); $username = 'one'; $password = '123123'; $salt = 'aaa'; $stmt->execute(); $username = 'two'; $password = '123123'; $salt = 'bbb'; $stmt->execute();
코드에서는 prepare() 메소드를 사용하여 PDOStatement 객체를 반환하는 준비된 문을 정의합니다. 준비된 명령문 내에서 :xxx와 같은 자리 표시자 기호를 사용하고 PDOStatement 개체의 binParam() 메서드를 사용하여 외부적으로 이러한 자리 표시자에 변수를 바인딩합니다. 마지막으로, 실제로 SQL 문을 실행하기 위해 Execution()을 사용합니다.
이 코드에서 준비된 문의 두 가지 주요 장점을 확인할 수 있습니다. 첫 번째는 자리 표시자를 사용한 후에는 SQL 문에 작은따옴표를 작성할 필요가 없습니다. 작은따옴표는 SQL 삽입 취약점의 주요 소스인 경우가 많습니다. BindParam() 메서드는 바인딩된 데이터의 유형을 자동으로 변환합니다. 물론, BindParam() 메소드는 선택적 매개변수에 바인딩된 데이터 유형을 지정할 수도 있으며, 이를 통해 관련 문서를 더 안전하게 확인할 수 있습니다.
또 다른 장점은 템플릿의 기능입니다. 하나의 PDOStatement 객체만 정의한 다음 데이터의 내용을 변경하면 Execution() 메서드를 여러 번 사용하여 준비된 문을 실행할 수 있습니다.
자리 표시자를 작성하는 또 다른 방법은 물음표를 자리 표시자 기호로 사용하는 것입니다. 이 경우, binParam() 메서드의 키 이름은 숫자 아래 첨자를 사용해야 합니다. 여기서 숫자 아래 첨자는 1부터 시작한다는 점에 유의해야 합니다.
// ? 占位符 $stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (?, ?, ?)"); $stmt->bindParam(1, $username); $stmt->bindParam(2, $password); $stmt->bindParam(3, $salt); $username = 'three'; $password = '123123'; $salt = 'ccc'; $stmt->execute();
우리 쿼리에서는 준비된 문 기능을 사용하여 데이터를 쉽게 쿼리할 수도 있습니다. 여기서는 실행()을 직접 사용하여 자리 표시자에 대한 매개변수를 전달합니다.
// 查询获取数据 $stmt = $pdo->prepare("select * from zyblog_test_user where username = :username"); $stmt->execute(['username'=>'one']); while($row = $stmt->fetch()){ print_r($row); }
주류는 PDO이고 대부분의 프레임워크는 PDO를 사용하지만, 스크립트를 작성하거나 일부 기능을 빠르게 테스트해야 할 때는 여전히 빠른 개발을 위해 mysqli를 사용합니다. 물론, mysqli는 준비된 명령문 관련 함수도 지원합니다.
// mysqli 预处理 $conn = new mysqli('127.0.0.1', 'root', '', 'blog_test'); $username = 'one'; $stmt = $conn->prepare("select username from zyblog_test_user where username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); echo $stmt->bind_result($unames); var_dump($unames); while ($stmt->fetch()) { printf("%s\n", $unames); }
mysqli의 다른 메소드 이름 외에도 바인딩 매개변수의 키 이름이 정확히 동일하지 않다는 것을 알 수 있습니다. 여기서는 물음표 자리 표시자를 사용합니다. 기호 위치를 나타냅니다. 매개변수가 여러 개인 경우에는 sss... 이렇게 작성해야 합니다.
현재 프레임워크에서는 명령문을 준비하는 기능이 캡슐화되어 있습니다. 실제로 Laravel에서 DB::select()를 사용하여 데이터베이스를 수행할 때처럼 크게 신경 쓸 필요는 없습니다. 연산, 우리는 준비된 진술의 적용을 볼 수 있습니다.
vendor/laravel/framework/src/Illuminate/Database/Connection.php에서 select() 메서드를 직접 확인할 수 있습니다.
테스트 코드:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E9%A2%84%E5%A4%84%E7%90%86%E8%AF%AD%E5%8F%A5.php
추천 학습: php 비디오 튜토리얼
위 내용은 PHP에서 데이터베이스를 운영하기 위한 전처리문에 대한 자세한 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!