SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
PHP Data Objects
         Wez Furlong
   <wez@messagesystems.com>
About me
 •   PHP Core Developer since 2001

 •   Author of the Streams layer

 •   I hold the title “King” of PECL

 •   Author of most of PDO and its drivers
What is PDO?
 •   PHP Data Objects

 •   A set of PHP extensions that provide a core PDO class and database
     specific drivers

 •   Focus on data access abstraction rather than database abstraction
What can it do?
 •   Prepare/execute, bound parameters

 •   Transactions

 •   LOBS

 •   SQLSTATE standard error codes, flexible error handling

 •   Portability attributes to smooth over database specific nuances
What databases are supported?
 •   MySQL, PostgreSQL

 •   ODBC, DB2, OCI

 •   SQLite

 •   Sybase/FreeTDS/MSSQL
Connecting
 try {

     $dbh = new PDO($dsn, $user,
                    $password, $options);

 } catch (PDOException $e) {

     die(“Failed to connect:” .
         $e->getMessage();

 }
DSNs
 •   mysql:host=name;dbname=dbname

 •   pgsql:host=name dbname=dbname

 •   odbc:odbc_dsn

 •   oci:dbname=dbname;charset=charset

 •   sqlite:/path/to/file
Connection Management
 try {

     $dbh = new PDO($dsn, $user, $pw);
     // use the database here
     // ...
     // done; release
     $dbh = null;

 } catch (PDOException $e) {

     die($e->getMessage();

 }
DSN Aliasing
 •   uri:uri

      •   Specify location of a file that contains the actual DSN on the first
          line

      •   Works with the streams interface, so remote URLs can work too
          (this has performance implications)

 •   name (with no colon)

      •   Maps to pdo.dsn.name in your php.ini

      •   pdo.dsn.name=sqlite:/path/to/name.db
DSN Aliasing
  pdo.dsn.name=sqlite:/path/to/name.db

  $dbh = new PDO(“name”);

  is equivalent to:

  $dbh = new PDO(“sqlite:path/to/name.db”);
Persistent Connections
 // Connection stays alive between requests

 $dbh = new PDO($dsn, $user, $pass,
    array(
      PDO::ATTR_PERSISTENT => true
    )
 );
Persistent Connections
 // Specify your own cache key

 $dbh = new PDO($dsn, $user, $pass,
    array(
      PDO::ATTR_PERSISTENT => “my-key”
    )
 );

 Useful for keeping separate persistent connections
Persistent PDO
  The ODBC driver runs with connection pooling enabled
  by default.

  “better” than PHP-level persistence

    Pool is shared at the process level

  Can be forced off by setting:

    pdo_odbc.connection_pooling=off

  (requires that your web server be restarted)
Error Handling
 •   Maps error codes to ANSI SQLSTATE (5 character text string)

     •   also provides the native db error information

 •   Three error handling strategies

     •   silent (default)

     •   warning

     •   exception
PDO::ERRMODE_SILENT
// The default mode

if (!dbh->query($sql)) {
  echo $dbh->errorCode(), “<br>”;
  $info = $dbh->errorInfo();
  // $info[0] == $dbh->errorCode()
  //             SQLSTATE error code
  // $info[1] is driver specific err code
  // $info[2] is driver specific
  //             error message
}
PDO::ERRMODE_WARNING
$dbh->setAttribute(PDO::ATTR_ERRMODE,
                   PDO::ERRMODE_WARNING);

Behaves the same as silent mode

Raises an E_WARNING as errors are detected

Can suppress with @ operator as usual
PDO::ERRMODE_EXCEPTION
$dbh->setAttribute(PDO::ATTR_ERRMODE,
                    PDO::ERRMODE_EXCEPTION);
try {
  $dbh->exec($sql);
} catch (PDOException $e) {
  // display warning message
  print $e->getMessage();
  $info = $e->errorInfo;
  // $info[0] == $e->code
  //             SQLSTATE error code
  // $info[1] driver specific error code
  // $info[2] driver specific error string
}
Get data
 $dbh = new PDO($dsn);
 $stmt = $dbh->prepare(
                   “SELECT * FROM FOO”);
 $stmt->execute();
 while ($row = $stmt->fetch()) {
   print_r($row);
 }
 $stmt = null;
Forward-only cursors
 •   a.k.a. “unbuffered” queries in mysql parlance

 •   They are the default cursor type

 •   rowCount() doesn’t have meaning

 •   FAST!
Forward-only cursors
 •   Other queries are likely to block

 •   You must fetch all remaining data before launching another query

 •   $stmt->closeCursor();
Buffered Queries
 $dbh = new PDO($dsn);
 $stmt = $dbh->query(“SELECT * FROM FOO”);
 $rows = $stmt->fetchAll();
 $count = count($rows);
 foreach ($rows as $row) {
   print_r($row);
 }
Data typing
 •   Very loose

 •   Prefers strings

 •   Gives you more control over data conversion
Fetch modes

 • $stmt->fetch(PDO::FETCH_BOTH);
  -   Array with numeric and string keys

  -   default option

 • PDO::FETCH_NUM
  -   numeric keys only

 • PDO::FETCH_ASSOC
  -   string keys only
Fetch modes

 • PDO::FETCH_OBJ
  -   stdClass object

  -   $obj->name == ‘name’ column

 • PDO::FETCH_CLASS
  -   You choose the class

 • PDO::FETCH_INTO
  -   You provide the object
Fetch modes
 • PDO::FETCH_COLUMN
  - Fetches a column (example later)
 • PDO::FETCH_BOUND
  - Only fetches into bound variables
 • PDO::FETCH_FUNC
  - Returns the result filtered through a callback
 •   see the manual for more
Iterators
 $dbh = new PDO($dsn);
 $stmt = $dbh->query(
            “SELECT name FROM FOO”,
            PDO::FETCH_COLUMN, 0);
 foreach ($stmt as $name) {
   echo “Name: $namen”;
 }

 $stmt = null;
Changing data
 $deleted = $dbh->exec(
               “DELETE FROM FOO WHERE 1”);

 $changes = $dbh->exec(
   “UPDATE FOO SET active=1 ”
  .“WHERE NAME LIKE ‘%joe%’”);
Autonumber/sequences
 $dbh->exec(
     “insert into foo values (...)”);
 echo $dbh->lastInsertId();



 $dbh->exec(
    “insert into foo values (...)”);
 echo $dbh->lastInsertId(“seqname”);



 Its up to you to call the right one for your db!
Prepared Statements
 // No need to manually quote data here

 $stmt = $dbh->prepare(
    “INSERT INTO CREDITS (extension, name)”
   .“VALUES (:extension, :name)”);

 $stmt->execute(array(
    ‘extension’ => ‘xdebug’,
    ‘name’      => ‘Derick Rethans’
 ));
Prepared Statements
 // No need to manually quote data here

 $stmt = $dbh->prepare(
    “INSERT INTO CREDITS (extension, name)”
   .“VALUES (?, ?)”);

 $stmt->execute(array(
                   ‘xdebug’,
                   ‘Derick Rethans’
 ));
$db->quote()

 • If you really must quote things “by-hand”
 • $db->quote() adds quotes and proper escaping as
   needed
 • But doesn’t do anything in the ODBC driver!
 • Best to use prepared statements
Transactions
 $dbh->beginTransaction();
 try {
   $dbh->query(“UPDATE ...”);
   $dbh->query(“UPDATE ...”);
   $dbh->commit();
 } catch (PDOException $e) {
   $dbh->rollBack();
 }
Stored Procedures
 $stmt = $dbh->prepare(
               “CALL sp_set_string(?)”);
 $stmt->execute(array(‘foo’));



 $stmt = $dbh->prepare(
               “CALL sp_set_string(?)”);

 $stmt->bindValue(1, ‘foo’);
 $stmt->execute();
OUT parameters
 $stmt = $dbh->prepare(
            “CALL sp_get_string(?)”);
 $stmt->bindParam(1, $ret, PDO::PARAM_STR,
                  4000);
 if ($stmt->execute()) {
   echo “Got $retn”;
 }
IN/OUT parameters
 $stmt = $dbh->prepare(
            “call @sp_inout(?)”);
 $val = “My input data”;
 $stmt->bindParam(1, $val,
                  PDO::PARAM_STR|
                  PDO::PARAM_INPUT_OUTPUT,
                  4000);
 if ($stmt->execute()) {
   echo “Got $valn”;
 }
Multi-rowset queries
 $stmt = $dbh->query(
           “call sp_multi_results()”);
 do {
   while ($row = $stmt->fetch()) {
      print_r($row);
   }
 } while ($stmt->nextRowset());
Binding columns
 $stmt = $dbh->prepare(
    “SELECT extension, name from CREDITS”);
 if ($stmt->execute()) {
   $stmt->bindColumn(‘extension’, $ext);
   $stmt->bindColumn(‘name’, $name);
   while ($stmt->fetch(PDO::FETCH_BOUND)) {
     echo “Extension: $extn”;
     echo “Author:    $namen”;
   }
 }
Portability Aids
 •   PDO aims to make it easier to write db independent apps

 •   A number of hacks^Wtweaks for this purpose
Oracle style NULLs
 •   Oracle translates empty strings into NULLs

     •   $dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, true)

 •   Translates empty strings into NULLs when fetching data

 •   But won’t change them on insert
Case folding
 •   The ANSI SQL standard says that column names are returned in upper
     case

 •   High end databases (eg: Oracle and DB2) respect this

 •   Most others don’t

 •   $dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
LOBs

 • Large objects are usually >4kb in size
 • Nice to avoid fetching them until you need them
 • Mature RDBMS offer LOB APIs for this
 • PDO exposes LOBs as Streams
Fetching an image
 $stmt = $dbh->prepare(
    “select contenttype, imagedata”
   .“ from images where id=?”);
 $stmt->execute(array($_GET[‘id’]));
 $stmt->bindColumn(1, $type,
                   PDO::PARAM_STR, 256);
 $stmt->bindColumn(2, $lob,
                   PDO::PARAM_LOB);
 $stmt->fetch(PDO::FETCH_BOUND);
 header(“Content-Type: $type”);
 fpassthru($lob);
Uploading an image
 $stmt = $db->prepare(“insert into images ”
    . “(id, contenttype, imagedata)”
    . “ values (?,?,?)”);
 $id = get_new_id();
 $fp = fopen($_FILES[‘file’][‘tmp_name’],‘rb’);
 $stmt->bindParam(1, $id);
 $stmt->bindParam(2, $_FILES[‘file’][‘type’]);
 $stmt->bindParam(3, $fp, PDO::PARAM_LOB);
 $stmt->execute();
Scrollable Cursors
 •   Allow random access to a rowset

 •   Higher resource usage than forward-only cursors

 •   Can be used for positioned updates (more useful for CLI/GUI apps)
Positioned updates
 •   An open (scrollable) cursor can be used to target a row for another
     query

 •   Name your cursor by setting PDO::ATTR_CURSOR_NAME during
     prepare()

 •   UPDATE foo set bar = ? WHERE CURRENT OF cursor_name
Questions?
 •   Find these slides on my blog and on slideshare.net

 •   My blog: http://netevil.org/

 •   Gold: http://troels.arvin.dk/db/rdbms/#select-limit-offset

Contenu connexe

Tendances (20)

PHP Cookies and Sessions
PHP Cookies and SessionsPHP Cookies and Sessions
PHP Cookies and Sessions
 
Sql server T-sql basics ppt-3
Sql server T-sql basics  ppt-3Sql server T-sql basics  ppt-3
Sql server T-sql basics ppt-3
 
Advanced front-end automation with npm scripts
Advanced front-end automation with npm scriptsAdvanced front-end automation with npm scripts
Advanced front-end automation with npm scripts
 
SQL - RDBMS Concepts
SQL - RDBMS ConceptsSQL - RDBMS Concepts
SQL - RDBMS Concepts
 
Database Connectivity in PHP
Database Connectivity in PHPDatabase Connectivity in PHP
Database Connectivity in PHP
 
PHP - Introduction to PHP Error Handling
PHP -  Introduction to PHP Error HandlingPHP -  Introduction to PHP Error Handling
PHP - Introduction to PHP Error Handling
 
MySql:Introduction
MySql:IntroductionMySql:Introduction
MySql:Introduction
 
Web Technology Lab File
Web Technology Lab FileWeb Technology Lab File
Web Technology Lab File
 
Javascript
JavascriptJavascript
Javascript
 
SQL: Creating and Altering Tables
SQL: Creating and Altering TablesSQL: Creating and Altering Tables
SQL: Creating and Altering Tables
 
MS Sql Server: Introduction To Database Concepts
MS Sql Server: Introduction To Database ConceptsMS Sql Server: Introduction To Database Concepts
MS Sql Server: Introduction To Database Concepts
 
XML
XMLXML
XML
 
系統程式 -- 附錄
系統程式 -- 附錄系統程式 -- 附錄
系統程式 -- 附錄
 
Chapter 1 introduction to sql server
Chapter 1 introduction to sql serverChapter 1 introduction to sql server
Chapter 1 introduction to sql server
 
PyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in PracticePyCon KR 2018 Effective Tips for Django ORM in Practice
PyCon KR 2018 Effective Tips for Django ORM in Practice
 
Introdução a HTML5
Introdução a HTML5Introdução a HTML5
Introdução a HTML5
 
HTML
HTMLHTML
HTML
 
PHP Workshop Notes
PHP Workshop NotesPHP Workshop Notes
PHP Workshop Notes
 
Database Programming
Database ProgrammingDatabase Programming
Database Programming
 
Mysql ppt
Mysql pptMysql ppt
Mysql ppt
 

Similaire à PHP Data Objects

The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in PerlLaurent Dami
 
Introducing PHP Data Objects
Introducing PHP Data ObjectsIntroducing PHP Data Objects
Introducing PHP Data Objectswebhostingguy
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Editionddiers
 
Into to DBI with DBD::Oracle
Into to DBI with DBD::OracleInto to DBI with DBD::Oracle
Into to DBI with DBD::Oraclebyterock
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQLddiers
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)Night Sailer
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 

