>백엔드 개발 >PHP 문제 >준비된 진술이란 무엇입니까? 그것을 사용하는 방법?

준비된 진술이란 무엇입니까? 그것을 사용하는 방법?

王林
王林앞으로
2019-08-26 11:24:254769검색

많은 성숙한 데이터베이스가 준비된 문 개념을 지원합니다(Prepared Statements). 그것들은 무엇입니까? 이를 실행할 컴파일된 SQL 문 템플릿으로 생각할 수 있으며, 이는 다양한 변수 매개변수로 사용자 정의할 수 있습니다. 준비된 문에는 두 가지 주요 장점이 있습니다.

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

준비된 명령문에 전달된 매개변수는 인용할 필요가 없으며 기본 드라이버가 이를 처리합니다. 애플리케이션이 준비된 명령문만 사용하는 경우 SQL 주입이 발생하지 않는다고 확신할 수 있습니다. (그러나 신뢰할 수 없는 입력을 기반으로 쿼리의 다른 부분을 계속 작성하는 경우 여전히 위험합니다.) 이 기능을 지원하지 않는 데이터베이스에 대해 제공되는 유일한 모의 구현입니다. 이를 통해 데이터베이스 자체에 이 기능이 있는지 여부에 대해 걱정할 필요 없이 통합 데이터 액세스 사양을 사용할 수 있습니다.

/*
使用预处理语句重复插入数据(1)
此示例演示了一个通过向命名占位符代入一个name和一个value值来执行的INSERT查询
*/
连接数据库:$dbh = new PDO("mysql:host=127.0.0.1;dbname=dbname",'username','123');
注:如果插入数据后出现乱码的话,注意检查各个页面的字符集设置,尤其是关于pdo处理的php页面仅有header头设置为utf-8有时也不行,这时就在执行SQL语句前设置数据库的字符集$dbh->query("set names utf8");
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value); //插入一行
$name = 'one';
$value = 1;
$stmt->execute();//使用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

/*
使用预处理语句重复插入数据(2)
此示例演示了一个通过向用?表示的占位符代入一个name和一个value值来执行的INSERT查询
*/
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value); // 插入一行
$name = 'one';
$value = 1;
$stmt->execute(); // 使用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();

/*
通过预处理语句获取数据
此示例演示使用从表单获取的数据为关键值来执行查询获取数据。用户的输入会被自动添加引号,所以这儿不存在SQL注入攻击的危险。
*/
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
    if ($stmt->execute(array($_GET['name']))) {
        while ($row = $stmt->fetch()) {
        print_r($row);
    }
}

데이터베이스 드라이버가 지원하는 경우 입력 매개변수와 마찬가지로 출력 매개변수도 바인딩할 수 있습니다. 출력 매개변수는 저장 프로시저의 반환 값으로 사용되는 경우가 많습니다. 출력 매개변수는 입력 매개변수보다 사용하기가 약간 더 복잡합니다. 이를 사용할 때 반환되는 매개변수 값의 크기를 알아야 합니다. 제안한 것보다 더 큰 매개변수 값을 반환하면 오류가 발생합니다.

//调用一个带有输出参数的存储过程
$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가 저장 프로시저의 반환 값으로 대체됩니다.

//调用一个带有输入/输出参数的存储过程
$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// 执行存储过程
$stmt->execute();
print "procedure returned $value/n";


//占位符的错误使用
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$stmt->execute(array($_GET['name'])); // 占位符必须用于整个值的位置(下面是正确的用法)
$stmt = $dbh->prepare(”SELECT * FROM REGISTRY where name LIKE ?”);
$stmt->execute(array(”%$_GET[name]%”));

오류가 있으면 지적해주세요. 관련 사항을 더 알고 싶으시면 PHP 중국어 홈페이지를 방문해 주세요:

PHP 동영상 튜토리얼

, #🎜 🎜#believe 풍부한 내용과 설명이 만족스러운 답변을 드릴 것입니다.

위 내용은 준비된 진술이란 무엇입니까? 그것을 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제