Programming

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

procodes 2020. 3. 2. 13:17
반응형

mysqli 또는 PDO-장단점은 무엇입니까? [닫은]


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

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

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


글쎄, 당신은 객체 지향적 측면, 준비된 진술, 그것이 표준이된다는 사실 등으로 논쟁 할 수 있습니다. 그러나 저는 대부분 누군가를 살인자 기능으로 더 잘 설득한다는 것을 알고 있습니다. 그래서 거기 있습니다 :

PDO의 좋은 점은 데이터를 가져 와서 객체에 자동으로 주입 할 수 있다는 것입니다. ORM 을 사용하고 싶지 않지만 (단순한 스크립트이기 때문에) 객체 매핑을 좋아한다면 정말 멋집니다.

class Student {

    public $id;
    public $first_name;
    public $last_name

    public function getFullName() {
        return $this->first_name.' '.$this->last_name
    }
}

try 
{
    $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    } 

    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

한 데이터베이스에서 다른 데이터베이스로 애플리케이션을 이동하는 것은 흔하지 않지만 조만간 다른 RDBMS를 사용하여 다른 프로젝트에서 작업하는 것을 발견 할 수 있습니다. 집에 PDO가 있다면 그 시점에서 배우는 것이 최소한 한 가지는 없을 것입니다.

그 외에도 PDO API가 조금 더 직관적이며 객체 지향적 인 느낌이 듭니다. mysqli는 내가 의미하는 바를 알면 객체화 된 절차 적 API 인 것처럼 느낍니다. 요컨대, PDO로 작업하기가 더 쉽지만 물론 주관적입니다.


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

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


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


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


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

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


PDO는 매일 데이터베이스에로드를 분산시키기 위해 마스터 및 슬레이브 연결을 설정할 수 있기 때문에 사이트 / 웹 앱이 실제로 확장되는 경우 훨씬 쉽게 확장 할 수 있으며, PHP는 표준으로 PDO로 이동하고 있습니다.

PDO 정보

웹 애플리케이션 확장


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

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

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


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

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

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


수정 된 답변.

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

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

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

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

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

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

와 같은 다른 모든 이유

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

중요하지 않습니다.

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

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

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


벤치 마크 스크립트 에서 각 방법은 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의 MySQLi가 내가 정말로 좋아하지 않는 한 가지는 PDO의 결과를 지정된 클래스 유형의 객체 (예 :)로 반환 할 수 있다는 것 $pdo->fetchObject('MyClass')입니다. MySQLi fetch_object()stdClass객체 만 반환 합니다.


명심해야 할 것이 하나 있습니다.

Mysqli는 열 이름을 나타내는 키가있는 열을 반환하는 fetch_assoc () 함수를 지원하지 않습니다. 물론 그것은 매우 긴도 아니다, 그렇게하기 위해 자신의 함수를 작성하는 것이 가능하다,하지만 난했다 정말 힘든 시간 비 신자 (그것을 쓰는 : 그것이 당신에게 쉽게 보이는 경우, 자신의 시간을 시도하고 돈 ' t 속임수 :))

참고 URL : https://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons



반응형