Similaire à PHP Data Objects (20)

Quebec pdo
Quebec pdoQuebec pdo
Quebec pdo
 
Quebec pdo
Quebec pdoQuebec pdo
Quebec pdo
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
 
Sqlite perl
Sqlite perlSqlite perl
Sqlite perl
 
DBI
DBIDBI
DBI
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
Introducing PHP Data Objects
Introducing PHP Data ObjectsIntroducing PHP Data Objects
Introducing PHP Data Objects
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Edition
 
DataMapper
DataMapperDataMapper
DataMapper
 
Into to DBI with DBD::Oracle
Into to DBI with DBD::OracleInto to DBI with DBD::Oracle
Into to DBI with DBD::Oracle
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Presentation1
Presentation1Presentation1
Presentation1
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Web 10 | PHP with MySQL
Web 10 | PHP with MySQLWeb 10 | PHP with MySQL
Web 10 | PHP with MySQL
 

Dernier

Call Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine ServiceCall Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine Serviceritikaroy0888
 
Progress Report - Oracle Database Analyst Summit
Progress  Report - Oracle Database Analyst SummitProgress  Report - Oracle Database Analyst Summit
Progress Report - Oracle Database Analyst SummitHolger Mueller
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...amitlee9823
 
Regression analysis: Simple Linear Regression Multiple Linear Regression
Regression analysis:  Simple Linear Regression Multiple Linear RegressionRegression analysis:  Simple Linear Regression Multiple Linear Regression
Regression analysis: Simple Linear Regression Multiple Linear RegressionRavindra Nath Shukla
 
