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. 데이터베이스 지원
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');
로그인 후 복사
여러 데이터베이스를 지원하면 어떤 이점이 있나요? 귀하의 프로그램이 향후에 mysql에서 sql server 또는 oracle로 변경하려는 경우 PDO의 장점이 반영될 것입니다. 왜냐하면 데이터베이스 변경이 프로그램 인터페이스에 투명하고 MySQLi를 사용하는 경우 PHP 코드 변경이 매우 적기 때문입니다. , 모든 사용자 데이터베이스의 모든 내용을 다시 작성해야 하므로 이러한 변경만 수행할 수 있습니다.
4. 명명된 매개변수 지원
PDO 명명된 매개변수 및 매개변수 바인딩:
var_dump(PDO::getAvailableDrivers());
로그인 후 복사
및 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);
로그인 후 복사
위 비교를 보면 PDO는 명명된 매개변수를 통해 값을 바인딩하는 반면, MySQLi의 매개변수 바인딩은 점 표시 "?"를 사용하여 물음표 순서대로 값을 엄격하게 바인딩하는 것을 볼 수 있습니다. 이렇게 하면 코드가 PDO의 해당 이름만큼 길지 않은 것처럼 보이지만, 매개변수 수가 상대적으로 적으면 그 이상으로 늘어나도 눈에 띄지 않습니다. 10 하나 이상의 경우는 더 괴로워요. 물음표 순서대로 하나씩 값을 할당해야 합니다. 그 중 하나가 틀리면 다음도 틀리게 됩니다.
안타깝게도 MySQLi는 PDO와 같은 명명된 매개변수 바인딩을 지원하지 않습니다.
5. 객체 매핑
데이터베이스 기반 개발은 일반적으로 데이터베이스에서 데이터를 읽은 다음 객체를 사용하여 데이터를 전달합니다. PDO와 MySQLi 모두 객체 매핑을 지원합니다. 데이터베이스에 해당하는 일부 속성을 가진 User 클래스가 있다고 가정합니다.
$query = $mysqli->prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login > ?');
$query->bind_param('sss', 'test', $mail, time() - 3600);$query->execute();
로그인 후 복사
객체 매핑이 없으면 데이터를 읽은 후 필드에 값을 하나씩 할당해야 하는데 매우 지루합니다.
둘이 사용하는 객체의 코드는 아래를 참고해주세요:
class User { public $id; public $first_name; public $last_name;
public function info()
{ return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
}
}
로그인 후 복사
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";
}
}
로그인 후 복사
사용자가 입력한 username 매개 변수의 값이 위 값("'; DELETE FROM users; /*")일 때 이 값에 대해 아무런 처리를 하지 않으면 사용자가 성공적으로 주입한 것입니다. 삭제 문을 실행하면 사용자 테이블의 모든 레코드가 삭제됩니다.
6.1. 수동 이스케이프
$_GET['username'] = "'; DELETE FROM users; /*"
로그인 후 복사
위에서는 PDO 및 MySQLi API와 함께 제공되는 함수를 사용하여 얻은 매개변수의 값을 이스케이프합니다.
6.2 준비된 문 매개변수 바인딩
다음은 준비된 문 매개변수를 바인딩하는 더 효율적이고 안전한 방법입니다.
// 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'");
로그인 후 복사
7. 성능
PDO는 MySQL이 아닌 다른 데이터베이스도 지원할 수 있고 MySQLi는 특별히 MySQL용으로 설계되었기 때문에 MySQLi의 성능은 PDO보다 약간 더 좋습니다. 그러나 PDO와 MySQLi는 여전히 PHP의 기본 MySQL 확장만큼 빠르지 않습니다. 그러나 이러한 종류의 성능 비교는 실제로 큰 의미가 없습니다. 왜냐하면 모두 매우 빠르기 때문입니다. 프로그램 성능 요구 사항이 특별히 까다롭지 않은 경우 세 가지 모두 만족할 수 있습니다. 어떤 것을 선택하고 싶은지는 실제 상황에 따라 저울질해야 합니다.
8. 요약
PDO는 12가지 유형의 데이터베이스 드라이버와 명명된 매개변수 바인딩을 지원하는데, 이는 위의 비교를 통해 자신의 프로젝트에서 데이터베이스에 연결하는 데 어떤 것을 사용할지 알 수 있다고 생각합니다.
관련 권장 사항:
001 - PDO 사용에 대한 자세한 분석
위 내용은 002 - PDO와 MySQLi의 차이점과 선택의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!