خودآموز گام به گام PHP Data Object (PDO)

ارسال شده توسط administrator
17. جانفييه 2012 22:18

 

PHP Data Object یک کتابخانه Database Connection Abstraction برای PHP 5 است.

PDO چیست؟

·         Extension ی برای PHP 5 که با زیان C/C++ نوشته شده است.

·         Lightweigh Connection Abstraction Library  

جرا PDO؟

·         پایگاه های داده پشتیبانی شده توسط PHP را پشتیبانی می کند.

·         لازم نیست برای هر پایگاه داده کدی جدا بنویسید. یکبار بنوبسید همه جا استفاده کنید.

·         سرعت بالاتری دارد. PHP با زبان های کامپایل شده نوشته شده، برخلاف کتابخانه های PHP (مانند ADOdb) که با زیان های تفسیری نوشته شده است.

 

چه موقع از PDO استفاده کنیم؟

·         هنگامی که به برنامه ای پرتابل نیاز دارید که از بیشتر پایگاه های داده پشتیبانی می کند.

·         سرعت بالاتر می خواهید.

PDO یک Extension برای PHP 5 است که یک کتابخانه DBMS connection abstraction (data access abstraction library هم گفته می شود) را تعریف می کند. ADOdb برای PHP 4 نوشته شده است. PDO توابعی مانند ADOdb دارد با قابلیت های بسیار.

کتابخانه data access abstraction چیست؟ همانطور که می دانید، PHP از بیشتر پایگاه های داده اصلی مانند MySQL، MSSQL و غیره پشتیبانی می کند. کد اتصال به هرکدام از این پایگاه های داده مخصوص و متفاوت است. مثلا برای اتصال به پایگاه داده MySQL از کد زیر استفاده می کنیم:

1

mysql_connect($host, $user, $password);

اگر بخواهیم به SQLite متصل شویم:

1

sqlite_open($db, 066);

برای Postgresql:

1

pg_connect("host=$host dbname=$db user=$user password=$password");

ما برنامه ای مثلا بر اساس mysql نوشته ایم. هنگامی که لازم می شود مشتری به پایگاه داده SQLite مهاجرت کند، تمام برنامه را باید rebuild کنیم. اگر کدمان یک میلیون خطی باشد چه؟

لایه Data access Abstraction این تفاوت ها را حل می کند. ما فقط یکبار کدمان را می نویسیم و همه جا استفاده می کنیم (مانند جاوا).

 فعالسازی PHP Data Objects Extension

ابتدا این Extension را فعال می کنیم. مراحل فعال سازی و یا برسی وجود این Extension  به این شکل است:

برای استفاده از PDO، برسی کنید که ایا PDO extension وجود دارد یا نه؟ پوشه extension مربوط به PHP تان را باز کنید. برای مثال دایرکتوری app/php5/ext است.

clip_image001

سپس، فایل php.ini را باز کنید. معمولا در پوشه c:\windows است. خط های زیر را از حالت کامنت خارج کنید (; اول خط را بردارید):

extension = php_pdo.dll

extension=php_pdo_mysql.dll

اگر وجود ندارند انها را بسازید.

clip_image002

سرور آپاچی را ری استارت کنید. از داخل سرویس ها می توانید این کار را انجام دهید. اگر از ویندوز XP استفاده می کنید، از طریق زیر می توانید به ان دسترسی داشته باشید:

start > control panel > Performance and Maintenance > Administrative Tools > Services

apache را پیدا و انرا restart کنید.

clip_image003

اتصال با استفاده از PHP Data Objects

حالا به یک پایگاه داده متصل می شویم. از سرور mysql استفاده می کنیم. اول، یک پایگاه داده به نام test بسازید و جدولی به نام books:

1

CREATE TABLE `books` (

2

  `id` int(11) NOT NULL auto_increment,

 

3

  `title` varchar(150) NOT NULL,

4

  `author` varchar(150) NOT NULL,

 

5

  `description` varchar(255) NOT NULL,

6

  `on_sale` tinyint(1) NOT NULL,

 

7

  PRIMARY KEY  (`id`)

8

);