Call Girls in Gomti Nagar - 7388211116 - With room Service
Call Girls in Gomti Nagar - 7388211116  - With room ServiceCall Girls in Gomti Nagar - 7388211116  - With room Service
Call Girls in Gomti Nagar - 7388211116 - With room Servicediscovermytutordmt
 
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRL
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRLMONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRL
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRLSeo
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Lviv Startup Club
 
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Dave Litwiller
 
A305_A2_file_Batkhuu progress report.pdf
A305_A2_file_Batkhuu progress report.pdfA305_A2_file_Batkhuu progress report.pdf
A305_A2_file_Batkhuu progress report.pdftbatkhuu1
 
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...Aggregage
 
Unlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfUnlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfOnline Income Engine
 
Value Proposition canvas- Customer needs and pains
Value Proposition canvas- Customer needs and painsValue Proposition canvas- Customer needs and pains
Value Proposition canvas- Customer needs and painsP&CO
 
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...lizamodels9
 
Monthly Social Media Update April 2024 pptx.pptx
Monthly Social Media Update April 2024 pptx.pptxMonthly Social Media Update April 2024 pptx.pptx
Monthly Social Media Update April 2024 pptx.pptxAndy Lambert
 
Monte Carlo simulation : Simulation using MCSM
Monte Carlo simulation : Simulation using MCSMMonte Carlo simulation : Simulation using MCSM
Monte Carlo simulation : Simulation using MCSMRavindra Nath Shukla
 
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...Any kyc Account
 
Understanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key InsightsUnderstanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key Insightsseri bangash
 
The Coffee Bean & Tea Leaf(CBTL), Business strategy case study
The Coffee Bean & Tea Leaf(CBTL), Business strategy case studyThe Coffee Bean & Tea Leaf(CBTL), Business strategy case study
The Coffee Bean & Tea Leaf(CBTL), Business strategy case studyEthan lee
 
HONOR Veterans Event Keynote by Michael Hawkins
HONOR Veterans Event Keynote by Michael HawkinsHONOR Veterans Event Keynote by Michael Hawkins
HONOR Veterans Event Keynote by Michael HawkinsMichael W. Hawkins
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMANIlamathiKannappan
 

Dernier (20)

Call Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine ServiceCall Girls In Panjim North Goa 9971646499 Genuine Service
Call Girls In Panjim North Goa 9971646499 Genuine Service
 
Progress Report - Oracle Database Analyst Summit
Progress  Report - Oracle Database Analyst SummitProgress  Report - Oracle Database Analyst Summit
Progress Report - Oracle Database Analyst Summit
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
 
Regression analysis: Simple Linear Regression Multiple Linear Regression
Regression analysis:  Simple Linear Regression Multiple Linear RegressionRegression analysis:  Simple Linear Regression Multiple Linear Regression
Regression analysis: Simple Linear Regression Multiple Linear Regression
 
