복붙노트

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

PHP

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

지금 우리는 mysqli와 PDO를 준비된 문장과 트랜잭션 지원과 같은 것들에 사용하는 것에 중점을두고 있습니다. 어떤 프로젝트는 하나를 사용하고, 다른 프로젝트는 다른 것을 사용합니다. 우리가 다른 RDBMS로 옮길 가능성은 거의 없습니다.

필자는 준비된 구문에 대해 명명 된 매개 변수를 허용하는 단일 이유로 PDO를 선호하며 mysqli가 알고있는 한 PDO를 선호합니다.

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

해결법

  1. ==============================

    1.

    글쎄, 당신은 객체 지향적 측면, 준비된 진술, 그것이 표준이된다는 사실 등을 논할 수 있습니다.하지만 대부분의 경우, 누군가가 살인자의 기능으로 더 잘 작동한다는 것을 압니다. 그래서 거기에 그것이있다 :

    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();
    }
    
  2. ==============================

    2.

    한 데이터베이스에서 다른 데이터베이스로 응용 프로그램을 이동하는 것은 그리 흔한 일은 아니지만 조만간 다른 RDBMS를 사용하는 다른 프로젝트에서 작업 할 수 있습니다. 당신이 PDO로 집에 있다면, 적어도 그 시점에서 배울 점이 하나 더 적을 것입니다.

    그 외에도 PDO API는 좀 더 직관적이며, 객체 지향적 인 느낌이 듭니다. mysqli는 내가 의미하는 바를 아는 경우 객체화된 절차적인 API 인 것처럼 느낍니다. 즉, PDO가 더 쉽게 작동한다는 것을 알았지 만, 물론 주관적입니다.

  3. ==============================

    3.

    필자는 PDO를 사용하기 시작했습니다. ActiveRecord-esque 데이터 액세스 레이어를 사용하고 있으며 동적으로 생성 된 명령문을 구현하는 것이 훨씬 쉽습니다. MySQLi의 매개 변수 바인딩은 단일 함수 / 메소드 호출로 수행되어야합니다. 그래서 런타임까지 얼마나 많은 매개 변수를 바인드하고 싶지 않으면 call_user_func_array ()를 사용해야합니다 (저는 이것이 올바른 함수 이름이라고 생각합니다) )를 선택합니다. 그리고 간단한 동적 결과 바인딩을 잊어 버리십시오.

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

  4. ==============================

    4.

    PDO가 표준이며, 대부분의 개발자가 사용할 것으로 기대됩니다. mysqli는 근본적으로 특정 문제에 대한 별개의 솔루션 이었지만 다른 DBMS 관련 라이브러리의 모든 문제점을 가지고있다. PDO는 모든 열심히 일하고 영리한 생각을 할 곳입니다.

  5. ==============================

    5.

    주의해야 할 사항이 있습니다 : 현재 (PHP 5.2) PDO 라이브러리는 버그가 있습니다. 이상한 버그로 가득 차 있습니다. 예를 들어, PDOStatement를 변수에 저장하기 전에 버그가 발생하지 않도록 변수를 unset ()해야합니다. 이 중 대부분은 PHP 5.3에서 수정되었으며 PHP 5.3에서 2009 년 초에 릴리스 될 예정입니다. PHP 5.3에는 다른 많은 버그가있을 것입니다. 안정적인 릴리스를 원한다면 PHP 6.1 용 PDO를 사용하고 커뮤니티를 도우려면 PDO for PHP 5.3을 사용하는 데 집중해야합니다.

  6. ==============================

    6.

    PDO에 대한 또 다른 주목할만한 (좋은) 차이점은 PDO :: quote () 메서드는 자동으로 따옴표를 추가하는 반면 mysqli :: real_escape_string () (및 similars)는 다음을 수행하지 않는다는 것입니다.

  7. ==============================

    7.

    PDO를 사용하면 사이트에서 매일 웹 응용 프로그램이 실제로 사용되는 경우 마스터 및 슬레이브 연결을 설정하여 데이터베이스 전체에로드를 분산시킬 수 있고 PHP가 표준으로 PDO로 전환하는 방향으로 나아가는 경우 훨씬 쉽게 확장 할 수 있습니다.

    PDO 정보

    웹 응용 프로그램 확장

  8. ==============================

    8.

    실행 속도면에서 MySQLi가 이긴다. 그러나 MySQLi를 사용하는 좋은 래퍼가 없다면 준비된 명령문을 처리하는 함수는 끔찍하다.

    아직 내 버그가 있지만 누군가가 원한다면 여기 있습니다.

    그래서 간단히 말해서, 속도 향상을 원한다면 MySQLi를 찾으십시오. 당신이 사용의 용이성을 원한다면 PDO.

  9. ==============================

    9.

    개인적으로 저는 PDO를 사용합니다. 그러나 이것은 주로 선호의 문제라고 생각합니다.

    PDO는 SQL 주입 (준비된 문장)에 도움이되는 몇 가지 기능을 가지고 있지만 SQL을 신중하게 사용하면 mysqli를 사용하여이를 구현할 수있다.

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

  10. ==============================

    10.

    수정 된 답변

    이 두 API에 대한 경험이 있은 후에는 mysqli를 네이티브 준비 문으로 사용할 수 없게 만드는 2 개의 차단 레벨 기능이 있다고합니다. 그들은 이미 2 가지의 우수한 (아직 과소 평가 된) 답변으로 언급되었습니다 :

    (둘 다이 답변에서도 언급 됨)

    어떤 이유로 mysqli는 둘 다 실패했습니다. 요즘에는 두 번째 (get_result)에 대한 개선점이 있지만 mysqlnd 설치에서만 작동하므로 스크립트에서이 함수를 신뢰할 수 없습니다.

    그러나 그것은 현재까지도 가치에 묶여 있지 않습니다.

    따라서 하나의 선택 만 가능합니다. PDO

    다른 이유는 다음과 같습니다.

    어떤 중요한 의미도 없다.

    동시에이 두 API는 다음과 같은 몇 가지 중요한 기능을 갖추고 있지 않습니다.

    따라서 실제 생활의 필요를 충족시키기 위해 이러한 API 중 하나를 기반으로하는 자체 추상화 라이브러리를 만들어 수동으로 파싱 된 자리 표시자를 구현해야합니다. 이 경우에는 mysqli를 선호합니다. 추상화 수준이 낮기 때문입니다.

  11. ==============================

    11.

    내 벤치 마크 스크립트에서 각 방법은 10000 번 테스트되고 각 방법의 총 시간 차이가 인쇄됩니다. 당신은 당신 자신의 구성에서이 결과를 얻을 것입니다.

    다음은 내 결과입니다.

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

  12. ==============================

    12.

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

  13. ==============================

    13.

    명심할 것은 한 가지 있습니다.

    Mysqli는 열 이름을 나타내는 키가있는 열을 반환하는 fetch_assoc () 함수를 지원하지 않습니다. 물론 그렇게 할 수있는 자신의 함수를 작성하는 것은 가능합니다. 그리 길지는 않습니다 만, 나는 그것을 작성하는 것이 정말 힘들었습니다. (믿지 않는 사람들을 위해 : 당신에게 쉬운 것처럼 보이면, 얼마 동안 그것을 시도하고 ' t는 속임수 :)

  14. from https://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons by cc-by-sa and MIT lisence