داده های نمونه را وارد کنید:

1

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (1, 'PHP AJAX', 'Andreas', 'This is good book for learning AJAX', 1);

2

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (2, 'PHP Eclipse ', 'George', 'Nice book', 0);

 

3

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (3, 'PHP Prado', 'Junyian', '-', 1);

4

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (4, 'PHP Zend Framework', 'Ozulian', 'great', 0);

 

5

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (5, 'PHP Web Services', 'Bobi', '', 0);

6

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (6, 'PHP API', 'Hugo', '', 1);

 

7

INSERT INTO `books` (`id`, `title`, `author`, `description`, `on_sale`) VALUES (7, 'PHP SEO', 'Monteo', '', 1);

 

حالا با کد زیر به این پایگاه داده متصل می شویم:

01

<?php

02

$host   = "localhost";

 

03

$db = "test";

04

$user   = "root";

 

05

$pass   = "admin";

06

 

 

07

$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass);

08

 

 

09

$sql = "SELECT * FROM books";

10

$q   = $conn->query($sql) or die("failed!");

 

11

while($r = $q->fetch(PDO::FETCH_ASSOC)){

12

  echo $r['title'];

 

13

}

14

 

 

15

 

16

?>

اتصال پرتابل به پایگاه داده

برای اتصال به پایگاه داده یک خط کد می نویسیم. هنگام عوض کردن پایگاه داده، فقط یک خط کد را بازنویسی می کنیم. در زیر کد PDO برای اتصال به چند پایگاه داده امده است:

1

// for MySQL

2

$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);

 

3

 

4

// for SQLite

 

5

$conn = new PDO("sqlite:$db");

6

 

 

7

// for postgreSQL

8

$conn = new PDO("pgsql:host=$host dbname=$db", $user, $pass);

 

به کد زیر نگاه کنید:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

$dbpath     = "c:/test.db";

 

09

 

10

// switching

 

11

switch($dbtype){

12

  case "mysql":

 

13

    $dbconn = "mysql:host=$dbhost;dbname=$dbname";

14

    break;

 

15

   

16

  case "sqlite":

 

17

    $dbconn = "sqlite:$dbpath";

18

    break;

 

19

   

20

  case "postgresql":

 

21

    $dbconn = "pgsql:host=$host dbname=$db";

22

    break;

 

23

}

24

 

 

25

// database connection

26

$conn = new PDO($dbconn,$user,$pass);

 

27

 

28

?>

این روش راحت تر و پرتابل تر است. برای تغییر پایگاه داده فقط یک خط (خط 3) را تغییر می دهیم.

حالات Fetch

در این قسمت، حالات مختلف آوردن داده را می بینیم. در MySQL، می دانیم توابع زیر وجود دارد:

mysql_fetch_row()

 mysql_fetch_array()

 mysql_fetch_assoc()

در PDO چطور؟

کد زیر به صورت عمومی بدون تعیین حالت اوردن داده کار می کند:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// query

 

13

$sql = "SELECT title FROM books ORDER BY title";

14

$q   = $conn->query($sql);

 

15

 

16

// fetch

 

17

while($r = $q->fetch()){

18

  print_r($r);

 

19

}

20

 

 

21

// result

22

//Array ( [title] => PHP AJAX [0] => PHP AJAX )

 

23

//Array ( [title] => PHP API [0] => PHP API )

24

//Array ( [title] => PHP Eclipse [0] => PHP Eclipse )

 

25

//Array ( [title] => PHP Prado [0] => PHP Prado )

26

//Array ( [title] => PHP SEO [0] => PHP SEO )

 

27

//Array ( [title] => PHP Web Services [0] => PHP Web Services )

28

//Array ( [title] => PHP Zend Framework [0] => PHP Zend Framework )

 

29

?>

Fetch Association

01

// query

02

$sql = "SELECT title FROM books ORDER BY title";

 

03

$q   = $conn->query($sql);

04

$q->setFetchMode(PDO::FETCH_ASSOC);

 

05

 