Call Girls in Gomti Nagar - 7388211116 - With room Service
Call Girls in Gomti Nagar - 7388211116  - With room ServiceCall Girls in Gomti Nagar - 7388211116  - With room Service
Call Girls in Gomti Nagar - 7388211116 - With room Service
 
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRL
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRLMONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRL
MONA 98765-12871 CALL GIRLS IN LUDHIANA LUDHIANA CALL GIRL
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
 
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
 
A305_A2_file_Batkhuu progress report.pdf
A305_A2_file_Batkhuu progress report.pdfA305_A2_file_Batkhuu progress report.pdf
A305_A2_file_Batkhuu progress report.pdf
 
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
 
Unlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdfUnlocking the Secrets of Affiliate Marketing.pdf
Unlocking the Secrets of Affiliate Marketing.pdf
 
Value Proposition canvas- Customer needs and pains
Value Proposition canvas- Customer needs and painsValue Proposition canvas- Customer needs and pains
Value Proposition canvas- Customer needs and pains
 
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
Call Girls In DLf Gurgaon ➥99902@11544 ( Best price)100% Genuine Escort In 24...
 
Monthly Social Media Update April 2024 pptx.pptx
Monthly Social Media Update April 2024 pptx.pptxMonthly Social Media Update April 2024 pptx.pptx
Monthly Social Media Update April 2024 pptx.pptx
 
