ある時点で、アプリケーションは「大きな」データをデータベースに保存する必要がある場合があります。
「大規模」とは通常「約 4kb 以上」を意味しますが、データベースによっては、データが「大規模」に達する前に最大 32kb のデータを簡単に処理できるものもあります。大きなオブジェクトは、本質的にテキストまたはバイナリである可能性があります。
PDOStatement::bindParam() または PDOStatement::bindColumn()) 呼び出しで PDO::PARAM_LOB 型コードを使用して、PDO で大きなデータ型を使用できるようにします。
PDO::PARAM_LOB は、PHP Streams API を使用してデータを操作できるように、データをストリームとしてマップするように PDO に指示します。
次の例では、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);?>
次の例では、ファイルを開き、LOB として挿入するためにファイル ハンドルを PDO に渡します。 PDO を使用すると、データベースは可能な限り最も効率的な方法でファイルの内容を取得できます。
<?php$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');$stmt = $db->prepare("画像 (id、contenttype、imagedata) 値に挿入 (?, ?, ?)");$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();?>
Oracle では、ファイルから LOB を挿入する場合が少し異なります。挿入はトランザクションの後に行う必要があります。そうしないと、クエリの実行時に、新しく挿入された LOB が長さ 0 で暗黙的にコミットされます。
<?php$db = new PDO('oci:', 'scott', 'tiger');$stmt = $db->prepare("画像 (id, contenttype, imagedata) に挿入 " ."VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");$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);$stmt->beginTransaction();$stmt->execute();$stmt->commit();?>