06

// fetch

 

07

while($r = $q->fetch()){

08

  print_r($r);

 

09

}

10

 

 

11

// result

12

//Array ( [title] => PHP AJAX)

 

13

//Array ( [title] => PHP API)

14

//Array ( [title] => PHP Eclipse)

 

15

//Array ( [title] => PHP Prado)

16

//Array ( [title] => PHP SEO)

 

17

//Array ( [title] => PHP Web Services)

18

//Array ( [title] => PHP Zend Framework)

Fetch Num  (مانند mysql_fetch_row() در MySQL)

01

$q->setFetchMode(PDO::FETCH_NUM);

02

 

 

03

// fetch

04

while($r = $q->fetch()){

 

05

  print_r($r);

06

}

 

07

 

08

// result

 

09

//Array ( [0] => PHP AJAX )

10

//Array ( [0] => PHP API )

 

11

//Array ( [0] => PHP Eclipse )

12

//Array ( [0] => PHP Prado )

 

13

//Array ( [0] => PHP SEO )

14

//Array ( [0] => PHP Web Services )

 

15

//Array ( [0] => PHP Zend Framework )

Fetch Both  (پیش فرض)

01

$q->setFetchMode(PDO::FETCH_BOTH);

02

$q   = $conn->query($sql);

 

03

 

04

// fetch

 

05

while($r = $q->fetch()){

06

  print_r($r);

 

07

}

08

 

 

09

// result

10

//Array ( [title] => PHP AJAX [0] => PHP AJAX )

 

11

//Array ( [title] => PHP API [0] => PHP API )

12

//Array ( [title] => PHP Eclipse [0] => PHP Eclipse )

 

13

//Array ( [title] => PHP Prado [0] => PHP Prado )

14

//Array ( [title] => PHP SEO [0] => PHP SEO )

 

15

//Array ( [title] => PHP Web Services [0] => PHP Web Services )

16

//Array ( [title] => PHP Zend Framework [0] => PHP Zend Framework )

 

17

?>

پردازش خطا(Error Handling)

هنگام باز کردن اتصال به پایگاه داده، انتخاب پایگاه داده و اجرای پرس و جوها باید خطا ها را چک کنیم.

در PDO اینگونه خطا ها را پردازش می کنیم:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

try{

10

  // database connection

 

11

  $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

12

}

 

13

catch(PDOException $pe)

14

{

 

15

  die('Connection error, because: ' .$pe->getMessage());

16

}

 

17

 

18

 

 

19

// query

20

$sql = "SELECT title FROM books ORDER BY title";

 

21

$q   = $conn->query($sql);

22

 

 

23

if(!$q)

24

{

 

25

  die("Execute query error, because: ". $conn->errorInfo());

26

}

 

27

 

28

$q->setFetchMode(PDO::FETCH_BOTH);

 

29

 

30

// fetch

 

31

while($r = $q->fetch()){

32

  print_r($r);

 

33

}

34

 

 

35

 

36

?>

دستورهای آماده(Prepared Statements)

اگر با ویژوال استودیو کار کرده باشید، احتمالا از دستورات اماده استفاده کرده اید. PHP Extension برای MySQL و SQLite این قابلیت را ندارد. از مثال زیر مفهوم دستورات آماده را خواهید فهمید:

 

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

$title = 'PHP AJAX';

 

13

 

14

// query

 

15

$sql = "SELECT * FROM books WHERE title = ?";

16

$q = $conn->prepare($sql);

 

17

$q->execute(array($title));

18

 

 

19

 

20

$q->setFetchMode(PDO::FETCH_BOTH);

 

21

 

22

// fetch

 

23

while($r = $q->fetch()){

24

  print_r($r);

 

25

}

26

 

 

27

 

28

?>

در این مثال، پرس و جو به یک متغیر (که با علامت ? مشخص کرده ایم) بستگی دارد.

1

$sql = "SELECT * FROM books WHERE title = ?";

حالا، این پرس و جو را دستکاری می کنیم تا یک دستور آماده ساخته و اجرا کنیم:

