>백엔드 개발 >PHP 튜토리얼 >PHP--PDO 대형 개체(LOB)

PHP--PDO 대형 개체(LOB)

伊谢尔伦
伊谢尔伦원래의
2016-11-22 09:30:181213검색

어떤 시점에서는 애플리케이션이 데이터베이스에 "큰" 데이터를 저장해야 할 수도 있습니다. "대형"은 일반적으로 "약 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(&#39;odbc:SAMPLE&#39;, &#39;db2inst1&#39;, &#39;ibmdb2&#39;);
    $stmt = $db->prepare("select contenttype, imagedata from images where id=?");
    $stmt->execute(array($_GET[&#39;id&#39;]));
    $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(&#39;odbc:SAMPLE&#39;, &#39;db2inst1&#39;, &#39;ibmdb2&#39;);
    $stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
    $id = get_new_id(); // 调用某个函数来分配一个新 ID
    // 假设处理一个文件上传
    // 可以在 PHP 文档中找到更多的信息
    $fp = fopen($_FILES[&#39;file&#39;][&#39;tmp_name&#39;], &#39;rb&#39;);
    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $_FILES[&#39;file&#39;][&#39;type&#39;]);
    $stmt->bindParam(3, $fp, PDO::PARAM_LOB);
    $db->beginTransaction();
    $stmt->execute();
    $db->commit();
?>

예제 #3 데이터베이스에 그림 삽입: Oracle

파일에서 lob을 삽입하는 경우 Oracle은 약간 다릅니다. 삽입은 트랜잭션 후에 수행되어야 합니다. 그렇지 않으면 쿼리가 실행될 때 새로 삽입된 LOB가 암시적으로 0 길이로 커밋됩니다.

<?php
 $db = new PDO(&#39;oci:&#39;, &#39;scott&#39;, &#39;tiger&#39;);
   $stmt = $db->prepare("insert into images (id, contenttype, imagedata) " .
       "VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?");
   $id = get_new_id(); // 调用某个函数来分配一个新 ID

   // 假设处理一个文件上传
   // 可以在 PHP 文档中找到更多的信息
   $fp = fopen($_FILES[&#39;file&#39;][&#39;tmp_name&#39;], &#39;rb&#39;);

   $stmt->bindParam(1, $id);
   $stmt->bindParam(2, $_FILES[&#39;file&#39;][&#39;type&#39;]);
   $stmt->bindParam(3, $fp, PDO::PARAM_LOB);

   $stmt->beginTransaction();
   $stmt->execute();
   $stmt->commit();
?>




성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.