データベースに接続するための PHP 用の PDO、PDO の単純な使用と定義済みのプレースホルダーの使用、および PDOStatement オブジェクトの使用、さまざまな形式のプレースホルダー、bindValue と bindParam の違い 定義済みのプレースホルダー パラメーターのバインディング

データベースに接続するための PHP 用の PDO、PDO の簡単な使用、定義済みのプレースホルダーの使用、および PDOStatement オブジェクトの使用

PDO

PHP Data Objects (PDO) 拡張機能は、PHP がデータベースにアクセスするための軽量で一貫したインターフェイスを定義しますPDO インターフェイスを実装する各データベース ドライバーは、特定のデータベース固有の機能を標準の拡張関数として公開できます。PDO 拡張機能を単独で使用してデータベース機能を実行することはできないことに注意してください。データベース サーバーにアクセスするには、データベース固有の PDO ドライバーを使用する必要があります。

PDO はデータ アクセス抽象化レイヤーを提供します。つまり、使用するデータベースに関係なく、同じ関数を使用してデータのクエリと取得を行うことができますPDO はデータベースの抽象化を提供せず、SQL を書き換えたり、不足している機能をエミュレートしたりしません。必要に応じて、成熟した抽象化レイヤーを使用する必要があります。

データベースのサポート: firebird、informix、mysql、mssql、odbc、pgsql、sqlite。

PDO クラスと PDOStatement クラス

1.PDO クラス

class PDO {
    
    
/* 方法 */
public __construct(
    string $dsn,
    ?string $username = null,
    ?string $password = null,
    ?array $options = null
)
public beginTransaction(): bool
public commit(): bool
public errorCode(): ?string
public errorInfo(): array
public exec(string $statement): int|false
public getAttribute(int $attribute): mixed
public static getAvailableDrivers(): array
public inTransaction(): bool
public lastInsertId(?string $name = null): string|false
public prepare(string $query, array $options = []): PDOStatement|false
public query(string $query, ?int $fetchMode = null): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_COLUMN, int $colno): PDOStatement|false
public query(
    string $query,
    ?int $fetchMode = PDO::FETCH_CLASS,
    string $classname,
    array $constructorArgs
): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_INTO, object $object): PDOStatement|false
public quote(string $string, int $type = PDO::PARAM_STR): string|false
public rollBack(): bool
public setAttribute(int $attribute, mixed $value): bool
}
  1. PDO::beginTransaction — トランザクションを開始する
  2. PDO::commit — トランザクションをコミットする
  3. PDO::__construct — データベース接続を表す PDO インスタンスを作成する
  4. PDO::errorCode — データベースハンドルの最後の操作に関連付けられた SQLSTATE を取得する
  5. PDO::errorInfo — データベースハンドルの最後の操作に関連する拡張エラー情報を取得する
  6. PDO::exec — SQL ステートメントを実行し、影響を受けた行数を返す
  7. PDO::getAttribute — データベース接続の属性を取得する
  8. PDO::getAvailableDrivers — 利用可能なドライバーの配列を返す
  9. PDO::inTransaction — トランザクション内かどうかを調べる
  10. PDO::lastInsertId — 最後に挿入された行の ID またはシーケンス値を返す
  11. PDO::prepare — ステートメントの実行を準備し、ステートメントオブジェクトを返す
  12. PDO::query — プレースホルダーなしで SQL ステートメントを準備して実行する
  13. PDO::quote — SQL クエリの文字列に引用符を追加する
  14. PDO::rollBack — トランザクションをロールバックする
  15. PDO::setAttribute — 属性を設定する

2. PDOStatement クラス

