> 백엔드 개발 > PHP 튜토리얼 > PHP--PDO 준비 문 및 저장 프로시저

PHP--PDO 준비 문 및 저장 프로시저

伊谢尔伦
풀어 주다: 2016-11-22 09:34:12
원래의
1002명이 탐색했습니다.

더 많은 성숙한 데이터베이스가 준비된 문의 개념을 지원합니다. 준비된 진술이란 무엇입니까? 이를 실행하려는 SQL의 컴파일된 템플릿으로 생각하세요. 이는 변수 매개변수를 사용하여 사용자 정의할 수 있습니다. 준비된 문은 두 가지 주요 이점을 가져올 수 있습니다.

쿼리는 한 번만 구문 분석(또는 전처리)하면 되지만 동일하거나 다른 매개변수를 사용하여 여러 번 실행할 수 있습니다. 쿼리가 준비되면 데이터베이스는 쿼리 실행 계획을 분석, 컴파일 및 최적화합니다. 복잡한 쿼리의 경우 이 프로세스가 더 오래 걸리며, 동일한 쿼리를 다른 매개변수로 여러 번 반복해야 하는 경우 애플리케이션 속도가 크게 느려질 수 있습니다. 준비된 문을 사용하면 반복적인 분석/컴파일/최적화 주기를 피할 수 있습니다. 간단히 말해서, 준비된 명령문은 더 적은 리소스를 사용하므로 더 빠르게 실행됩니다.

준비된 문에 제공된 매개변수는 따옴표로 묶을 필요가 없으며 드라이버가 자동으로 처리합니다. 애플리케이션이 준비된 명령문만 사용하는 경우 SQL 주입이 발생하지 않는다고 확신할 수 있습니다. (그러나 쿼리의 다른 부분이 이스케이프되지 않은 입력으로 구성되면 여전히 SQL 주입 위험이 있습니다.)

준비된 명령문은 매우 유용하여 드라이버가 지원하지 않을 때 PDO가 처리를 시뮬레이션한다는 것이 유일한 특징입니다. 이렇게 하면 데이터베이스에 이러한 기능이 있는지 여부에 관계없이 애플리케이션이 동일한 데이터 액세스 패턴을 사용할 수 있습니다.

예제 #1 준비된 문을 사용하여 반복 삽입 수행

다음 예에서는 해당 명명된 자리 표시자를 이름과 값으로 바꿔 삽입 쿼리를 실행합니다

<?php
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(&#39;:name&#39;, $name);
    $stmt->bindParam(&#39;:value&#39;, $value);
    // 插入一行
    $name = &#39;one&#39;;
    $value = 1;
    $stmt->execute();
    // 用不同的值插入另一行
    $name = &#39;two&#39;;
    $value = 2;
    $stmt->execute();
?>
로그인 후 복사

예 # 2 준비된 문을 사용한 반복 삽입

다음 예에서는 ? 자리 표시자 위치를 이름과 값으로 바꿔서 삽입 쿼리를 실행합니다.

<?php
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);
    // 插入一行
    $name = &#39;one&#39;;
    $value = 1;
    $stmt->execute();
    // 用不同的值插入另一行
    $name = &#39;two&#39;;
    $value = 2;
    $stmt->execute();
?>
로그인 후 복사

예제 #3 준비된 문을 사용하여 데이터 가져오기

다음 예에서는 제공된 키 값을 기반으로 데이터를 가져옵니다. 사용자 입력이 자동으로 인용되므로 SQL 주입 공격의 위험이 없습니다.

<?php
    $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
    if ($stmt->execute(array($_GET[&#39;name&#39;]))) {
        while ($row = $stmt->fetch()) {
            print_r($row);
        }
    }
?>
로그인 후 복사

데이터베이스 드라이버가 지원하는 경우 애플리케이션은 출력 및 입력 매개변수를 바인딩할 수도 있습니다. 출력 매개변수는 일반적으로 저장 프로시저에서 값을 가져오는 데 사용됩니다. 출력 매개변수를 바인딩할 때 지정된 매개변수의 길이를 알아야 하기 때문에 출력 매개변수는 입력 매개변수보다 사용하기가 약간 더 복잡합니다. 매개변수에 바인딩된 값이 권장 길이보다 크면 오류가 생성됩니다.

예제 #4 출력 매개변수를 사용하여 저장 프로시저 호출

<?php
    $stmt = $dbh->prepare("CALL sp_returns_string(?)");
    $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
    // 调用存储过程
    $stmt->execute();
    print "procedure returned $return_value\n";
?>
로그인 후 복사

입력 값과 출력 값을 모두 사용하여 매개변수를 지정할 수도 있으며 구문은 출력 매개변수와 유사합니다. 다음 예제에서는 문자열 "hello"가 저장 프로시저에 전달되고, 저장 프로시저가 반환되면 hello가 저장 프로시저에서 반환된 값으로 대체됩니다.

예제 #5 입력/출력 매개변수를 사용하여 저장 프로시저 호출

<?php
    $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
    $value = &#39;hello&#39;;
    $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
    // 调用存储过程
    $stmt->execute();
    print "procedure returned $value\n";
?>
로그인 후 복사

예제 #6 잘못된 자리 표시자 사용

<?php
    $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE &#39;%?%&#39;");
    $stmt->execute(array($_GET[&#39;name&#39;]));
    // 占位符必须被用在整个值的位置
    $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
    $stmt->execute(array("%$_GET[name]%"));
?>
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