php pdo 예제




mysqli 또는 PDO-장단점은 무엇입니까? (9)

대신 우리는 준비된 명령문과 트랜잭션 지원과 같은 것들을 위해 mysqli와 PDO를 사용하는 것으로 나뉩니다. 일부 프로젝트는 하나를 사용하고 다른 프로젝트는 하나를 사용합니다. 우리가 다른 RDBMS로 옮길 가능성은 거의 없습니다.

PDO가 준비된 명령문에 대해 명명 된 매개 변수를 허용한다는 한 가지 이유 때문에 PDO를 선호하며 mysqli가 인식하지 못하는 한 PDO를 선호합니다.

하나의 접근 방식 만 사용하도록 프로젝트를 통합 할 때 표준으로 다른 것을 선택하는 데 다른 장단점이 있습니까?


PDO가 MySQLi가 정말로 좋아하지 않는 한 가지는 PDO의 결과가 지정된 클래스 유형의 객체로 결과를 반환하는 능력입니다 (예 : $pdo->fetchObject('MyClass') ). MySQLi의 fetch_object()stdClass 객체 만 반환합니다.


PDO가 표준이며, 대부분의 개발자가 사용할 것으로 예상됩니다. mysqli는 본질적으로 특정 문제에 대한 맞춤형 솔루션이지만 다른 DBMS 관련 라이브러리의 모든 문제가 있습니다. PDO는 모든 노력과 영리한 사고가 갈 곳입니다.


PDO에 대한 또 다른 주목할만한 차이점은 PDO PDO::quote() 메소드가 자동으로 따옴표를 추가하는 반면 mysqli::real_escape_string() (및 유사 항목)은 그렇지 않다는 것입니다.

PDO :: quote ()는 입력 문자열을 따옴표로 묶고 (필요한 경우) 기본 드라이버에 적합한 따옴표 스타일을 사용하여 입력 문자열 내에서 특수 문자를 이스케이프합니다.


개인적으로 PDO를 사용하지만 주로 선호도의 문제라고 생각합니다.

PDO에는 다시 SQL 주입 ( 준비된 명령문 )을 돕는 몇 가지 기능이 있지만 SQL에주의를 기울이면 mysqli에서도이를 달성 할 수 있습니다.

다른 데이터베이스로 이동한다고해서 PDO를 사용해야하는 것은 아닙니다. "특수 SQL 기능"을 사용하지 않는 한 한 DB에서 다른 DB로 전환 할 수 있습니다. 그러나 "SELECT ... LIMIT 1"과 같은 예를 사용하면 "SELECT TOP 1 ..."인 MS-SQL로 이동할 수 없습니다. 그래서 이것은 어쨌든 문제가됩니다.


벤치 마크 스크립트 에서 각 방법은 10000 번 테스트되고 각 방법의 총 시간 차이가 인쇄됩니다. 당신은 당신의 자신의 구성에 이것을해야합니다, 나는 결과가 다를 것이라고 확신합니다!

이것들은 내 결과입니다 :

  • " SELECT NULL" -> PGO() ~ 0.35 초 더 빠름
  • " SHOW TABLE STATUS" -> mysqli() ~ 2.3 초 빠르게
  • " SELECT * FROM users" -> mysqli() ~ 33 초 더 빠름

참고 : mysqli에-> fetch_row ()를 사용하면 열 이름이 배열에 추가되지 않으므로 PGO에서 열 이름을 지정하는 방법을 찾지 못했습니다. 그러나-> fetch_array () 사용하더라도 mysqli는 약간 느리지 만 여전히 PGO보다 빠릅니다 (SELECT NULL 제외).


내 의견으로는 진술 지원이 더 좋기 때문에 PDO를 사용하기 시작했다. ActiveRecord-esque 데이터 액세스 계층을 사용하고 있으며 동적으로 생성 된 명령문을 구현하는 것이 훨씬 쉽습니다. MySQLi의 매개 변수 바인딩은 단일 함수 / 메소드 호출에서 수행해야하므로 런타임까지 바인딩 할 매개 변수 수를 알지 못하면 call_user_func_array() 를 사용해야합니다 (올바른 함수 이름이라고 생각합니다 call_user_func_array() )를 선택합니다. 간단한 동적 결과 바인딩은 잊어 버리십시오.

무엇보다도 PDO는 매우 합리적인 수준의 추상화이기 때문에 PDO를 좋아합니다. SQL을 작성하고 싶지 않은 완전 추상 시스템에서 쉽게 사용할 수 있지만보다 최적화 된 순수한 쿼리 유형의 시스템을 사용하거나이 둘을 혼합하여 일치시킬 수 있습니다.


명심해야 할 것이있다 : 현재 (PHP 5.2) PDO 라이브러리는 버그가있다 . 이상한 버그로 가득합니다. 예를 들어, 변수에 PDOStatement 를 저장하기 전에 많은 버그를 피하기 위해 변수를 unset() 해야합니다. 이들 대부분은 PHP 5.3에서 수정되었으며 2009 년 초 PHP 5.3에서 릴리스되어 다른 버그가있을 수 있습니다. 안정적인 릴리즈를 원한다면 PHP 6.1 용 PDO를 사용하고 커뮤니티를 돕기 위해서는 PHP 5.3 용 PDO를 사용하는 데 집중해야합니다.


실행 속도 측면에서 MySQLi가이기는하지만, MySQLi를 사용하는 좋은 래퍼가 없으면 준비된 명령문을 다루는 기능이 끔찍합니다.

여전히 버그가 있지만 누군가가 원한다면 여기 있습니다 .

간단히 말해, 속도 향상을 원한다면 MySQLi; 사용 편의성을 원한다면 PDO.


수정 된 답변.

이 두 API에 대해 어느 정도 경험을 쌓은 후 네이티브 준비된 명령문으로 mysqli를 사용할 수 없게 만드는 2 개의 차단 레벨 기능이 있다고 말할 수 있습니다.
그들은 이미 2 가지 훌륭한 (아직 과소 평가 된) 답변에서 언급되었습니다.

  1. 임의의 수의 자리 표시 자에 값 바인딩
  2. 단순한 배열로 데이터 반환

( 이 답변 에도 언급되어 있음)

어떤 이유로 mysqli는 둘 다 실패했습니다.
요즘에는 두 번째 기능 ( get_result )이 약간 개선되었지만 mysqlnd 설치에서만 작동하므로 스크립트 에서이 기능에 의존 할 수 없습니다.

그러나 오늘날까지도 가치에 의한 결속은 없습니다.

따라서 PDO 는 하나만 선택할 수 있습니다.

와 같은 다른 모든 이유

  • 명명 된 자리 표시 자 (이 구문 설탕은 과대 평가됨)
  • 다른 데이터베이스 지원 (아무도 사용하지 않은 사람)
  • 객체로 가져 오기 (사용할 수없는 구문 설탕)
  • 속도 차이 (없음)

중요하지 않습니다.

동시에이 두 API에는 다음과 같은 실제 중요한 기능 이 없습니다.

  • 식별자 자리 표시 자
  • 동적 바인딩을 덜 수월하게 만드는 복잡한 데이터 유형의 자리 표시 자
  • 더 짧은 애플리케이션 코드.

따라서 실제 요구 사항을 충족하려면 이러한 API 중 하나를 기반으로 수동으로 구문 분석 된 자리 표시자를 구현하는 자체 추상화 라이브러리를 만들어야합니다. 이 경우 mysqli를 선호합니다. 추상화 수준이 낮기 때문입니다.





database-abstraction