Yii 학습 총화 데이터 접근 대상(DAO)

Yii 는 강력 한 데이터베이스 프로 그래 밍 지원 을 제공 합 니 다.Yii 데이터 액세스 대상(DAO)은 PHP 의 데이터 대상(PDO)extension 에 구축 되 어 하나의 통 일 된 인터페이스 에서 서로 다른 데이터베이스 관리 시스템(DBMS)에 접근 할 수 있 도록 한다.Yii 의 DAO 를 사용 하여 개발 한 응용 프로그램 은 데이터 액세스 코드 를 수정 하지 않 고 서로 다른 데이터베이스 관리 시스템 을 쉽게 전환 할 수 있 습 니 다.
데이터 액세스 대상(DAO)은 서로 다른 데이터베이스 관리 시스템(DBMS)에 저 장 된 데이터 에 접근 하 는 데 일반적인 API 를 제공 합 니 다.따라서 밑바닥 DBMS 를 다른 것 으로 바 꿀 때 DAO 접근 데 이 터 를 사용 한 코드 를 수정 할 필요 가 없다.
Yii DAO 는 PHP Data Objects(PDO)를 기반 으로 구축 되 었 습 니 다.이것 은 많은 유행 하 는 DBMS 에 통 일 된 데이터 접근 을 제공 하 는 확장 프로그램 으로 이 DBMS 는 MySQL,PostgreSQL 등 을 포함한다.따라서 Yii DAO,PDO 확장 및 특정 PDO 데이터베이스 구동(예:PDOMYSQL)설치 해 야 합 니 다.
Yii DAO 는 주로 다음 과 같은 네 가지 유형 을 포함 합 니 다.
CDbConnection:데이터베이스 연결 을 대표 합 니 다.
CDbCommand:데이터 베 이 스 를 통 해 실 행 된 SQL 문 구 를 대표 합 니 다.
CDbdata Reader:검색 결과 가 집 중 된 줄 에서 앞으로 만 이동 하 는 흐름 을 의미 합 니 다.
CDbTransaction:데이터베이스 업 무 를 대표 합 니 다.
다음은 Yi DAO 의 다양한 장면 에서 의 응용 을 소개 한다.
1.데이터베이스 연결 만 들 기
데이터베이스 연결 을 만 들 려 면 CDbConnection 인 스 턴 스 를 만 들 고 활성화 합 니 다.데이터베이스 에 연결 하려 면 연결 정 보 를 지정 하기 위해 데이터 원본 이름(DSN)이 필요 합 니 다.사용자 이름과 비밀번호 도 사용 할 수 있 습 니 다.데이터베이스 에 연결 하 는 과정 에서 오류 가 발생 했 을 때(예 를 들 어 잘못된 DSN 이나 잘못된 사용자 이름/비밀번호)이상 을 던 집 니 다.

$connection=new CDbConnection($dsn,$username,$password);
// 。   try...catch
$connection->active=true;
......
$connection->active=false;  //
DSN 의 형식 은 사용 하 는 PDO 데이터베이스 구동 에 달 려 있다.전체적으로 보면 DSN 은 PDO 구동 의 이름 을 포함 하고 짝 퉁 을 따라 가 특정한 연결 문법 을 구동 해 야 한다.PDO 문 서 를 찾 아 더 많은 정 보 를 얻 을 수 있 습 니 다.다음은 DSN 형식 을 자주 사용 하 는 목록 입 니 다.

SQLite: sqlite:/path/to/dbfile
MySQL: mysql:host=localhost;dbname=testdb
PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
SQL Server: mssql:host=localhost;dbname=testdb
Oracle: oci:dbname=//localhost:1521/testdb
CDbConnection 은 CApplicationComponent 에서 계승 되 기 때문에 응용 구성 요소 로 도 사용 할 수 있 습 니 다.이렇게 하려 면 응용 설정 에 db(또는 다른 이름)응용 구성 요 소 를 다음 과 같이 설정 하 십시오.

