>  Q&A  >  본문

php - PDO和PDOStatement为什么会同时存在?这样的设计是出于什么考虑呢?

问题描述:
都知道自PHP 5.1.0 起,PDO就算是PHP的标配的一部分了,PDO提供了3个类PDOPDOStatementPDOExceptionPDOException这个类就不用说了,功能和定位啥的看名字都很清楚。

那么问题来了:为什么会同时存在PDOPDOStatement这两个类?

为什么会有这样的疑问,先看下图(图片截取自@PHP官网手册):

图片是PDOPDOStatement类所声明的方法,可以看出,这两个类提供的方法虽然绝大部分不同,但是明显核心方法有重叠或重复,比如:

PDOStatement::execute()还好说,而PDO::query()PDO::exec() 同时存在的必要性又是什么呢?而且还会造成使用和理解上面的不畅。

好吧,就算有同时存在的必要性
那么还是有一点为什么要同时存在这两个类呢?而不是一个类(假如只有 PDO类)就将这两个类所能做的事情一起做了呢?
PDO 类和 PDOStatement 类之间是什么关系呢?

如果 PDO 类用来执行SQL和管理链接,而 PDOStatement 类只用来处理结果集,那么感觉就舒服顺畅多了。

希望有大牛能给予解释 PHPPDO 这么设计的考虑是什么,真诚感谢~

我想大声告诉你我想大声告诉你2712일 전745

모든 응답(3)나는 대답할 것이다

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 13:13:25

    하나는 일반 SQL을 실행하는 데 사용되고, 다른 하나는 매개변수 바인딩 등에 사용될 수 있는 것으로 알고 있습니다...

    회신하다
    0
  • 仅有的幸福

    仅有的幸福2017-05-16 13:13:25

    개인적으로 이해한 내용을 말씀드리겠습니다. 틀린 부분이 있으면 정정해 주시기 바랍니다.
    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 결과 집합이 아닌 영향을 받은 행 수만 반환됩니다. 쿼리를 사용하거나 실행하려면 공식 권장 사항을 따르세요.
    제가 이해한 내용은 대략 이렇습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-05-16 13:13:25

    으아아아

    위 세 가지 방법은 모두 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:

    를 사용해야 합니다. 으아아아

    회신하다
    0
  • 취소회신하다