Monte Carlo simulation : Simulation using MCSM
Monte Carlo simulation : Simulation using MCSMMonte Carlo simulation : Simulation using MCSM
Monte Carlo simulation : Simulation using MCSM
 
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...
KYC-Verified Accounts: Helping Companies Handle Challenging Regulatory Enviro...
 
Understanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key InsightsUnderstanding the Pakistan Budgeting Process: Basics and Key Insights
Understanding the Pakistan Budgeting Process: Basics and Key Insights
 
The Coffee Bean & Tea Leaf(CBTL), Business strategy case study
The Coffee Bean & Tea Leaf(CBTL), Business strategy case studyThe Coffee Bean & Tea Leaf(CBTL), Business strategy case study
The Coffee Bean & Tea Leaf(CBTL), Business strategy case study
 
HONOR Veterans Event Keynote by Michael Hawkins
HONOR Veterans Event Keynote by Michael HawkinsHONOR Veterans Event Keynote by Michael Hawkins
HONOR Veterans Event Keynote by Michael Hawkins
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMAN
 

PHP Data Objects

  • 1. PHP Data Objects Wez Furlong <wez@messagesystems.com>
  • 2. About me • PHP Core Developer since 2001 • Author of the Streams layer • I hold the title “King” of PECL • Author of most of PDO and its drivers
  • 3. What is PDO? • PHP Data Objects • A set of PHP extensions that provide a core PDO class and database specific drivers • Focus on data access abstraction rather than database abstraction
  • 4. What can it do? • Prepare/execute, bound parameters • Transactions • LOBS • SQLSTATE standard error codes, flexible error handling • Portability attributes to smooth over database specific nuances
  • 5. What databases are supported? • MySQL, PostgreSQL • ODBC, DB2, OCI • SQLite • Sybase/FreeTDS/MSSQL
  • 6. Connecting try { $dbh = new PDO($dsn, $user, $password, $options); } catch (PDOException $e) { die(“Failed to connect:” . $e->getMessage(); }
  • 7. DSNs • mysql:host=name;dbname=dbname • pgsql:host=name dbname=dbname • odbc:odbc_dsn • oci:dbname=dbname;charset=charset • sqlite:/path/to/file
  • 8. Connection Management try { $dbh = new PDO($dsn, $user, $pw); // use the database here // ... // done; release $dbh = null; } catch (PDOException $e) { die($e->getMessage(); }
  • 9. DSN Aliasing • uri:uri • Specify location of a file that contains the actual DSN on the first line • Works with the streams interface, so remote URLs can work too (this has performance implications) • name (with no colon) • Maps to pdo.dsn.name in your php.ini • pdo.dsn.name=sqlite:/path/to/name.db
  • 10. DSN Aliasing pdo.dsn.name=sqlite:/path/to/name.db $dbh = new PDO(“name”); is equivalent to: $dbh = new PDO(“sqlite:path/to/name.db”);
  • 11. Persistent Connections // Connection stays alive between requests $dbh = new PDO($dsn, $user, $pass, array( PDO::ATTR_PERSISTENT => true ) );
  • 12. Persistent Connections // Specify your own cache key $dbh = new PDO($dsn, $user, $pass, array( PDO::ATTR_PERSISTENT => “my-key” ) ); Useful for keeping separate persistent connections
  • 13. Persistent PDO The ODBC driver runs with connection pooling enabled by default. “better” than PHP-level persistence Pool is shared at the process level Can be forced off by setting: pdo_odbc.connection_pooling=off (requires that your web server be restarted)
  • 14. Error Handling • Maps error codes to ANSI SQLSTATE (5 character text string) • also provides the native db error information • Three error handling strategies • silent (default) • warning • exception
  • 15. PDO::ERRMODE_SILENT // The default mode if (!dbh->query($sql)) { echo $dbh->errorCode(), “<br>”; $info = $dbh->errorInfo(); // $info[0] == $dbh->errorCode() // SQLSTATE error code // $info[1] is driver specific err code // $info[2] is driver specific // error message }
  • 16. PDO::ERRMODE_WARNING $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); Behaves the same as silent mode Raises an E_WARNING as errors are detected Can suppress with @ operator as usual
  • 17. PDO::ERRMODE_EXCEPTION $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $dbh->exec($sql); } catch (PDOException $e) { // display warning message print $e->getMessage(); $info = $e->errorInfo; // $info[0] == $e->code // SQLSTATE error code // $info[1] driver specific error code // $info[2] driver specific error string }
  • 18. Get data $dbh = new PDO($dsn); $stmt = $dbh->prepare( “SELECT * FROM FOO”); $stmt->execute(); while ($row = $stmt->fetch()) { print_r($row); } $stmt = null;
  • 19. Forward-only cursors • a.k.a. “unbuffered” queries in mysql parlance • They are the default cursor type • rowCount() doesn’t have meaning • FAST!
  • 20. Forward-only cursors • Other queries are likely to block • You must fetch all remaining data before launching another query • $stmt->closeCursor();
  • 21. Buffered Queries $dbh = new PDO($dsn); $stmt = $dbh->query(“SELECT * FROM FOO”); $rows = $stmt->fetchAll(); $count = count($rows); foreach ($rows as $row) { print_r($row); }
  • 22. Data typing • Very loose • Prefers strings • Gives you more control over data conversion
  • 23. Fetch modes • $stmt->fetch(PDO::FETCH_BOTH); - Array with numeric and string keys - default option • PDO::FETCH_NUM - numeric keys only • PDO::FETCH_ASSOC - string keys only
  • 24. Fetch modes • PDO::FETCH_OBJ - stdClass object - $obj->name == ‘name’ column • PDO::FETCH_CLASS - You choose the class • PDO::FETCH_INTO - You provide the object
  • 25. Fetch modes • PDO::FETCH_COLUMN - Fetches a column (example later) • PDO::FETCH_BOUND - Only fetches into bound variables • PDO::FETCH_FUNC - Returns the result filtered through a callback • see the manual for more
  • 26. Iterators $dbh = new PDO($dsn); $stmt = $dbh->query( “SELECT name FROM FOO”, PDO::FETCH_COLUMN, 0); foreach ($stmt as $name) { echo “Name: $namen”; } $stmt = null;
  • 27. Changing data $deleted = $dbh->exec( “DELETE FROM FOO WHERE 1”); $changes = $dbh->exec( “UPDATE FOO SET active=1 ” .“WHERE NAME LIKE ‘%joe%’”);
  • 28. Autonumber/sequences $dbh->exec( “insert into foo values (...)”); echo $dbh->lastInsertId(); $dbh->exec( “insert into foo values (...)”); echo $dbh->lastInsertId(“seqname”); Its up to you to call the right one for your db!
  • 29. Prepared Statements // No need to manually quote data here $stmt = $dbh->prepare( “INSERT INTO CREDITS (extension, name)” .“VALUES (:extension, :name)”); $stmt->execute(array( ‘extension’ => ‘xdebug’, ‘name’ => ‘Derick Rethans’ ));
  • 30. Prepared Statements // No need to manually quote data here $stmt = $dbh->prepare( “INSERT INTO CREDITS (extension, name)” .“VALUES (?, ?)”); $stmt->execute(array( ‘xdebug’, ‘Derick Rethans’ ));
  • 31. $db->quote() • If you really must quote things “by-hand” • $db->quote() adds quotes and proper escaping as needed • But doesn’t do anything in the ODBC driver! • Best to use prepared statements
  • 32. Transactions $dbh->beginTransaction(); try { $dbh->query(“UPDATE ...”); $dbh->query(“UPDATE ...”); $dbh->commit(); } catch (PDOException $e) { $dbh->rollBack(); }
  • 33. Stored Procedures $stmt = $dbh->prepare( “CALL sp_set_string(?)”); $stmt->execute(array(‘foo’)); $stmt = $dbh->prepare( “CALL sp_set_string(?)”); $stmt->bindValue(1, ‘foo’); $stmt->execute();
  • 34. OUT parameters $stmt = $dbh->prepare( “CALL sp_get_string(?)”); $stmt->bindParam(1, $ret, PDO::PARAM_STR, 4000); if ($stmt->execute()) { echo “Got $retn”; }
  • 35. IN/OUT parameters $stmt = $dbh->prepare( “call @sp_inout(?)”); $val = “My input data”; $stmt->bindParam(1, $val, PDO::PARAM_STR| PDO::PARAM_INPUT_OUTPUT, 4000); if ($stmt->execute()) { echo “Got $valn”; }
  • 36. Multi-rowset queries $stmt = $dbh->query( “call sp_multi_results()”); do { while ($row = $stmt->fetch()) { print_r($row); } } while ($stmt->nextRowset());
  • 37. Binding columns $stmt = $dbh->prepare( “SELECT extension, name from CREDITS”); if ($stmt->execute()) { $stmt->bindColumn(‘extension’, $ext); $stmt->bindColumn(‘name’, $name); while ($stmt->fetch(PDO::FETCH_BOUND)) { echo “Extension: $extn”; echo “Author: $namen”; } }
  • 38. Portability Aids • PDO aims to make it easier to write db independent apps • A number of hacks^Wtweaks for this purpose
  • 39. Oracle style NULLs • Oracle translates empty strings into NULLs • $dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, true) • Translates empty strings into NULLs when fetching data • But won’t change them on insert
  • 40. Case folding • The ANSI SQL standard says that column names are returned in upper case • High end databases (eg: Oracle and DB2) respect this • Most others don’t • $dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
  • 41. LOBs • Large objects are usually >4kb in size • Nice to avoid fetching them until you need them • Mature RDBMS offer LOB APIs for this • PDO exposes LOBs as Streams
  • 42. Fetching an image $stmt = $dbh->prepare( “select contenttype, imagedata” .“ from images where id=?”); $stmt->execute(array($_GET[‘id’])); $stmt->bindColumn(1, $type, PDO::PARAM_STR, 256); $stmt->bindColumn(2, $lob, PDO::PARAM_LOB); $stmt->fetch(PDO::FETCH_BOUND); header(“Content-Type: $type”); fpassthru($lob);
  • 43. Uploading an image $stmt = $db->prepare(“insert into images ” . “(id, contenttype, imagedata)” . “ values (?,?,?)”); $id = get_new_id(); $fp = fopen($_FILES[‘file’][‘tmp_name’],‘rb’); $stmt->bindParam(1, $id); $stmt->bindParam(2, $_FILES[‘file’][‘type’]); $stmt->bindParam(3, $fp, PDO::PARAM_LOB); $stmt->execute();
  • 44. Scrollable Cursors • Allow random access to a rowset • Higher resource usage than forward-only cursors • Can be used for positioned updates (more useful for CLI/GUI apps)
  • 45. Positioned updates • An open (scrollable) cursor can be used to target a row for another query • Name your cursor by setting PDO::ATTR_CURSOR_NAME during prepare() • UPDATE foo set bar = ? WHERE CURRENT OF cursor_name
  • 46. Questions? • Find these slides on my blog and on slideshare.net • My blog: http://netevil.org/ • Gold: http://troels.arvin.dk/db/rdbms/#select-limit-offset