문제 설명:
우리 모두는 PHP 5.1.0부터 PDO가 PHP의 표준 부분이라는 것을 알고 있습니다. PDO는 PDO
, PDOStatement code> 및
PDOException
, PDOException
기능과 위치는 이름에서부터 매우 명확합니다.
그러면 다음과 같은 질문이 생깁니다. PDO
와 PDOStatement
두 클래스가 동시에 존재하는 이유는 무엇입니까?
왜 그런 질문이 있나요? 먼저 아래 사진을 보세요(@PHP 공식 웹사이트 매뉴얼에서 가져온 사진):
그림은 PDO
및 PDOStatement
클래스에 의해 선언된 메서드를 보여줍니다. 이 두 클래스에서 제공하는 메서드는 대부분 다르지만 핵심은 다음과 같습니다. 메서드는 분명히 다음과 같이 Overlap 또는 반복입니다.
PDO::query()
, PDO::exec()
는 모두 SQL 문을 실행하지만 반환값은 다릅니다
PDOStatement::execute()
도 SQL 문을 실행하지만 해당 문은 전처리되었습니다.
PDOStatement::execute()
는 괜찮지만 PDO::query()
및 PDO::exec()
가 동시에 필요성은 무엇입니까? 또한 사용 및 이해에 어려움을 겪게 됩니다.
글쎄, 동시에 존재할 필요가 있다고 하더라도
아직 요점이 있습니다이 두 클래스가 동시에 존재하는 이유는 무엇입니까? 하나의 클래스 대신(PDO
클래스만 있는 경우) 이 두 클래스가 함께 할 수 있는 작업을 수행하는 것은 어떨까요? PDO
클래스와 PDOStatement
클래스 사이의 관계는 무엇입니까?
PDO
클래스를 사용하여 SQL 실행 및 연결 관리를 수행하고, PDOStatement
클래스를 결과 집합 처리에만 사용한다면 훨씬 편안하고 원활하게 느껴질 것입니다. .
PHP
의 PDO
설계 고려 사항을 누군가가 설명해 주셨으면 좋겠습니다. 진심으로 감사드립니다~
하나는 일반 SQL을 실행하는 데 사용되고, 다른 하나는 매개변수 바인딩 등에 사용될 수 있는 것으로 알고 있습니다...
개인적으로 이해한 내용을 말씀드리겠습니다. 틀린 부분이 있으면 정정해 주시기 바랍니다.
으아아아PDO 클래스를 먼저 살펴보세요
query()와 prepare() 모두 PDOStatement 개체를 반환하는 것을 볼 수 있는데, 이는 PDOStatement가 결과 집합을 조작할 수 있음을 의미합니다.
PDO::prepare를 다시 보면 준비된 문을 실행한다고 되어 있는데 실제로는 준비된 문 PDOStatement를 얻은 다음 실제로 PDOStatement::execute()를 호출하여 SQL을 실행한다고 나와 있습니다.
일반적으로 일부 프로젝트에서는 SQL 문을 실행하기 위해 준비를 사용합니다. 이는 SQL 주입을 방지하고 동일한 템플릿 SQL의 쿼리 성능을 향상시키기 위해 수행됩니다. 공식 매뉴얼 내용은 다음과 같습니다.
쿼리는 구문 분석(또는 준비)만 하면 됩니다. 그러나 동일하거나 다른 매개변수를 사용하여 여러 번 실행할 수 있습니다. 쿼리가 준비되면 데이터베이스는 쿼리 실행을 위한 계획을 분석, 컴파일 및 최적화합니다. 복잡한 쿼리의 경우 이 프로세스는 눈에 띄게 충분한 시간이 걸릴 수 있습니다. 다른 매개변수를 사용하여 동일한 쿼리를 여러 번 반복해야 하는 경우 애플리케이션 속도를 늦춥니다. 준비된 문을 사용하면 애플리케이션에서 분석/컴파일/최적화 주기를 반복하지 않아도 됩니다. 이는 준비된 문이 더 적은 리소스를 사용하므로 더 빠르게 실행된다는 의미입니다. .
Prepared 문에 대한 매개 변수는 인용할 필요가 없습니다. 애플리케이션이 준비된 문을 독점적으로 사용하는 경우 개발자는 SQL 삽입이 발생하지 않음을 확신할 수 있습니다(그러나 쿼리는 이스케이프되지 않은 입력으로 작성되고 있지만 SQL 주입은 여전히 가능합니다.포스터에서 PDO::query와 PDO::exec의 차이점에 대해 다음과 같이 말했습니다.
query는 select 문만 실행하고 exec select, insert, update,delete를 실행합니다.
PDO::query는 SQL 문을 실행하고, 전달되면 PDOStatement 객체를 반환합니다.
PDO::exec는 SQL 문을 실행하고 영향을 받는 행 수를 반환합니다. 이 함수는 결과 컬렉션을 반환하지 않습니다.
PDOStatement::execute는 이전에 소개된 PDOStatement의 하위 기능입니다. 한 가지 기능은 SQL 주입 보안 문제를 고려하지 않고 바인딩 매개변수를 지원한다는 것입니다. 이는 템플릿 SQL과 마찬가지로 개선에 도움이 됩니다. 성능.
하나의 문만 쿼리하는 경우 쿼리를 사용하면 쿼리에서 반환된 결과 집합을 직접 탐색할 수 있다는 장점이 있습니다.
exec를 사용하여 실행하면 PDOStatement 결과 집합이 아닌 영향을 받은 행 수만 반환됩니다. 쿼리를 사용하거나 실행하려면 공식 권장 사항을 따르세요.
제가 이해한 내용은 대략 이렇습니다.
으아아아
위 세 가지 방법은 모두 SQL을 실행할 수 있습니다. 헷갈린다면 세 번째 방법만 사용하면 됩니다.
를 사용해야 합니다. 으아아아exec와 query가 가능하다면 prepare+execute도 가능하기 때문입니다.
그리고 prepare+execute도 가능합니다. 예를 들어, 매개변수화된 쿼리를 전처리하는 경우 exec 및 쿼리를 구현할 수 없습니다. 예를 들어, 때때로 우리가 실행하는 SQL 문에 외부 매개변수가 없으면 exec 및 쿼리를 사용하는 것이 더 좋습니다. 간결하게 말하면 exec는 영향을 받은 행을 직접 반환할 수 있기 때문에 단일 쓰기 작업(INSERT/UPDATE/DELETE) 문을 실행하는 데 더 적합합니다. as :
$db->query($sql)->rowCount();
SELECT 결과를 얻기 위해 외부 매개변수 없이 SQL을 실행하는 경우 exec 대신 query를 사용해야 합니다.
$db->query($sql)->rowCount();
当如果你执行没有外来参数的SQL获取SELECT结果,这时则应该用query而不是exec:
$db->query($sql)->fetchAll();
$db->query($sql)->fetchAll();
입력 매개변수로 SQL을 실행하는 경우 SQL 삽입을 방지하려면 prepare: