>  기사  >  백엔드 개발  >  002 - PDO와 MySQLi의 차이점과 선택

002 - PDO와 MySQLi의 차이점과 선택

不言
不言원래의
2018-04-08 14:37:451914검색



PHP를 사용하여 데이터베이스에 액세스할 때 PHP와 함께 제공되는 데이터베이스 드라이버 외에도 일반적으로 PDO와 MySQLi라는 두 가지 더 나은 옵션이 있습니다. 실제 개발 과정에서 어느 것을 선택할지 결정하려면 먼저 두 가지 모두에 대해 상대적으로 포괄적인 이해가 필요합니다. 이 기사에서는 차이점을 분석하고 여러 데이터베이스 유형 지원, 안정성, 성능 등을 비교합니다.

PDO MySQLi
데이터베이스 지원 12개의 다양한 드라이버 MySQL 전용
API OOP OOP + 절차적
Connection Easy Easy
이름이 지정된 매개변수 Yes No
객체 매핑
준비됨 문
(클라이언트 측)
아니요
Performance Fast Fast
저장 프로시저

1. 절차적 API를 위해 제공되는 이 양식은 초보자가 이해하기 쉽습니다. 기본 PHP mysql 드라이버에 익숙하다면 MySQLi 인터페이스를 사용하여 원래 데이터 액세스를 대체하는 것이 쉽다는 것을 알게 될 것입니다. PDO를 사용하면 PDO는 여러 데이터베이스를 지원하지만 MySQLi는 MySQL만 지원한다는 점을 마스터하면 원하는 대로 여러 데이터베이스를 사용하고 연결할 수 있습니다.

3. 데이터베이스 지원

002 - PDO와 MySQLi의 차이점과 선택MySQLi에 비해 PDO의 가장 큰 장점은 PDO가 다양한 종류의 데이터베이스를 지원하는 반면, MySQLi는 MySQLi만 지원한다는 것입니다. PDO가 지원하는 데이터베이스를 보려면 다음 코드를 사용하세요.

// PDO$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password'); 
// mysqli, procedural way$mysqli = mysqli_connect('localhost','username','password','database'); 
// mysqli, object oriented way$mysqli = new mysqli('localhost','username','password','database');
002 - PDO와 MySQLi의 차이점과 선택여러 데이터베이스를 지원하면 어떤 이점이 있나요? 귀하의 프로그램이 향후에 mysql에서 sql server 또는 oracle로 변경하려는 경우 PDO의 장점이 반영될 것입니다. 왜냐하면 데이터베이스 변경이 프로그램 인터페이스에 투명하고 MySQLi를 사용하는 경우 PHP 코드 변경이 매우 적기 때문입니다. , 모든 사용자 데이터베이스의 모든 내용을 다시 작성해야 하므로 이러한 변경만 수행할 수 있습니다.

4. 명명된 매개변수 지원

PDO 명명된 매개변수 및 매개변수 바인딩:

var_dump(PDO::getAvailableDrivers());

및 MySQLi 매개변수 바인딩:


002 - PDO와 MySQLi의 차이점과 선택

$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);     
$pdo->prepare('
    SELECT * FROM users
    WHERE username = :username
    AND email = :email
    AND last_login > :last_login');     
$pdo->execute($params);

002 - PDO와 MySQLi의 차이점과 선택위 비교를 보면 PDO는 명명된 매개변수를 통해 값을 바인딩하는 반면, MySQLi의 매개변수 바인딩은 점 표시 "?"를 사용하여 물음표 순서대로 값을 엄격하게 바인딩하는 것을 볼 수 있습니다. 이렇게 하면 코드가 PDO의 해당 이름만큼 길지 않은 것처럼 보이지만, 매개변수 수가 상대적으로 적으면 그 이상으로 늘어나도 눈에 띄지 않습니다. 10 하나 이상의 경우는 더 괴로워요. 물음표 순서대로 하나씩 값을 할당해야 합니다. 그 중 하나가 틀리면 다음도 틀리게 됩니다.

안타깝게도 MySQLi는 PDO와 같은 명명된 매개변수 바인딩을 지원하지 않습니다.

5. 객체 매핑

데이터베이스 기반 개발은 일반적으로 데이터베이스에서 데이터를 읽은 다음 객체를 사용하여 데이터를 전달합니다. PDO와 MySQLi 모두 객체 매핑을 지원합니다. 데이터베이스에 해당하는 일부 속성을 가진 User 클래스가 있다고 가정합니다.

002 - PDO와 MySQLi의 차이점과 선택

002 - PDO와 MySQLi의 차이점과 선택

$query = $mysqli->prepare('
    SELECT * FROM users
    WHERE username = ?
    AND email = ?
    AND last_login > ?');     
$query->bind_param('sss', 'test', $mail, time() - 3600);$query->execute();

객체 매핑이 없으면 데이터를 읽은 후 필드에 값을 하나씩 할당해야 하는데 매우 지루합니다.

둘이 사용하는 객체의 코드는 아래를 참고해주세요:


002 - PDO와 MySQLi의 차이점과 선택

class User {    public $id;    public $first_name;    public $last_name;     
    public function info()
    {        return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
    }
}

002 - PDO와 MySQLi의 차이점과 선택

6. 보안


둘 다 SQL 인젝션을 방지할 수 있습니다. 먼저 예를 살펴보겠습니다.

$query = "SELECT id, first_name, last_name FROM users";     
// PDO$result = $pdo->query($query);$result->setFetchMode(PDO::FETCH_CLASS, 'User'); 
while ($user = $result->fetch()) {    echo $user->info()."\n";
}// MySQLI, procedural wayif ($result = mysqli_query($mysqli, $query)) {    while ($user = mysqli_fetch_object($result, 'User')) {        echo $user->info()."\n";
    }
}// MySQLi, object oriented wayif ($result = $mysqli->query($query)) {    while ($user = $result->fetch_object('User')) {        echo $user->info()."\n";
    }
}
002 - PDO와 MySQLi의 차이점과 선택

사용자가 입력한 username 매개 변수의 값이 위 값("'; DELETE FROM users; /*")일 때 이 값에 대해 아무런 처리를 하지 않으면 사용자가 성공적으로 주입한 것입니다. 삭제 문을 실행하면 사용자 테이블의 모든 레코드가 삭제됩니다.

6.1. 수동 이스케이프002 - PDO와 MySQLi의 차이점과 선택

$_GET['username'] = "'; DELETE FROM users; /*"

위에서는 PDO 및 MySQLi API와 함께 제공되는 함수를 사용하여 얻은 매개변수의 값을 이스케이프합니다.

6.2 준비된 문 매개변수 바인딩

다음은 준비된 문 매개변수를 바인딩하는 더 효율적이고 안전한 방법입니다.

002 - PDO와 MySQLi의 차이점과 선택

// PDO, "manual" escaping$username = PDO::quote($_GET['username']); 
$pdo->query("SELECT * FROM users WHERE username = $username");         
// mysqli, "manual" escaping$username = mysqli_real_escape_string($_GET['username']); 
$mysqli->query("SELECT * FROM users WHERE username = '$username'");
002 - PDO와 MySQLi의 차이점과 선택

7. 성능

PDO는 MySQL이 아닌 다른 데이터베이스도 지원할 수 있고 MySQLi는 특별히 MySQL용으로 설계되었기 때문에 MySQLi의 성능은 PDO보다 약간 더 좋습니다. 그러나 PDO와 MySQLi는 여전히 PHP의 기본 MySQL 확장만큼 빠르지 않습니다. 그러나 이러한 종류의 성능 비교는 실제로 큰 의미가 없습니다. 왜냐하면 모두 매우 빠르기 때문입니다. 프로그램 성능 요구 사항이 특별히 까다롭지 않은 경우 세 가지 모두 만족할 수 있습니다. 어떤 것을 선택하고 싶은지는 실제 상황에 따라 저울질해야 합니다.

8. 요약

PDO는 12가지 유형의 데이터베이스 드라이버와 명명된 매개변수 바인딩을 지원하는데, 이는 위의 비교를 통해 자신의 프로젝트에서 데이터베이스에 연결하는 데 어떤 것을 사용할지 알 수 있다고 생각합니다.

관련 권장 사항:

001 - PDO 사용에 대한 자세한 분석

위 내용은 002 - PDO와 MySQLi의 차이점과 선택의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.