ある時点で、アプリケーションはデータベースに「大きな」データを保存する必要がある場合があります。 「大規模」とは通常「約 4 kb 以上」を意味しますが、データベースによっては「大規模」に達する前に最大 32 kb のデータを簡単に処理できるものもあります。大きなオブジェクトは、本質的にテキストまたはバイナリである可能性があります。 PDOStatement::bindParam() または PDOStatement::bindColumn() 呼び出しで PDO::PARAM_LOB 型コードを使用すると、PDO で大きなデータ型を使用できるようになります。 PDO::PARAM_LOB は、PHP Streams API を使用してデータを操作できるように、データをストリームとしてマップするように PDO に指示します。
例 #1 データベースから画像を表示する
次の例では、LOB を $lob 変数にバインドし、fpassthru() を使用してブラウザに送信します。 LOB はストリームを表すため、fgets()、fread()、stream_get_contents() などの関数を LOB に対して使用できます。
<?php $db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2'); $stmt = $db->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); ?>
例 #2 データベースに画像を挿入する
次の例では、ファイルを開き、ファイル ハンドルを PDO に渡して LOB として挿入します。 PDO を使用すると、データベースは可能な限り最も効率的な方法でファイルの内容を取得できます。
<?php $db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2'); $stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)"); $id = get_new_id(); // 调用某个函数来分配一个新 ID // 假设处理一个文件上传 // 可以在 PHP 文档中找到更多的信息 $fp = fopen($_FILES['file']['tmp_name'], 'rb'); $stmt->bindParam(1, $id); $stmt->bindParam(2, $_FILES['file']['type']); $stmt->bindParam(3, $fp, PDO::PARAM_LOB); $db->beginTransaction(); $stmt->execute(); $db->commit(); ?>
例 #3 データベースへの画像の挿入: Oracle
ファイルから LOB を挿入する場合、Oracle は少し異なります。挿入はトランザクション後に実行する必要があります。そうでない場合、新しく挿入された LOB はクエリの実行時に長さ 0 で暗黙的にコミットされます。