class PDOStatement implements IteratorAggregate {
    
    
/* 属性 */
public string $queryString;
/* 方法 */
public bindColumn(
    string|int $column,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindParam(
    string|int $param,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool
public closeCursor(): bool
public columnCount(): int
public debugDumpParams(): ?bool
public errorCode(): ?string
public errorInfo(): array
public execute(?array $params = null): bool
public fetch(int $mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed
public fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array
public fetchColumn(int $column = 0): mixed
public fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
public getAttribute(int $name): mixed
public getColumnMeta(int $column): array|false
public getIterator(): Iterator
public nextRowset(): bool
public rowCount(): int
public setAttribute(int $attribute, mixed $value): bool
public setFetchMode(int $mode): bool
public setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool
}
  1. PDOStatement::bindColumn — 列を PHP 変数にバインドする
  2. PDOStatement::bindParam — パラメータを指定された変数名にバインドします
  3. PDOStatement::bindValue — 値をパラメーターにバインドする
  4. PDOStatement::closeCursor — ステートメントを再度実行できるようにカーソルを閉じる
  5. PDOStatement::columnCount — 結果セットの列数を返す
  6. PDOStatement::debugDumpParams — SQL で準備されたコマンドを出力する
  7. PDOStatement::errorCode — 最後のステートメントハンドル操作に関連付けられた SQLSTATE を取得する
  8. PDOStatement::errorInfo — 最後のステートメントハンドル操作に関連する拡張エラー情報を取得する
  9. PDOStatement::execute — 準備済みステートメントを実行する
  10. PDOStatement::fetch — 結果セットから次の行をフェッチする
  11. PDOStatement::fetchAll — 結果セットから残りの行を取得する
  12. PDOStatement::fetchColumn — 結果セットの次の行から単一の列を返す
  13. PDOStatement::fetchObject — 次の行を取得してオブジェクトとして返す
  14. PDOStatement::getAttribute — ステートメント属性を取得する
  15. PDOStatement::getColumnMeta — 結果セットの列のメタデータを返す
  16. PDOStatement::getIterator — 結果セットの反復子を取得する
  17. PDOStatement::nextRowset — 複数行セットのステートメント ハンドルで次の行セットに進む
  18. PDOStatement::rowCount — 前の SQL ステートメントの影響を受けた行数を返す
  19. PDOStatement::setAttribute — ステートメント属性を設定する
  20. PDOStatement::setFetchMode — ステートメントのデフォルトのフェッチモードを設定する

PDO の使用

1. pdo の簡単な使い方

pdo を使用してデータベースを操作する手順は、大まかに次の手順に分けられます。

  1. データベースに接続し、PDO インスタンス オブジェクトを取得し new PDO($dsn,$username,$password,[])取得した PDO インスタンス オブジェクトを使用します。$dsnこれは、データベース mysql、oracle のタイプと、操作するデータベースの名前、およびアクセスするホスト名です。$username,$passwordは対応するデータベースのアカウントとパスワードです.[]一部の不要なパラメータについては, データベースのエンコード方法の指定など, いくつかの定義済みの定数...
  2. sql ステートメントを作成し、crud を追加、削除、変更、およびチェックする
  3. $pdo->query($sql)SQL を実行し、PDOStatement オブジェクトで結果セットを返すために使用します。結果セットが見つからない場合は、false を返します。
  4. fetch()(結果セットから次の行を取得する)、(fetchAll() 結果セットから残りの行を取得する)、 fetchColumn()(結果セットの次の行から単一の列を返す)、fetchObject()(次の行を取得し、それをobject)... 結果セットをトラバースします。

たとえば、次の例では、テーブル内のすべてのデータをクエリし、出力されたデータをトラバースします。

<?php
$type = 'mysql';  // 数据库为mysql数据库
$hostname = 'localhost';  // 主机名为本地服务器
$username ='root';  // mysql 的账户
$password = 'root'; // mysql 的密码
$dbname = 'phpdemo';  // 操纵的数据库名


try{
    
    
    $dsn = "$type:dbname=$dbname;host=$hostname";
    // 初始化 pdo对象
    $pdo = new PDO($dsn,$username,$password,[
        // 开启异常模式
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
}catch (PDOException $e){
    
    
    die("数据库连接失败:".$e->getMessage());
}

// 使用pdo->query() 预处理并执行sql语句,以 PDOStatement 对象形式返回结果集,
// 如果数据不存在则返回false
$stmt = $pdo->query('select * from book');

// 以关联数组的方式将结果集返回
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 打印输出sql查询到的数据
echo "<pre>";
var_dump($data);
echo "</pre>";

ここに画像の説明を挿入

2. 事前定義されたプレースホルダー

プリペアド ステートメントに対する PDO のサポートにはPDOStatement クラス オブジェクトの使用が必要ですが、このクラスのオブジェクトはNEW キーワードによってインスタンス化されませんがPDO オブジェクトの prepare() メソッドによって、データベース サーバーで前処理されたステートメントが準備されます。 SQL ステートメント。

PDO オブジェクトの query() メソッドによって返される PDOStatement クラス オブジェクトが以前に実行された場合、それは結果セット オブジェクトを表すだけです。

また、PDO オブジェクトで prepare() メソッドを実行して生成された PDOStatement クラス オブジェクトがクエリ オブジェクトである場合、パラメータ化された SQL コマンドを定義して実行できます。


PDOStatement クラス オブジェクトを使用して SQL を前処理する手順は、次の手順に大別されます。

  1. データベースに接続して PDO インスタンス オブジェクトを取得する$pdo = new PDO($dsn,$username,$password);
  2. 前処理する sql ステートメントを準備します$sql = "select * from book where id = ?" 或者 $sql = "select * from book where id=:id"(事前定義されたプレースホルダーを含む sql ステートメント)。
  3. PDO インスタンス オブジェクトの prepare() メソッドを使用して PDOStatement クラス オブジェクトを取得し、$stmt = $pdo->prepare($sql,)
  4. PDOStatement クラス オブジェクトの bindParam() メソッドを使用して、対応する定義済みプレースホルダーをバインドします。
  5. PDOStatement クラス オブジェクトの execute() メソッドを使用して、正式に sql を実行します。

<?php
$type = 'mysql';  // 数据库为mysql数据库
$hostname = 'localhost';  // 主机名为本地服务器
$username ='root';  // mysql 的账户
$password = 'root'; // mysql 的密码
$dbname = 'phpdemo';  // 操纵的数据库名


try{
    
    
    $dsn = "$type:dbname=$dbname;host=$hostname";
    // 初始化 pdo对象
    $pdo = new PDO($dsn,$username,$password,[
        // 开启异常模式
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
}catch (PDOException $e){
    
    
    die("数据库连接失败:".$e->getMessage());
}


$sql = "insert into book (booKName,bookPrice,author) values(?,?,?)";

// 预处理sql获取pdostatement对象
$stmt = $pdo->prepare($sql);

// 绑定预定义占位符
$bookName = "大话数据结构";
$bookPrice = "40";
$author = "大牛";
$stmt->bindParam(1,$bookName);
$stmt->bindParam(2,$bookPrice);
$stmt->bindParam(3,$author);

// 执行sql
$stmt->execute();

ここに画像の説明を挿入


上記の事前定義されたプレースホルダー バインディング メソッドはbindColumn()、列を PHP 変数にもバインドします。つまり、フィールド列は変数に対応し、値をパラメーターに bindValue()バインドします。

次に、上記のコードを次のように変更できます (bindValue を使用)。

// ....
$sql = "insert into book (booKName,bookPrice,author) values(:bookName,:bookPrice,:author)";

// 预处理sql获取pdostatement对象
$stmt = $pdo->prepare($sql);

// 绑定预定义占位符
$bookName = "大话数据结构";
$bookPrice = "40";
$author = "大牛";
$stmt->bindValue(":bookName",$bookName,PDO::PARAM_STR);
$stmt->bindValue(":bookPrice",$bookPrice,PDO::PARAM_STR);
$stmt->bindValue(":author",$author,PDO::PARAM_STR);

// 执行sql
$stmt->execute();

まとめ

PDO を使用して、さまざまなデータベースを操作できます. PDO は、データベースにアクセスするための軽量の統一インターフェイスを提供し、データ アクセスのための抽象化レイヤーを提供します. どのような種類のデータベースを使用しても、同じコードを使用して操作できます.


1. PDO を使用してデータベースを操作する手順:

  1. 対応するデータベースに接続し、PDO インスタンス オブジェクトを生成し、$pdo = new PDO($dsn,$uname,$upwd)
  2. SQL文を準備する
  3. PDO->query() メソッドを使用して対応する sql を実行し、PDOStatement オブジェクトを返します。$stmt = $pdo->query($sql)
  4. データは、一連の fetch() メソッドを提供する PDOStatement オブジェクトを使用して取得できます...$data = $stmt->fetch()

2. PDO を使用してデータベースを操作します。SQL で事前に定義されたプレースホルダーの手順は大まかに次のとおりです。

  1. データベースに接続する$pdo = new PDO($dsn,$uname,$upwd)
  2. プレースホルダーを使用して SQL ステートメントを準備する
  3. SQLの前処理、$stmt=$pdo->prepare($sql)
  4. バインディングパラメータ、$stmt->bindParam()
  5. Sqlを実行し、$stmt->excute()

3. bindValue と bindParam を使用して定義済みのプレースホルダ パラメータをバインドする場合の違い:

メソッド bindParam() と bindValue() は非常に似ています。唯一の違いは、前者は PHP 変数を使用してパラメーターをバインドするのに対し、後者は値を使用することです。
したがって、bindParam を使用すると、2 番目のパラメーターは変数値ではなく変数名のみを使用でき、bindValue は特定の値を使用することさえできます。


4. 定義済みプレースホルダーのさまざまな形式:

暗黙的なプレースホルダー?、例:$sql = "insert into book (booKName,bookPrice,author) values(?,?,?)";
明示的なプレースホルダー:占位符名称、例:$sql = "insert into book (booKName,bookPrice,author) values(:bookName,:bookPrice,:author)";


おすすめ

転載: blog.csdn.net/m0_63622279/article/details/130274402