어떤 시점에서는 애플리케이션이 데이터베이스에 "큰" 데이터를 저장해야 할 수도 있습니다. "대형"은 일반적으로 "약 4kb 이상"을 의미하지만 일부 데이터베이스에서는 "대형"에 도달하기 전에 최대 32kb의 데이터를 쉽게 처리할 수 있습니다. 큰 개체는 본질적으로 텍스트이거나 바이너리일 수 있습니다. PDOStatement::bindParam() 또는 PDOStatement::bindColumn() 호출에서 PDO::PARAM_LOB 유형 코드를 사용하면 PDO가 대규모 데이터 유형을 사용할 수 있습니다. PDO::PARAM_LOB는 PDO에게 데이터를 스트림으로 매핑하여 PHP Streams API를 사용하여 조작할 수 있도록 지시합니다.
예제 #1 데이터베이스의 이미지 표시
다음 예에서는 LOB를 $lob 변수에 바인딩한 다음 fpassthru()를 사용하여 브라우저에 보냅니다. LOB는 스트림을 나타내기 때문에 fgets(), fread(), stream_get_contents()와 같은 함수를 사용할 수 있습니다.
<?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 길이로 커밋됩니다.
<?php $db = new PDO('oci:', 'scott', 'tiger'); $stmt = $db->prepare("insert into images (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(); ?>