PDOを使用してデータベースを操作する必要がある理由



データベースアクセスにPHPのPDOを使用する必要がある理由の記事の翻訳



多くのPHP開発者は、mysqlおよびmysqli拡張を使用してデータベースを操作することに慣れています。 しかし、PHPのバージョン5.1以降、より便利な方法があります-PHPデータオブジェクト 。 PDOと略されるこのクラスは、生産性を大幅に向上させるオブジェクトと準備されたステートメントを操作するためのメソッドを提供します!



PDOの概要



「PDO-PHP Data Objectsは、複数のデータベースを操作する普遍的な方法を提供するレイヤーです。」


彼女は、開発者にさまざまなDBMSの構文機能を提供しますが、プラットフォーム間の切り替えプロセスの痛みを軽減します。 多くの場合、これにはデータベースへの接続文字列の変更のみが必要です。



この記事は、mysqlとmysqliを使用して、より強力で柔軟なPDOへの切り替えを支援する人々を対象としています。



DBMSサポート



この拡張機能は、PDOドライバーが存在するデータベース管理システムをサポートできます。 このドキュメントの執筆時点では、次のドライバーを使用できます。 ただし、それらのすべてがサーバー上にあるわけではありません。 次のような利用可能なドライバのリストを見ることができます:

print_r(PDO::getAvailableDrivers());
      
      









. . , , SQLite.

try {  
  # MS SQL Server  Sybase  PDO_DBLIB  
  $DBH = new PDO("mssql:host=$host;dbname=$dbname", $user, $pass);  
  $DBH = new PDO("sybase:host=$host;dbname=$dbname", $user, $pass);  
  
  # MySQL  PDO_MYSQL  
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);  
  
  # SQLite  
  $DBH = new PDO("sqlite:my/database/path/database.db");  
}  
catch(PDOException $e) {  
    echo $e->getMessage();  
}
      
      





, try/catch – PDO- ( ).



$DBH «database handle» .



null.

#    
$DBH = null;
      
      





php.net.



PDO



PDO , try/catch. , PDO :

$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );  
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );  
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
      
      





, .



PDO::ERRMODE_SILENT



. , , mysql mysqli. DRY .



PDO::ERRMODE_WARNING



Warning . .



PDO::ERRMODE_EXCEPTION



. , . , , :

#      
try {  
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);  
  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
  
  # !  DELECT  SELECT!  
  $DBH->prepare('DELECT name FROM people')->execute();  
}  
catch(PDOException $e) {  
    echo ",   .";  
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);  
}
      
      





SQL- , . - , - .



Insert Update



. PDO . ( UPDATE, INSERT)



:

# STH  "Statement Handle"  
$STH = $DBH->prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )");  
$STH->execute();
      
      





- exec(), prepared statements. SQL-, .



Prepared Statements



prepared statements SQL-.


Prepared statement — SQL-, . SQL- , placeholder’.



prepared statements.

#  placeholders -  SQL- !  
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");  
  
#  placeholders  
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (?, ?, ?)"); 
 
#  placeholders 
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");
      
      





, . placeholder’ , prepared statements.



placeholder’



#    placeholder,    1  3  
$STH->bindParam(1, $name);  
$STH->bindParam(2, $addr);  
$STH->bindParam(3, $city);  
  
#     
$name = "Daniel"  
$addr = "1 Wicked Way";  
$city = "Arlington Heights";  
$STH->execute();  
  
#    ,      
$name = "Steve"  
$addr = "5 Circle Drive";  
$city = "Schaumburg";  
$STH->execute();
      
      





. placeholder’ ( 2-4). . , .



SQL- , . :

#  ,    
$data = array('Cathy', '9 Dark and Twisty Road', 'Cardiff');  
  
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (?, ?, ?)");  
$STH->execute($data);
      
      





$data[0] placeholder’, $data[1] — , .. : , .



placeholder’



#     placeholder’
#     
#     
$STH->bindParam(':name', $name);
      
      





, . , , placeholder’.

# ,     
$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' );  
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");  
$STH->execute($data);
      
      





placeholder’ , . , , :

#      
class person {  
    public $name;  
    public $addr;  
    public $city;  
  
    function __construct($n,$a,$c) {  
        $this->name = $n;  
        $this->addr = $a;  
        $this->city = $c;  
    }  
    #  ...  
}  
  
$cathy = new person('Cathy','9 Dark and Twisty','Cardiff');  
  
#      
$STH = $DBH->prepare("INSERT INTO folks (name, addr, city) values (:name, :addr, :city)");  
$STH->execute((array)$cathy);
      
      





execute() , .







->fetch(). , . : : FETCH_ASSOC, FETCH_CLASS, FETCH_OBJ. , :

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





->fetch().



FETCH_ASSOC



. , mysql/mysqli.

#      placeholder’,
#     query()  
$STH = $DBH->query('SELECT name, addr, city from folks');  
  
#   
$STH->setFetchMode(PDO::FETCH_ASSOC);  
  
while($row = $STH->fetch()) {  
    echo $row['name'] . "\n";  
    echo $row['addr'] . "\n";  
    echo $row['city'] . "\n";  
}
      
      





while() .



FETCH_OBJ



std .

#  
$STH = $DBH->query('SELECT name, addr, city from folks');  
  
#     
$STH->setFetchMode(PDO::FETCH_OBJ);  
  
#  
while($row = $STH->fetch()) {  
    echo $row->name . "\n";  
    echo $row->addr . "\n";  
    echo $row->city . "\n";  
}
      
      







FETCH_CLASS



fetch_class . . , , , ( public).



, .



, .

class secret_person {  
    public $name;  
    public $addr;  
    public $city;  
    public $other_data;  
  
    function __construct($other = '') {  
        $this->addr = preg_replace('/[a-z]/', 'x', $this->addr);  
        $this->other_data = $other;  
    }  
}
      
      





x. :

$STH = $DBH->query('SELECT name, addr, city from folks');  
$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person');  
  
while($obj = $STH->fetch()) {  
    echo $obj->addr;  
}
      
      





’5 Rosebud’, ’5 Rxxxxxx’.



, , . PDO .

$STH->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'secret_person');
      
      





, (PDO::FETCH_PROPS_LATE), , .



, :

$STH->setFetchMode(PDO::FETCH_CLASS, 'secret_person', array('stuff'));
      
      





:

$i = 0;  
while($rowObj =  $STH->fetch(PDO::FETCH_CLASS, 'secret_person', array($i))) {  
    // - 
    $i++;
}
      
      









( ) PDO ( !), .

$DBH->lastInsertId();
      
      





->lastInsertId() id . , ( $DBH), ($STH).

$DBH->exec('DELETE FROM folks WHERE 1');  
$DBH->exec("SET time_zone = '-8:00'");
      
      





->exec() , , .

$safe = $DBH->quote($unsafe);
      
      





->quote() , . , prepared statements.

$rows_affected = $STH->rowCount();
      
      





->rowCount() , . , SELECT- PHP 5.1.6. PHP , :

$sql = "SELECT COUNT(*) FROM folks";  
if ($STH = $DBH->query($sql)) {  
    #     
    if ($STH->fetchColumn() > 0) {  
    	  #    ,    !  
    }  
    else {  
        #    ,      
    }  
}
      
      









, - mysql mysqli.



All Articles