array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'root',
            'password'=>'password',
            'emulatePrepare'=>true,  // needed by some MySQL installations
        ),
    ),
)
그리고 우 리 는 Yii:app()->db 를 통 해 데이터 베 이 스 를 방문 하여 연결 할 수 있 습 니 다.이것 은 우리 가 특별히 CDbConnection::autoConnect 를 false 로 설정 하지 않 는 한 자동 으로 활성화 되 었 습 니 다.이런 방식 을 통 해 이 단독 DB 연결 은 우리 코드 의 많은 곳 에서 공유 할 수 있다.
2.SQL 문장 실행
데이터베이스 연결 이 만들어 지면 SQL 문 구 는 CDbCommand 를 사용 하여 실 행 될 수 있 습 니 다.지정 한 SQL 문 구 를 매개 변수 로 CDbConnection::createCand()를 호출 하여 CDbCommand 인 스 턴 스 를 만 들 수 있 습 니 다.

$connection=Yii::app()->db;   // "db"
// , :
// $connection=new CDbConnection($dsn,$username,$password);
$command=$connection->createCommand($sql);
// , SQL :
// $command->text=$newSQL;
하나의 SQL 문 구 는 CDbCommand 를 통 해 다음 과 같은 두 가지 방식 으로 실 행 됩 니 다.
execute():INSERT,UPDATE,DELETE 와 같은 무 조회(non-query)SQL 문 구 를 실행 합 니 다.성공 하면 이 실행 에 영향 을 미 치 는 줄 수 를 되 돌려 줍 니 다.
query():SELECT 와 같은 여러 줄 의 데 이 터 를 되 돌려 주 는 SQL 문 구 를 실행 합 니 다.성공 하면 CDbDataReader 인 스 턴 스 를 되 돌려 줍 니 다.이 인 스 턴 스 를 통 해 데이터 의 결과 줄 을 옮 겨 다 닐 수 있 습 니 다.간편 함 을 위해(Yii)는 검색 결 과 를 직접 되 돌려 주 는 일련의 query XXX()방법 도 실현 했다.
SQL 문 구 를 실행 할 때 오류 가 발생 하면 이상 을 던 집 니 다.

$rowCount=$command->execute();   // SQL
$dataReader=$command->query();   // SQL
$rows=$command->queryAll();      //
$row=$command->queryRow();       //
$column=$command->queryColumn(); //
$value=$command->queryScalar();  //
3.검색 결과 가 져 오기
CDbcommand::query()에서 CDbDataReader 인 스 턴 스 를 생 성 한 후,CDbDataReader::read()를 중복 호출 하여 결과 의 줄 을 가 져 올 수 있 습 니 다.또한 PHP 의 foreach 언어 구조 에서 CDbdataReader 한 줄 로 데 이 터 를 검색 할 수 있 습 니 다.

$dataReader=$command->query();
// read() false
while(($row=$dataReader->read())!==false) { ... }
// foreach
foreach($dataReader as $row) { ... }
//
$rows=$dataReader->readAll();
메모:query()와 달리 모든 query XXX()방법 은 데 이 터 를 직접 되 돌려 줍 니 다.예 를 들 어 query Row()는 검색 결과 의 첫 줄 을 나타 내 는 배열 을 되 돌려 줍 니 다.
4.사무 사용
한 응용 프로그램 이 몇 가지 조 회 를 실행 하려 면 모든 조 회 는 데이터 베이스 에서 정 보 를 읽 거나 데이터베이스 에 기록 해 야 할 때 데이터 베 이 스 는 몇 가지 조 회 를 남기 지 않 고 다른 몇 가지 조회 만 수행 하 는 것 이 매우 중요 하 다.사 무 는 Yii 에서 CDbTransaction 인 스 턴 스 로 나타 나 며 다음 상황 에서 시 작 될 수 있 습 니 다.
사 무 를 시작 하 다.
하나하나 조 회 를 실행 하 다.데이터베이스 업데이트 가 외부 에 보이 지 않 습 니 다.
사무 에 부치다.트 랜 잭 션 이 성공 하면 업데이트 가 보 입 니 다.
검색 에 실패 하면 모든 트 랜 잭 션 이 다시 굴 러 갑 니 다.
상기 워 크 플 로 는 다음 과 같은 코드 를 통 해 이 루어 질 수 있 습 니 다.