1

$q = $conn->prepare($sql);

2

$q->execute(array($title))

مثالی دیگر:

1

$title = 'PHP%';

2

$author = 'Bobi%';

 

3

// query

4

$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";

 

5

$q = $conn->prepare($sql);

6

$q->execute(array($title,$author));

Placeholder های اسمی  و موقعیتی (Positional and Named Placeholder)

Placeholder های موقعیتی

این پرس و جو را ببینید:

1

$title = 'PHP%';

2

$author = 'Bobi%';

 

3

// query

4

$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";

 

5

$q = $conn->prepare($sql);

6

$q->execute(array($title,$author));

پرس و جوی بالا برای مشخص کردن محل مقادیر دستور آماده را با علامت ? مشخص کرده است. این علامت سوال ها placeholder موقعیتی نامیده می شوند. هنگام ارسال پارامتر ها به تابع execut() باید مواظب ترتیب انها در آرایه ارسالی باشیم.

Placeholder های اسمی

این مثال را ببینید:

1

$title = 'PHP%';

2

$author = 'Bobi%';

 

3

// query

4

$sql = "SELECT * FROM books WHERE title like :title AND author like :author ";

 

5

$q = $conn->prepare($sql);

6

$q->execute(array(':author'=>$author,

 

7

                  ':title'=>$title));

در اینجا به جای علامت سوال از دونقطه بعلاوه یک اسم استفاده کرده ایم. در اینجا موقعیت پارامتر های ارسالی مهم نیست. برای همین به ان Placeholder اسمی می گویند.

دستور Insert و Delete با استفاده از دستورهای اماده (Prepared statements)

در اینجا برای افزودن و حذف داده از دستورات اماده استفاده می کنیم.

مثال:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// new data

 

13

$title = 'PHP Security';

14

$author = 'Jack Hijack';

 

15

 

16

// query

 

17

$sql = "INSERT INTO books (title,author) VALUES (:title,:author)";

18

$q = $conn->prepare($sql);

 

19

$q->execute(array(':author'=>$author,

20

                  ':title'=>$title));

 

21

 

22

 

 

23

?>

مثال برای آپدیت کردن داده:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// new data

 

13

$title = 'PHP Pattern';

14

$author = 'Imanda';

 

15

$id = 3;

16

// query

 

17

$sql = "UPDATE books

18

        SET title=?, author=?

 

19

        WHERE id=?";

20

$q = $conn->prepare($sql);

 

21

$q->execute(array($title,$author,$id));

22

 

 

23

 

24

?>

 

دستورهای آماده و مقادیر Bound (بسته شده)

 هر جا که بتوانید یک مقدار یا متغیر را به یک placeholder اسمی یا موقعیتی Bind کنید، PDO از دستورات bound هم پشتیبانی می کند. مثال زیر را ببینید:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// new data

 

13

 

14

// query

 

15

$sql = "SELECT * FROM books";

16

$q = $conn->prepare($sql);

 

17

$q->execute();

18

 

 

19

$q->bindColumn(1, $id);

20

$q->bindColumn(2, $title);

 

21

$q->bindColumn(3, $author);

22

 

 

23

while($q->fetch())

24

{

 

25

echo "$title, $author <br/>";

26

}

 

27

 

28

?>

برای Insert کردن داده:

1

// query

2

$sql = "INSERT INTO books (title,author) values(?,?)";

 

3

 

4

$q = $conn->prepare($sql);

 

5

$q->bindColumn(1, $title);

6

$q->bindColumn(2, $title);

 

7

 

8

$q->execute();

کار با BLOB ها

می توانیم عکس ها یا دیگر اسناد را در پایگاه داده ذخیره کنیم. برای این منظور، با نوع داده BLOB کار می کنیم.

اول، جدولی به نام books، می سازیم که دارای یک BLOB است.

1

CREATE TABLE `books` (

2

  `id` int(11) NOT NULL auto_increment,

 

3

  `title` varchar(150) NOT NULL,

4

  `author` varchar(150) NOT NULL,

 

5

  `description` varchar(255) NOT NULL,

6

  `on_sale` tinyint(1) NOT NULL,

 

7

  `cover` blob NOT NULL,

8

  PRIMARY KEY  (`id`)

 

9

);

