PDO(PHP Data Object)는 PHP 5의 새로운 기능입니다. PHP 6이 출시되려고 할 때 PHP 6에서는 기본적으로 PDO만 사용하여 데이터베이스를 처리하고 모든 데이터베이스 확장을 PECL로 이동하므로 기본값은 더 이상 없습니다. .php_mysql.dll 등은 어떻게 해야 할까요? 시대에 따라갈 수 밖에 없어서 PDO를 시도해보았습니다. (이 기사는 초보 수준이므로 전문가는 건너뛸 수 있습니다. 하하)
[PDO란 무엇입니까]
PDO는 PHP 5에 추가된 새로운 주요 기능입니다. 왜냐하면 PHP 5 이전에는 php4/php3가 서로 통신할 수 있는 많은 데이터베이스 확장 기능을 갖고 있었기 때문입니다. 데이터베이스 연결 및 처리, php_mysql.dll, php_pgsql.dll, php_mssql.dll, php_sqlite.dll 및 기타 확장을 사용하여 MySQL, PostgreSQL, MS SQL Server, SQLite를 연결하려면 ADOdb, PEAR::DB, PHPlib를 사용해야 합니다. :DB와 같은 데이터베이스 추상 클래스는 우리에게 도움이 되기에는 매우 번거롭고 비효율적입니다. 그런데 어떻게 PHP 코드의 효율성이 그렇게 높아 C/C++로 직접 작성할 수 있습니까? 따라서 PDO의 출현은 불가피합니다. 모두가 차분한 학습 태도로 PDO의 사용을 받아들여야 합니다. 아마도 이것이 많은 노력을 절약할 수 있다는 것을 알게 될 것입니다.
[PDO 설치]
Windows XP SP2를 사용하고 있으므로 모든 과정은 Windows에서 진행됩니다. Linux/FreeBSD 및 기타 플랫폼의 경우 직접 정보를 찾아 설치하시기 바랍니다.
내 것은 이미 php_pdo.dll 확장이 포함된 PHP 5.1.4이지만 사용하려면 약간의 설정이 필요합니다.
내 PHP 구성 파일인 c:windowsphp.ini를 열고 다음 줄을 찾습니다.
Extension_dir
이것은 내 PHP 5 확장이 있는 디렉터리입니다: C:php5ext. 이 줄을 다음과 같이 변경하세요:
Extension_dir = "C:/php5/ext"
그런 다음 php.ini에서 찾으세요:
;;;;;;;;;;;;;;;;;
; 동적 확장 ;
;;;;;;;;;;;;;;
아래에는 ;extension=php_mbstring.dll 과 유사한 내용이 많이 있습니다. 끝에 추가하세요. PDO 확장:
Extension=php_pdo.dll
확장자=php_pdo_mysql.dll
확장자=php_pdo_pgsql.dll
확장자=php_pdo_sqlite.dll
확장자=php_pdo_mssql.dll
확장자=php_pdo_odbc.dll
확장자=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll
다양한 PDO 드라이버를 추가할 수 있지만 다음 php_pdo_oci8.dll은 Oralce 데이터베이스를 설치하지 않았기 때문에 이것이 없기 때문에 세미콜론을 사용하여 주석 처리합니다. 그런 다음 웹 서버인 IIS/Apache를 다시 시작하세요. 내 것은 IIS입니다. Windows에서는 쉽습니다.
다시 시작한 후 웹 서버의 문서 디렉터리에 phpinfo.php 파일을 작성하고 다음을 추가합니다:
<?
PHP정보();
?>
그런 다음 멋진 브라우저를 엽니다: IE/FireFox, 내 것은 FireFox 2.0입니다. 방금 다운로드했습니다. 훌륭합니다. 악성 소프트웨어도 두렵지 않습니다. 하하.
브라우저에 http://localhost/phpinfo.php를 입력하세요. 이 페이지의 경로가 일치하지 않으면 직접 입력하세요.
출력 내용에서 성공적으로 볼 수 있는 경우:
PDO
PDO 지원 활성화
PDO 드라이버 mysql, pgsql, sqlite, mssql, odbc, firebird
뒷면에는 PDO_Firebird, pdo_mssql, pdo_mysql, PDO_ODBC, pdo_pgsql, pdo_sqlite 등 다양한 드라이버 지침이 있습니다.
그렇지 않으면 위의 단계를 주의 깊게 확인하세요. .
[빠른 테스트]
저는 MySQL 4.0.26을 사용하고 있지만 개인적으로 모든 사람들에게 MySQL 4.1.x나 MySQL 5.0.x를 사용하는 것을 권장합니다. 왜냐하면 이들 버전에는 배울 만한 흥미로운 것들이 많이 있기 때문입니다. 우리 PDO가 연결해야 하는 것은 MySQL 4.0입니다. MySQL을 설치하지 않았다면 직접 설치하십시오. MySQL을 구축하고 id, 이름, 성별, 시간 등 4개 필드를 포함하는 foo 테이블을 테스트 라이브러리에 추가했습니다.
우리는 첫 번째 PDO 애플리케이션을 구축하기 시작했고 웹 문서 디렉토리에 pdo.php 파일을 생성했습니다:
<?php
$dsn = "mysql:호스트=localhost;dbname=테스트";
$db = 새로운 PDO($dsn, '루트', '');
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
에코 $count;
$db = 널;
?>
무슨 뜻인지 모르겠어요. 천천히 설명해 보겠습니다.
$dsn = "mysql:host=localhost;dbname=test";
내부
정보를 살펴보세요. 데이터베이스 유형은 mysql, 호스트 주소는 localhost, 데이터베이스 이름입니다. 테스트입니다. 몇 가지 정보만 제공됩니다. 데이터베이스마다 데이터 소스 구성 방법이 다릅니다.
$db = new PDO($dsn, 'root', '');
생성자의 첫 번째 매개변수는 데이터 소스이고, 두 번째 매개변수는 데이터베이스 서버에 연결하는 사용자이고, 세 번째 매개변수는 비밀번호입니다. . 연결이 성공했다고 보장할 수는 없습니다. 여기서는 연결이 성공했다고 가정합니다.
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
echo $count;
성공적으로 연결된 PDO 개체를 호출하여 쿼리를 실행합니다. 이 쿼리는 레코드를 삽입하는 작업입니다. PDO::exec() 메서드를 사용하면 레코드에 영향을 주는 결과가 반환됩니다. 마지막으로 개체 리소스를 종료해야 합니다
.$db = null;
기본적으로 이는 긴 연결이 아닙니다. 데이터베이스에 대한 긴 연결이 필요한 경우 마지막 매개변수 array(PDO::ATTR_PERSISTENT)를 추가해야 합니다. => true) 다음과 같습니다:
$db = new PDO( $dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));
별로 다르지 않을 수도 있습니다. 이전 것과 비슷하지만 ADOdb와 다소 유사합니다.
[계속 학습]
데이터를 추출하려면 데이터 수집 기능을 사용해야 합니다. (아래에 사용된 $db는 위에 연결된 모든 객체입니다)
<?php
foreach($db->query("SELECT * FROM foo")){
print_r($행);
}
?>
다음 획득 방법도 사용할 수 있습니다:
<?php
$rs = $db->query("SELECT * FROM foo");
while($row = $rs->fetch()){
print_r($행);
}
?>
모든 데이터를 한 번에 배열로 가져오려면 다음과 같이 하면 됩니다:
<?php
$rs = $db->query("SELECT * FROM foo");
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>
배열
([0] => 배열(
[ID] => 1
[0] => 1
[이름] => 헤이엘루렌
[1] =>헤이엘루렌
[성별] =>남성[2] =>남성[시간] =>2006-10-28 23:14:23
[3] => 2006-10-28 23:14:23
)
}
내부의 레코드를 살펴보겠습니다. 디지털 인덱스와 관련 인덱스가 모두 있는데 이는 리소스 낭비입니다:
<?php.
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>
위 코드를 보면 setAttribute() 메소드는 몇 가지 속성을 설정하는 것입니다. 주요 속성은 PDO::ATTR_CASE, PDO::ATTR_ERRMODE 등입니다. 여기서 설정해야 할 것은 PDO::ATTR_CASE입니다. , 관련 인덱스를 사용하여 데이터를 얻습니다. 설정할 때 관련 인덱스가 대문자인지 소문자인지에 대한 몇 가지 옵션이 있습니다.
PDO::CASE_LOWER - 열 이름을 소문자로 강제합니다. PDO::CASE_NATURAL - 열 이름은 다음과 같습니다. 원래 방식으로 PDO::CASE_UPPER - 열 이름을 대문자로 강제합니다.
setFetchMode 메소드를 사용하여 결과 세트를 가져오기 위한 반환 값 유형을 설정합니다.
PDO::FETCH_ASSOC - 연관 배열 형식 PDO.
::FETCH_NUM - 숫자 인덱스 배열 형식 PDO::FETCH_BOTH - 두 가지 배열 형식입니다. 예, 이는 기본 PDO::FETCH_OBJ입니다.물론
이전 mysql_fetch_object()와 유사한 개체 형식입니다.
PDO::FETCH_ASSOC를 사용하십시오. 구체적으로 무엇을 사용할지는 귀하의 필요에 따라 다릅니다. 기타 획득 유형 참조 매뉴얼.
위의 데이터 획득 방법 외에도 다음 방법도 있습니다:
<?php
$rs = $db->prepare("SELECT * FROM foo");
$rs->실행();
while($row = $rs->fetch()){
print_r($행);
}
?>
사실 거의 비슷해요. 지정된 레코드의 필드 결과를 얻으려면 PDOStatement::fetchColumn()을 사용할 수 있습니다.
<?php
$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
에코 $col;
?>
일반적으로 fetchColumn()은 카운트 통계를 수행하는 데 사용되거나 단일 필드만 필요한 일부 레코드는 조작하기 쉽습니다.
위 작업을 간략하게 요약하면
쿼리 작업은 주로 PDO::query(), PDO::exec() 및 PDO::prepare()입니다. PDO::query()는 기록된 결과를 반환하는 작업, 특히 SELECT 작업에 주로 사용됩니다. PDO::exec()는 INSERT, UPDATE, DELETE 및 기타 작업과 같이 결과 집합을 반환하지 않는 작업에 주로 사용됩니다. 결과는 현재 작업의 영향을 받은 열 수를 반환합니다. PDO::prepare()는 주로 전처리 작업입니다. 전처리에서 SQL 문을 실행하려면 $rs->execute()를 사용해야 합니다. 이 방법은 매개 변수를 바인딩할 수 있으며 이 기사에서는 간단하게 설명할 수 없습니다. . 모두 매뉴얼 및 기타 문서를 참조할 수 있습니다. 결과 세트를 얻기 위한 주요 작업은 PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL()입니다. PDOStatement::fetchColumn()은 가져오기 결과에 지정된 첫 번째 레코드의 필드입니다. 기본값은 첫 번째 필드입니다. PDOStatement::fetch()는 레코드를 가져오는 데 사용되며, PDOStatement::fetchAll()은 모든 레코드 세트를 하나로 가져오는 데 사용됩니다. 결과를 얻으려면 PDOStatement::setFetchMode를 통해 필요한 결과 세트의 유형을 설정하면 됩니다. .
두 가지 주변 작업도 있습니다. 하나는 PDO::lastInsertId() 및 PDOStatement::rowCount()입니다. PDO::lastInsertId()는 마지막 삽입 작업을 반환하고 기본 키 열 유형은 마지막 자동 증가 ID입니다. PDOStatement::rowCount()는 주로 PDO::query() 및 PDO::prepare()의 DELETE, INSERT 및 UPDATE 작업의 영향을 받는 결과 집합에 사용되며 PDO::exec() 메서드에는 유효하지 않습니다. 및 SELECT 작업.
[오류 처리]
프로그램에서 오류가 발생하면 어떻게 해야 하나요? 여기서는 PDO 클래스의 오류 정보 및 예외 처리에 대해 설명합니다.
1. 객체지향 접근
먼저 연결 오류 등을 처리하는 방법을 살펴보고 이를 처리하기 위해 객체지향 접근 방식을 사용하겠습니다
.
노력하다 {
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$db = 널;
} 잡기(PDOException $e) {
"오류: " . $e->getMessage() "<br/>"를 인쇄합니다.
주사위();
}
?>
여기서는 PHP 5의 객체지향 예외 처리 기능을 사용합니다. 예외가 발생하면 PDOException을 호출하여 예외 클래스를 초기화합니다.
PDOException 예외 클래스의 속성 구조:
<?php
클래스 PDOException은 예외를 확장합니다.
{
public $errorInfo = null; // 오류 정보를 보려면 PDO::errorInfo() 또는 PDOStatement::errorInfo()를 호출하여 보호된 $message에 액세스할 수 있습니다. // 예외 정보를 보려면 Exception::getMessage()를 시도할 수 있습니다. access protected $code ; // Exception::getCode()를 사용하여 액세스할 수 있는 SQL 상태 오류 코드
}
?>
이 예외 처리 클래스는 PHP 5에 내장된 예외 처리 클래스와 통합되어 있습니다. PHP 5에 내장된 예외 처리 클래스의 구조를 간략하게 살펴보겠습니다.
<?php
클래스예외
{
//Property protected $message = '알 수 없는 예외'; //예외 메시지 protected $code = 0; //사용자 정의 예외 코드 protected $file; //예외가 발생한 파일 이름; 예외가 발생한 위치 라인 번호
// 메소드 final function getMessage(); // 예외 코드 반환 final function getFile() // 예외가 발생한 파일 이름 반환 final function getLine; (); // 예외가 발생한 코드 라인 번호를 반환합니다. final function getTrace(); // backtrace() 배열 final function getTraceAsString() // 문자열로 형식화된 getTrace();
}
?>
이에 따라 코드에서 getFile() 및 getLine()을 적절하게 호출하여 오류를 찾아 디버깅을 더욱 편리하게 만들 수 있습니다.
2. 프로세스 중심 접근 방식을 사용하여
코드를 먼저 살펴보세요.
<?
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$rs = $db->query("SELECT aa,bb,cc FROM foo");
if ($db->errorCode() != '00000'){
print_r($db->errorInfo());
출구;
}
$arr = $rs->fetchAll();
print_r($arr);
$db = 널;
?>
PDO 및 PDOStatement 객체에는 errorCode() 및 errorInfo() 메서드가 있습니다. 오류가 없으면 errorCode()는 00000을 반환하고, 그렇지 않으면 일부 오류 코드가 반환됩니다. errorInfo()는 PHP와 MySQL에서 정의한 오류 코드와 오류 정보를 포함하는 배열을 반환합니다. 배열 구조는 다음과 같습니다
.
(
[0] => 42S22
[1] => 1054
[2] => '필드 목록'의 알 수 없는 열 'aaa'
)
각 쿼리가 실행된 후 errorCode()의 결과가 최신이므로 오류 메시지 표시를 직접 쉽게 제어할 수 있습니다.
[간단한 요약]
위의 사용법을 통해 PDO가 실제로 강력하다는 것을 알 수 있습니다. 바인딩 매개변수, 전처리, 저장 프로시저, 트랜잭션 처리 및 기타 기능과 같이 제가 언급하지 않은 다른 기능도 있습니다. 또한 다양한 데이터 확장 DSN 구조가 있습니다. Oracle 데이터베이스 자체에는 심층적인 연구와 이해가 필요한 많은 특수한 사항이 있습니다. 이 기사에서는 PDO에 대한 간단한 이해로 간주할 수 있는 몇 가지 입문 지식만 간략하게 설명합니다.