File: lobs.xml

package info (click to toggle)
php-doc 20140201-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 74,084 kB
  • ctags: 4,040
  • sloc: xml: 998,137; php: 20,812; cpp: 500; sh: 177; makefile: 63; awk: 28
file content (135 lines) | stat: -rw-r--r-- 4,291 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 317502 $ -->

<chapter xml:id="pdo.lobs" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
 <title>Large Objects (LOBs)</title>
 <para>
   At some point in your application, you might find that you need to store
   "large" data in your database. Large typically means "around 4kb or
   more", although some databases can happily handle up to 32kb before data becomes
   "large". Large objects can be either textual or binary in nature. PDO
   allows you to work with this large data type by using the
   <constant>PDO::PARAM_LOB</constant>
   type code in your <function>PDOStatement::bindParam</function> or
   <function>PDOStatement::bindColumn</function> calls.
   <constant>PDO::PARAM_LOB</constant> tells
   PDO to map the data as a stream, so that you can manipulate it using the
   <link linkend="ref.stream">PHP Streams API</link>.
 </para>
 <para>
  <example>
   <title>Displaying an image from a database</title>
   <para>
    This example binds the LOB into the variable named $lob and then sends
    it to the browser using <function>fpassthru</function>.  Since the LOB
    is represented as a stream, functions such as
    <function>fgets</function>, <function>fread</function> and
    <function>stream_get_contents</function> can be used on it.
   </para>
   <programlisting role="php">
<![CDATA[
<?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);
?>
]]>
   </programlisting>
  </example>
 </para>
 <para>
  <example>
   <title>Inserting an image into a database</title>
   <para>
    This example opens up a file and passes the file handle to PDO to insert
    it as a LOB.  PDO will do its best to get the contents of the file up
    to the database in the most efficient manner possible.
   </para>
   <programlisting role="php">
<![CDATA[
<?php
$db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2');
$stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)");
$id = get_new_id(); // some function to allocate a new ID

// assume that we are running as part of a file upload form
// You can find more information in the PHP documentation

$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();
?>
]]>
   </programlisting>
  </example>
 </para>
 <para>
  <example>
   <title>Inserting an image into a database: Oracle</title>
   <para>
    Oracle requires a slightly different syntax for inserting a lob from a
    file.  It's also essential that you perform the insert under a
    transaction, otherwise your newly inserted LOB will be committed with a
    zero-length as part of the implicit commit that happens when the query
    is executed:
   </para>
   <programlisting role="php">
<![CDATA[
<?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(); // some function to allocate a new ID

// assume that we are running as part of a file upload form
// You can find more information in the PHP documentation

$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();
?>
]]>
   </programlisting>
  </example>
 </para>
</chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->