Latest web development tutorials

펄 데이터베이스 연결

우리는 당신을 소개합니다이 장에서는 펄 데이터베이스를 연결합니다.

펄 (5), 우리는 데이터베이스에 연결 DBI 모듈을 사용할 수있다.

DBI 영어 이름 : 데이터베이스 독립적 인 인터페이스, 중국어 데이터베이스 독립적 인 인터페이스를했다.

DBI 및 방법, 변수 및 상수들의 세트를 정의하고, 특정 데이터베이스 플랫폼 독립적 인 데이터베이스 지속성 층을 제공 Perl 언어 데이터베이스 인터페이스 통신 표준있다.


DBI 구조

DBI 및 특정 데이터베이스 플랫폼 독립적 인, 우리는 오라클, MySQL의 또는 인포믹스 및 기타 데이터베이스에 적용 할 수 있습니다.

모든 차트 DBI의 API (응용 프로그래밍 인터페이스 : 애플리케이션 프로그래밍 인터페이스)를 얻기 구현에 대응하는 드라이버 SQL 데이터에서 보낸 후 분산을하고, 마지막으로 데이터를 다시 얻는다.

변수 이름 규칙

변수 이름의 일반적인 이름의 다음 세트 :

$dsn    驱动程序对象的句柄
$dbh    一个数据库对象的句柄
$sth    一个语句或者一个查询对象的句柄
$h      通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文
$rc     操作代码返回的布什值(true 或 false)
$rv     操作代码返回的整数值
@ary    查询返回的一行值的数组(列表)
$rows   操作代码返回的行数值
$fh     文件句柄
undef   NULL 值表示未定义
\%attr  引用属性的哈希值并传到方法上

데이터베이스 연결

다음으로, 우리는 어떻게 데이터베이스 작업의 예를 들어 MySQL 데이터베이스와 펄을 보여줍니다.

여기에서 우리는 다음과 같습니다 MySQL의 데이터베이스 w3big 데이터 테이블 웹 사이트, 테이블 구조와 데이터의 데이터베이스를 만들 :

: 데이터 시트 다운로드 http://static.w3big.com/download/websites_perl.sql을

다음으로, 우리는 데이터베이스에 연결하려면 다음 코드를 사용합니다 :

#!/usr/bin/perl -w

use strict;
use DBI;

my $host = "localhost";         # 主机地址
my $driver = "mysql";           # 接口类型 默认为 localhost
my $database = "w3big";        # 数据库
# 驱动程序对象的句柄
my $dsn = "DBI:$driver:database=$database:$host";  
my $userid = "root";            # 数据库用户名
my $password = "123456";        # 数据库密码

# 连接数据库
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM Websites");   # 预处理 SQL  语句
$sth->execute();    # 执行 SQL 操作

# 注释这部分使用的是绑定值操作
# $alexa = 20;
# my $sth = $dbh->prepare("SELECT name, url
#                        FROM Websites
#                        WHERE alexa > ?");
# $sth->execute( $alexa ) or die $DBI::errstr;

# 循环输出所有数据
while ( my @row = $sth->fetchrow_array() )
{
       print join('\t', @row)."\n";
}

$sth->finish();
$dbh->disconnect();

삽입

단계 :

  • API는 SQL 문을 준비 ()을 준비합니다.
  • SQL 문을 실행하는 실행 () API를 사용합니다.
  • 명령문 핸들을 해제 마무리 () API를 사용합니다.
  • 모두가 잘 어울리는 경우 마지막으로,이 작업을 통해 제출됩니다.
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, conutry )
                        values
                       ('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

응용 프로그램은 또한 삽입 쿼리를 실행 변수 자리를 대체하여 다음 예제, 입력 및 출력 매개 변수를 바인딩 할 수 있습니다?

my $name = "Twitter";
my $url = "https://twitter.com/";
my $alexa = 10;
my $conutry = "USA";
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, conutry )
                        values
                       (?,?,?,?)");
$sth->execute($name,$url,$alexa, $conutry) 
          or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

업데이트 작업

단계 :

  • API는 SQL 문을 준비 ()을 준비합니다.
  • SQL 문을 실행하는 실행 () API를 사용합니다.
  • 명령문 핸들을 해제 마무리 () API를 사용합니다.
  • 모두가 잘 어울리는 경우 마지막으로,이 작업을 통해 제출됩니다.
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

응용 프로그램은 또한 업데이트 쿼리를 수행 할 변수 자리를 대체하여 다음 예제, 입력 및 출력 매개 변수를 바인딩 할 수 있습니다?

$name = '本教程';

my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

물론, 우리는 또한 값이 나라가 1000 CN의 알렉사를 수정해야합니다 위해 다음과 같이 설정할 수 바인딩 할 수 있습니다 :

$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = ?
                        WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

데이터를 삭제

단계 :

  • API는 SQL 문을 준비 ()을 준비합니다.
  • SQL 문을 실행하는 실행 () API를 사용합니다.
  • 명령문 핸들을 해제 마무리 () API를 사용합니다.
  • 모두가 잘 어울리는 경우 마지막으로,이 작업을 통해 제출됩니다.

다음 데이터 알렉사 데이터 것 웹 사이트는 1000보다 큰 삭제됩니다 수 있습니다 :

$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites
                        WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

사용 문을

문은 UPDATE, INSERT를 수행하거나 작업을 삭제할 수 있습니다않습니다, 그는 다음과 같은 예는, 성공적으로 실행이 true를 반환, 아주 짧은 false를 반환 실패

$dbh->do('DELETE FROM Websites WHERE alexa>1000');

작업을 COMMIT

데이터베이스 작업을 완료하기 위해 트랜잭션을 커밋하는 커밋

$dbh->commit or die $dbh->errstr;

ROLLBACK 작업

오류가 SQL의 실행 중에 발생하면 변경없이 데이터를 롤백 할 수 있습니다 :

$dbh->rollback or die $dbh->errstr;

사무

다른 언어, 데이터베이스의 펄 DBI 동작은이를 달성하는 방법은 두 가지가 있으며, 트랜잭션 처리를 지원

하나는,베이스에 연결에서 트랜잭션을 시작할 때

$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;

자동 커밋 설정 연결시 위의 코드는이 데이터베이스 작업을 업데이트 할 때, 자동으로 데이터베이스에 직접 기록들을 업데이트하지 않습니다이며, 거짓이지만, $ dbh-에 의해 프로그램에>에 투입 데이터가 실제로 데이터베이스에 기록하도록, 또는 $ dbh-> 롤백 작업을 롤백합니다.

2, $ dbh-> begin_work에 의해 () 문은 트랜잭션을 시작합니다

이러한 방식으로, 데이터베이스 연결 시간에 자동 커밋 = 0을 설정할 필요는 없다.

당신은 할 모든 트랜잭션이 데이터베이스에 연결하기 시작, 데이터베이스 트랜잭션 작업을 여러 번에 연결할 수 있습니다.

$rc  = $dbh->begin_work  or die $dbh->errstr;

#####################
##这里执行一些 SQL 操作
#####################

$dbh->commit;    # 成功后操作
-----------------------------
$dbh->rollback;  # 失败后回滚

데이터베이스 연결을 분리

우리가 데이터베이스에서 분리해야하는 경우, 당신은 차단 API를 사용할 수 있습니다 :

$rc = $dbh->disconnect  or warn $dbh->errstr;