نمونه داده جدول را اضافه می کنیم:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// new data

 

13

$title = "ZEND FRAMEWORK TUTORIAL";

14

$author = "PHP Everyday";

 

15

$cover = fopen('7.png','rb');

16

// query

 

17

$sql = "INSERT INTO books (title,author,cover) values(?,?,?)";

18

 

 

19

$q = $conn->prepare($sql);

20

$q->bindParam(1, $title);

 

21

$q->bindParam(2, $author);

22

$q->bindParam(3, $cover, PDO::PARAM_LOB);

 

23

 

24

$q->execute();

 

25

 

26

?>

حالا داده را بازیابی می کنیم:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// query

 

13

$sql = "SELECT id,title,author,cover FROM books";

14

$q = $conn->prepare($sql);

 

15

$q->execute();

16

 

 

17

$q->bindColumn(1, $id);

18

$q->bindColumn(2, $title);

 

19

$q->bindColumn(3, $author);

20

$q->bindColumn(4, $cover, PDO::PARAM_LOB);

 

21

 

22

while($q->fetch())

 

23

{

24

file_put_contents($id.".png",$cover);

 

25

echo "$title, $author, <img src='".$id.".png'> <br/>";

26

}

 

27

 

28

?>

تعیین پارامترهای Connection

در PDO ویژگی وجود دارد که انرا connection attribute می نامیم. این قابلیت پیشرفته را می توان برای تغییر نام ستون ها، تبدیل case (بزرگی کوچکی حرف ها)، و غیره استفاده کرد. مثال زیر را ببینید:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// query

 

13

$conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);

14

$sql = "SELECT * FROM books";

 

15

$q = $conn->prepare($sql);

16

$q->execute();

 

17

 

18

$r = $q->fetch(PDO::FETCH_ASSOC);

 

19

 

20

print_r($r);

 

21

 

22

//result:

 

23

//Array ( [ID] => 1

24

//        [TITLE] => PHP AJAX

 

25

//        [AUTHOR] => Andreas

26

//        [DESCRIPTION] => This is good book for learning AJAX

 

27

//        [ON_SALE] => 1

28

//        [COVER] => )

 

29

?>

حالا خط 13 را ببینید:

1

$conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);

از ویژگی PDO::ATTR_CASE استفاده کرده ایم. این ویژگی case نام ستون هایی که با دستور PDOStatement::fetch() برگردانده می شود را کنترل می کند. این روش فقط زمانی کار می کند که حالت اوردن داده (Fetch mode) برابر PDO::FETCH_ASSOC  یا  PDO::FETCH_BOTH باشد. از کد بالا این  داده ها را دریافت می کنیم:

1

Array ( [ID] => 1

2

        [TITLE] => PHP AJAX

 

3

        [AUTHOR] => Andreas

4

        [DESCRIPTION] => This is good book for learning AJAX

 

5

        [ON_SALE] => 1

6

        [COVER] => )

دیگر مقادیر این ویژگی PDO::CASE_LOWER  و  PDO::CASE_NATURAL است.

 

ویژگی حالت خطا(Error Mode Attributes)

درباره PDO::ERRMODE صحبت خواهیم کرد. این ویژگی حالت گزارش خطا را کنترل می کند. سه مقدار می تواند داشته باشد:

PDO::ERRMODE_SILENT

 PDO::ERRMODE_WARNING

 PDO:ERRMODE_EXCEPTION

 

PDO::ERRMODE_SILENT

هنگامی که خطایی رخ می دهد، کد خطا را می توان با PDO::errorCode() یا PDO::errorInfo()  بدست آورد. این مقدار پیش فرض برای PDO::ERRMODE است.

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);

 

11

 

12

// query

 

13

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);

14

$sql = "SELECT * FROM booksa";

 

15

$q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo()));

16

 

 

17

$r = $q->fetch(PDO::FETCH_ASSOC);

