PHP PDO는 문과 저장 프로 시저를 준비
더 많은 성숙 데이터베이스는 준비된 명령문의 개념을 지원합니다.
준비된 명령문 무엇입니까? 변수 매개 변수를 사용하여 사용자 정의 할 수 있습니다 당신은 SQL을 실행하려면 컴파일 된 템플릿으로 생각하십시오. 준비된 문은 두 가지 중요한 이점을 제공합니다 :
- 쿼리 만 리졸 (또는 전처리) 번하지만 동일 또는 상이한 파라미터를 여러 번 실행될 수있다. 쿼리가 준비되면, 데이터베이스 분석, 컴파일 및 쿼리 최적화 계획을 실행합니다. 사용자가 다른 매개 변수와 같은 쿼리를 여러 번 반복해야하는 경우 복잡한 쿼리를 들어,이 프로세스는 시간이 오래 걸리는, 프로세스는 크게 프로그램의 속도를 감소시킬 것이다. 분석 반복 준비된 명령문 피할를 사용하여 / / 최적화주기를 컴파일합니다. 즉, 문이 적은 리소스를 사용하여 빠르게 실행 준비했다.
- 인용 부호를 사용할 필요가 없습니다 준비된 문에 매개 변수를 제공, 드라이버가 자동으로 처리됩니다. 응용 프로그램은 준비된 문을 사용하는 경우, 우리는 어떤 SQL 주입되도록 할 수 있습니다. (쿼리의 다른 부분을 구축하는 입력으로부터 탈출하지 않을 경우에는, SQL 인젝션의 위험이 여전히 존재한다).
그들은 단지 기능 정도로 유용 준비된 문은 운전자가 PDO를 지원하지 않는 아날로그 처리이다. 이없이 데이터베이스 기능을 갖고 있는지 여부는 애플리케이션이 동일한 데이터 액세스 패턴을 사용할 수 있도록 할 수 있음을 보장한다.
PreparedStatement들 반복 삽입
이름과 값으로 적절한 이름의 자리를 대체하여 다음 예는 삽입 쿼리를 실행합니다
<?php $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(); ?>
PreparedStatement들 반복 삽입
이름과 값을 대입하여? 나타내지 다음의 예는 삽입 쿼리를 실행합니다.
<?php $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 주입 공격의 위험이 없다.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
데이터베이스 드라이버를 지원하는 경우, 애플리케이션은 입력 및 출력 파라미터 출력 매개 변수는 전형적으로 저장 프로 시저의 값을 얻기 위해 사용되는 결합 할 수있다. 출력 매개 변수를 바인딩 할 때, 주어진 길이의 매개 변수를 알고 있어야하기 때문에 출력 매개 변수는 약간 더 복잡로 입력 매개 변수보다 사용합니다. 매개 변수의 값을 길이의 결합 권고보다 큰 경우, 에러를 생성 할 것이다.
출력 매개 변수가있는 저장 프로 시저를 호출
<?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"; ?>
또한 매개 변수의 입력 및 출력 값을 지정할 수 있습니다, 구문은 출력 매개 변수와 유사하다. 저장 프로 시저 반환이, 안녕하세요 저장 프로 시저의 리턴 값으로 대체 될 때 다음 예에서 문자열은 "안녕하세요"저장 프로 시저에 전달됩니다.
입력으로 / 출력 매개 변수는 저장 프로 시저를 호출
<?php $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"; ?>
자리의 잘못된 사용
<?php $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]%")); ?>