$transaction=$connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    //.... other SQL executions
    $transaction->commit();
}
catch(Exception $e) // ,
{
    $transaction->rollBack();
}
5.귀속 매개 변수
SQL 주입 공격 을 피하 고 중복 실행 되 는 SQL 문장의 효율 을 높이 려 면 선택 할 수 있 는 매개 변수 자리 표시 자 를 포함 하 는 SQL 문 구 를 준비(prepare)할 수 있 습 니 다.매개 변수 가 연결 되 어 있 을 때 이 자리 표시 자 는 실제 매개 변수 로 대 체 됩 니 다.
매개 변수 자리 표시 자 는 이름(유일한 태그 로 표시)이나 이름 이 없 는(물음표 로 표시)일 수 있 습 니 다.CDbcommand::bindParam()또는 CDbcommand::bindValue()를 호출 하여 실제 매개 변 수 를 사용 하여 이 자리 표시 자 를 대체 합 니 다.이 매개 변 수 는 따옴표 로 일 으 킬 필요 가 없다.바 텀 데이터 베 이 스 를 구동 하면 이것 을 해결 해 줄 것 이다.매개 변수 바 인 딩 은 SQL 문 구 를 실행 하기 전에 완료 해 야 합 니 다.

// ":username" ":email" SQL
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// ":username"
$command->bindParam(":username",$username,PDO::PARAM_STR);
// Email ":email"
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
//
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
방법 bindParam()과 bindValue()는 매우 비슷 하 다.유일한 차이 점 은 전자 가 하나의 PHP 변 수 를 사용 하고 후 자 는 하나의 값 을 사용 하 는 것 이다.메모리 에 있 는 빅 데이터 블록 매개 변 수 는 성능 을 고려 하여 전 자 를 우선 사용 해 야 합 니 다.
바 인 딩 매개 변수 에 대한 더 많은 정 보 는 관련 PHP 문 서 를 참고 하 십시오.
6.귀속 열
검색 결 과 를 가 져 올 때 도 PHP 변 수 를 사용 하여 열 을 연결 할 수 있 습 니 다.이렇게 하면 검색 결과 의 한 줄 을 가 져 올 때마다 최신 값 으로 자동 으로 채 워 집 니 다.

$sql="SELECT username, email FROM tbl_user";
$dataReader=$connection->createCommand($sql)->query();
// $username (username)
$dataReader->bindColumn(1,$username);
// $email (email)
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
    // $username $email username email
}
7.테이블 접두사 사용
Yii 는 버 전 1.1.0 부터 표 접두사 사용 에 대한 통합 지원 을 제공 합 니 다.표 접 두 사 는 현재 연 결 된 데이터베이스 에 있 는 데이터 시트 의 이름 앞 에 추 가 된 문자열 을 말 합 니 다.이 는 공 유 된 서버 환경 에 자주 사 용 됩 니 다.이 환경 에서 여러 응용 프로그램 은 같은 데이터 베 이 스 를 공유 할 수 있 습 니 다.서로 다른 표 접 두 사 를 사용 하여 서로 구분 해 야 합 니 다.예 를 들 어 하나의 응용 프로그램 은 tbl 을 사용 할 수 있다.표 접두사 로 다른 하 나 는 yii 를 사용 할 수 있 습 니 다.
표 접 두 사 를 사용 하려 면 CDbConnection::tablePrefix 속성 을 원 하 는 표 접두사 로 설정 하 십시오.그리고 SQL 구문 에{{TableName}대표 표 의 이름 을 사용 합 니 다.TableName 은 접두사 가 없 는 표 이름 을 말 합 니 다.예 를 들 어 데이터베이스 에 tbl 라 는 이름 이 포함 되 어 있다 면user 의 시계,tbl표 접두사 로 설정 되 어 있 으 면 다음 코드 를 사용 하여 사용자 와 관련 된 조 회 를 수행 할 수 있 습 니 다.

$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();

좋은 웹페이지 즐겨찾기