18

 

 

19

print_r($r);

20

 

 

21

//result:

22

//ERROR: 42S02:1146:Table 'test.booksa' doesn't exist

 

23

?>

PDO::ERRMODE_WARNING

هیچ کاری انجام نمی شود ولی خطایی با درجه E_Warning صادر می شود.

01

// query

02

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

 

03

$sql = "SELECT * FROM booksa";

04

$q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo()));

 

05

 

06

$r = $q->fetch(PDO::FETCH_ASSOC);

 

07

 

08

print_r($r);

 

09

 

10

//result:

 

11

//Warning: PDO::query() [function.PDO-query]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.booksa' doesn't exist in

12

//C:\AppServ5\www\test\pdo\test.php on line 15

 

13

//ERROR: 42S02:1146:Table 'test.booksa' doesn't exist

 

PDO::ERRMODE_EXCEPTION

کد های خطا را قرار می دهد (مانند PDO::ERRMODE_SILENT) و یک exception از کلاس PDOException صادر می شود.

01

// query

02

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

03

$sql = "SELECT * FROM booksa";

04

$q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo()));

 

05

 

06

$r = $q->fetch(PDO::FETCH_ASSOC);

 

07

 

08

print_r($r);

 

09

 

10

//result:

 

11

//Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.booksa' doesn't exist' in

12

//C:\AppServ5\www\test\pdo\test.php:15 Stack trace: #0 C:\AppServ5\www\test\pdo\test.php(15): PDO->query('SELECT * FROM b...') #1 {main} thrown in

 

13

//C:\AppServ5\www\test\pdo\test.php on line 15

 

بهبود کارایی با اتصالات مانا (persistent connection)

از اتصال های مانا می توان برای بالابردن کارایی استفاده کرد. هنگامی که یک اتصال مانا درخواست می شود، PHP برسی می کند که ایا اتصالی "همانند"  و باز از قبل وجود دارد یا نه. اگر وجود داشته باشد، از ان استفاده می شود. اتصال باز (مانا) به چه معناست؟ اتصال مانا لینکی است که بعد از اتمام اجرای اسکریپت بسته نمی شوند. اتصال های "همانند"، اتصالهایی هستند که ،با استفاده از یک نام کاربری و پسورد، به یک هاست (Host) باز شده اند.

در  PDO چگونه از اتصال مانا استفاده کنیم؟ PDO دارای ویژگی PDO::ATTR_PERSISTENT است. انرا در سازنده PDO اعمال می کنیم:

 

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true));

 

11

 

12

// query

 

13

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

14

$sql = "SELECT * FROM books";

 

15

$q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo()));

16

 

 

17

$r = $q->fetch(PDO::FETCH_ASSOC);

18

 

 

19

print_r($r);

20

 

 

21

?>

خط 10 را ببینید.

دسترسی به ویژگی های Connection

با استفاده از متد getAttribute() می توانیم به ویژگی های اتصال دسترسی پیدا کنیم. مثال زیر را ببینید:

PDO:ATTR_DRIVER_NAME: نام درایور پایگاه داده را بر می گرداند.

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true));

 

11

 

12

echo $conn->getAttribute(PDO::ATTR_DRIVER_NAME);

 

13

// result: mysql

14

?>

مثال 2:

01

<?php

02

// configuration

 

03

$dbtype     = "sqlite";

04

$dbhost     = "localhost";

 

05

$dbname     = "test";

06

$dbuser     = "root";

 

07

$dbpass     = "admin";

08

 

 

09

// database connection

10

$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass, array(PDO::ATTR_PERSISTENT => true));

 

11

 

12

echo $conn->getAttribute(PDO::ATTR_DRIVER_NAME);

 

13

echo "<br>";

14

echo $conn->getAttribute(PDO::ATTR_CLIENT_VERSION);

 

15

echo "<br>";

16

echo $conn->getAttribute(PDO::ATTR_SERVER_VERSION);

 

17

 

18

?>

 

 

تگ ها:

دسته بندی ها: مقالات PHP