YII Framework 학습 강좌 - YII의 모델 - 데이터베이스 조작 - 사용자 정의 DAO 조작
다음은 YII가 제공하는 DAO 조작과 관련된 종류의 사용 방법을 설명한다.구체적인 클래스는 프레임워크/db 폴더에 있습니다
.
├── ar
│ ├── CActiveFinder.php
│ ├── CActiveRecordBehavior.php
│ └── CActiveRecord.php
├── CDbCommand.php sql
├── CDbConnection.php
├── CDbDataReader.php
├── CDbException.php
├── CDbMigration.php
├── CDbTransaction.php
└── schema , , , yii 。
├── CDbColumnSchema.php
├── CDbCommandBuilder.php
├── CDbCriteria.php
├── CDbExpression.php
├── CDbSchema.php
├── CDbTableSchema.php
├── mssql
│ ├── CMssqlColumnSchema.php
│ ├── CMssqlCommandBuilder.php
│ ├── CMssqlPdoAdapter.php
│ ├── CMssqlSchema.php
│ └── CMssqlTableSchema.php
├── mysql
│ ├── CMysqlColumnSchema.php
│ ├── CMysqlSchema.php
│ └── CMysqlTableSchema.php
├── oci
│ ├── COciColumnSchema.php
│ ├── COciCommandBuilder.php
│ ├── COciSchema.php
│ └── COciTableSchema.php
├── pgsql
│ ├── CPgsqlColumnSchema.php
│ ├── CPgsqlSchema.php
│ └── CPgsqlTableSchema.php
└── sqlite
├── CSqliteColumnSchema.php
├── CSqliteCommandBuilder.php
└── CSqliteSchema.php
7 directories, 33 files
이를 통해 알 수 있듯이 데이터베이스 운영 클래스는 주로 다음과 같습니다.
├── CDbConnection.php
├── CDbCommand.php
├── CDbDataReader.php ├── CDbException.php ├── CDbMigration.php ├── CDbTransaction.php
연결, 실행, 결과 집합 조작, 사물, 이상, 데이터 이동.
1. 데이터베이스 연결 CDbConnection.php
YII의 DAO는 봉인된 PDO이기 때문에 데이터베이스에 연결하는 데 필요한 정보(연결방식, 사용자 이름, 비밀번호)도 자연히 유사하다.클래스를 열어 구체적인 실현 방식과 사용 방법을 보아라.
클래스의 주석을 통해 연결 방법을 이해할 수 있다.
* CDbConnection represents a connection to a database.
*
* CDbConnection works together with {@link CDbCommand}, {@link CDbDataReader}
* and {@link CDbTransaction} to provide data access to various DBMS
* in a common set of APIs. They are a thin wrapper of the {@link http://www.php.net/manual/en/ref.pdo.php PDO}
* PHP extension.
*
* To establish a connection, set {@link setActive active} to true after
* specifying {@link connectionString}, {@link username} and {@link password}.
*
* The following example shows how to create a CDbConnection instance and establish
* the actual connection:
* <pre>
* $connection=new CDbConnection($dsn,$username,$password);
* $connection->active=true;
* </pre>
매개변수:
$dsn:
/**
* @var string The Data Source Name, or DSN, contains the information required to connect to the database.
* @see http://www.php.net/manual/en/function.PDO-construct.php
*
* Note that if you're using GBK or BIG5 then it's highly recommended to
* update to PHP 5.3.6+ and to specify charset via DSN like
* 'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'.
*/
public $connectionString;
$dsn의 구체적인 규칙은 참조할 수 있습니다http://www.php.net/manual/en/function.PDO-construct.php.
http://cn2.php.net/manual/en/pdo.drivers.php
형식은 다음과 같습니다.
uri:file:///path/to/dsnfile
YII 공식 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
데이터베이스에 연결된 인코딩을 지정하려면charset=을 추가할 수 있습니다.물론 sql 문장 설정 인코딩 형식을 실행할 수 있습니다.
$username
$password
구체적인 예는 다음과 같다.
/yii_dev/testwebap/protected/models/Member.php
<?php
class Member extends CModel
{
private $connection = null;
public function __construct ()
{
//YII , ,
$this->connection = Yii::app()->db;
//or, , ,
/*
$dsn = Yii::app()->db->connectionString;
$username = Yii::app()->db->username;
$password = Yii::app()->db->password;
$this->connection = new CDbConnection($dsn, $username, $password);
$this->connection->charset = 'utf8';
$this->connection->active = true;
*/
}
/**
* Returns the static model of the specified AR class.
* @return User the static model class
*/
public static function model ($className = __CLASS__)
{
return parent::model($className);
}
/**
*
*
*/
public function stats ()
{
return $this->connection ? 'connection successful!' : 'connection fail!';
}
public function attributeNames ()
{}
}
$this->connection->active = true;연결이 열려 있음을 나타냅니다.
/yii_dev/testwebap/protected/modules/testmod/controllers/DefaultController.php
<?php
class DefaultController extends Controller
{
public function actionDao ()
{
$memberModel = new Member();
var_dump($memberModel->stats());
}
구체적인 실현 방식은 스스로 유형을 참고할 수 있으므로 여기서 더 이상 누술하지 않겠다.
2. 데이터베이스 기본 운영 CDbCommand.php
데이터베이스 연결이 구축되면 CDbCommand 클래스에서 제공하는 방법을 통해 데이터베이스 조작을 할 수 있다.
클래스에서 제공하는 사용 방법:
* After the DB connection is established, one can execute an SQL statement like the following:
* <pre>
* $command=$connection->createCommand($sqlStatement);
* $command->execute(); // a non-query SQL statement execution
* // or execute an SQL query and fetch the result set
* $reader=$command->query();
*
* // each $row is an array representing a row of data
* foreach($reader as $row) ...
* </pre>
*
* One can do prepared SQL execution and bind parameters to the prepared SQL:
* <pre>
* $command=$connection->createCommand($sqlStatement);
* $command->bindParam($name1,$value1);
* $command->bindParam($name2,$value2);
* $command->execute();
* </pre>
기본 사용 방법은 다음과 같다.
<?php
class Member extends CModel
{
private $connection = null;
private $command = null;
public function __construct ()
{
$this->connection = Yii::app()->db;
}
/**
* Returns the static model of the specified AR class.
* @return User the static model class
*/
public static function model ($className = __CLASS__)
{
return parent::model($className);
}
/**
*
*
*/
public function stats ()
{
return $this->connection ? 'connection successful!' : 'connection fail!';
}
/**
*
*
*/
public function getUsernames ()
{
$sqlStatement = ' SELECT `username` FROM `testdrive`.`tbl_user` ';
$this->command = $this->connection->createCommand($sqlStatement);
return $this->command->queryAll();
}
/**
*
*
* @param string $userName
*/
public function getNickname ($userName)
{
$sqlStatement = ' SELECT `username` FROM `testdrive`.`tbl_user` WHERE `username`=:username ';
$this->command = $this->connection->createCommand($sqlStatement);
$this->command->bindParam('username', $userName);
return $this->command->queryAll();
}
/**
*
*
*/
public function addUser ()
{
$sqlStatement = " INSERT INTO `tbl_user` (`username`, `password`, `email`) VALUES ('test', 'test', '[email protected]') ";
$this->command = $this->connection->createCommand($sqlStatement);
return $this->command->execute();
}
public function attributeNames ()
{}
}
<?php
class DefaultController extends Controller
{
public function actionUsernames ()
{
$memberModel = new Member();
var_dump($memberModel->getUsernames());
}
public function actionNickname ()
{
$memberModel = new Member();
var_dump($memberModel->getNickname('admin'));
}
public function actionAdduser ()
{
$memberModel = new Member();
var_dump($memberModel->addUser());
}
요약:
***** 일반 함수
(1) SQL 문에서 결과 집합을 반환하는 경우: 예를 들어 SELECT.일반적으로query로 시작하는 계열 함수:
흔히 볼 수 있는 것은 다음과 같다.
$dataReader=$command->query(); // SQL
$rows=$command->queryAll(); //
$row=$command->queryRow(); //
$column=$command->queryColumn(); //
$value=$command->queryScalar(); //
query () 방법이 실행되면 CDbDataReader 실례를 되돌려줍니다. 이 실례를 통해 데이터의 결과 줄을 훑어볼 수 있습니다.
간편하게 보기 위해서 (Yii) 는 조회 결과를 직접 되돌려 주는 일련의
queryXXX()
방법을 실현했다.(2) 당신이 실행한 SQL 문장은 결과 집합이 아니라 상태 값만 되돌려줍니다. 예를 들어 INSERT, UPDATE, DELETE.excute()
예컨대
$this->command->execute();
***** 결과 세트 운영 클래스 CDbDataReader의 사용 방법은 다음 코드 참조
/**
*
*
*/
public function getUsernames ()
{
$sqlStatement = ' SELECT `username` FROM `testdrive`.`tbl_user` ';
$this->command = $this->connection->createCommand($sqlStatement);
$dataReader = $this->command->query();
// read() false
while (($row = $dataReader->read()) !== false) {
var_dump($row);
}
foreach ($dataReader as $row) {
var_dump($row);
}
}
CDbDataReader는 또 다른 방법을 제공합니다.예를 들어 줄 수를 얻고 모든 데이터를 하나의 수조로 저장하는 등 구체적인 참고 가능한 코드가 있다.
***** 테이블 접두어
버전 1.1.0부터 Yii는 테이블 접두사 사용에 대한 통합된 지원을 제공합니다.테이블 접두사는 현재 연결된 데이터베이스에 있는 데이터 테이블의 이름 앞에 추가된 문자열을 가리킨다.이것은 자주 공유하는 서버 환경에 사용된다. 이런 환경에서 여러 응용 프로그램이 같은 데이터베이스를 공유할 수 있고 서로 다른 테이블 접두사를 사용하여 서로 구분해야 한다.예를 들어 한 응용 프로그램은
tbl_
를 표 접두사로 사용할 수 있고 다른 응용 프로그램은 yii_
를 사용할 수 있다.테이블 접두사를 사용하려면 CDbConnection:::tablePrefix 속성을 원하는 테이블 접두사로 설정합니다.그리고 SQL 문장에서
{{TableName}}
를 사용하여 표의 이름을 나타낸다. 그 중에서 TableName
는 접두사가 없는 표의 이름을 가리킨다.예를 들어 데이터베이스에 tbl_user
라는 테이블이 있고 tbl_
테이블 접두사로 구성된 경우 다음과 같은 코드를 사용하여 사용자에 대한 조회를 수행할 수 있습니다.$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();
*****바인딩 매개변수
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 설명서를 참조하십시오.
*****바인딩 열
조회 결과를 얻을 때, 당신은 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
}
자세한 사용 방법은 공식적인 "Query Builder"를 참고하여 다음 절에서 번역할 것입니다.
3. 데이터베이스 트랜잭션 CDbTransaction.php
한 응용 프로그램이 몇 개의 조회를 실행하려면, 모든 조회가 데이터베이스에서 정보를 읽고/또는 데이터베이스에 써야 할 때, 데이터베이스에 몇 개의 조회가 남지 않고 다른 몇 개의 조회만 실행하는 것을 확보하는 것은 매우 중요하다.트랜잭션은 Yii에서 CDbTransaction 인스턴스로 나타나며 다음 상황에서 시작될 수 있습니다.
사무를 시작하다.
하나하나 조회를 집행하다.데이터베이스에 대한 업데이트는 외부에 보이지 않습니다.
사무를 맡기다.트랜잭션이 성공하면 업데이트가 표시됩니다.
검색에 실패하면 모든 업무가 굴러갑니다.
위 워크플로우는 다음과 같은 코드로 수행할 수 있습니다.
$transaction=$connection->beginTransaction();
try
{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//.... other SQL executions
$transaction->commit();
}
catch(Exception $e) // ,
{
$transaction->rollBack();
}
4. 데이터베이스 작업 예외 클래스 CDbException
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.