mirror of
https://github.com/ACSPRI/queXS
synced 2024-04-02 12:12:16 +00:00
7692 lines
367 KiB
HTML
7692 lines
367 KiB
HTML
<html xmlns:v="urn:schemas-microsoft-com:vml"
|
||
xmlns:o="urn:schemas-microsoft-com:office:office"
|
||
xmlns:w="urn:schemas-microsoft-com:office:word"
|
||
xmlns:st1="urn:schemas-microsoft-com:office:smarttags"
|
||
xmlns="http://www.w3.org/TR/REC-html40">
|
||
|
||
<head>
|
||
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
|
||
<meta name=ProgId content=Word.Document>
|
||
<meta name=Generator content="Microsoft Word 11">
|
||
<meta name=Originator content="Microsoft Word 11">
|
||
<link rel=File-List href="docs-adodb_files/filelist.xml">
|
||
<link rel=Edit-Time-Data href="docs-adodb_files/editdata.mso">
|
||
<!--[if !mso]>
|
||
<style>
|
||
v\:* {behavior:url(#default#VML);}
|
||
o\:* {behavior:url(#default#VML);}
|
||
w\:* {behavior:url(#default#VML);}
|
||
.shape {behavior:url(#default#VML);}
|
||
</style>
|
||
<![endif]-->
|
||
<title>ADODB Manual</title>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="State"/>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="PlaceType"/>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="PlaceName"/>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="country-region"/>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="City"/>
|
||
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
|
||
name="place"/>
|
||
<!--[if gte mso 9]><xml>
|
||
<o:DocumentProperties>
|
||
<o:Author>John</o:Author>
|
||
<o:LastAuthor>John</o:LastAuthor>
|
||
<o:Revision>3</o:Revision>
|
||
<o:TotalTime>3</o:TotalTime>
|
||
<o:Created>2008-12-24T10:43:00Z</o:Created>
|
||
<o:LastSaved>2008-12-24T10:46:00Z</o:LastSaved>
|
||
<o:Pages>73</o:Pages>
|
||
<o:Words>30239</o:Words>
|
||
<o:Characters>172366</o:Characters>
|
||
<o:Company> </o:Company>
|
||
<o:Lines>1436</o:Lines>
|
||
<o:Paragraphs>404</o:Paragraphs>
|
||
<o:CharactersWithSpaces>202201</o:CharactersWithSpaces>
|
||
<o:Version>11.9999</o:Version>
|
||
</o:DocumentProperties>
|
||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||
<w:WordDocument>
|
||
<w:Zoom>140</w:Zoom>
|
||
<w:FormsDesign/>
|
||
<w:ValidateAgainstSchemas/>
|
||
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
|
||
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
|
||
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
|
||
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
|
||
</w:WordDocument>
|
||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
|
||
</w:LatentStyles>
|
||
</xml><![endif]--><!--[if !mso]><object
|
||
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
|
||
<style>
|
||
st1\:*{behavior:url(#ieooui) }
|
||
</style>
|
||
<![endif]-->
|
||
<style>
|
||
<!--
|
||
f
|
||
|
||
|
||
/* Font Definitions */
|
||
@font-face
|
||
{font-family:Helvetica;
|
||
panose-1:2 11 6 4 2 2 2 2 2 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:swiss;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:Courier;
|
||
panose-1:2 7 4 9 2 2 5 2 4 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:modern;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:"Tms Rmn";
|
||
panose-1:2 2 6 3 4 5 5 2 3 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:Helv;
|
||
panose-1:2 11 6 4 2 2 2 3 2 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:swiss;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:"New York";
|
||
panose-1:2 4 5 3 6 5 6 2 3 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:System;
|
||
panose-1:0 0 0 0 0 0 0 0 0 0;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:swiss;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:Wingdings;
|
||
panose-1:5 0 0 0 0 0 0 0 0 0;
|
||
mso-font-charset:2;
|
||
mso-generic-font-family:auto;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 268435456 0 0 -2147483648 0;}
|
||
@font-face
|
||
{font-family:"MS Mincho";
|
||
panose-1:2 2 6 9 4 2 5 8 3 4;
|
||
mso-font-alt:"\FF2D\FF33 \660E\671D";
|
||
mso-font-charset:128;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 134676480 16 0 131072 0;}
|
||
@font-face
|
||
{font-family:Batang;
|
||
panose-1:2 3 6 0 0 1 1 1 1 1;
|
||
mso-font-alt:\BC14\D0D5;
|
||
mso-font-charset:129;
|
||
mso-generic-font-family:auto;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 151388160 16 0 524288 0;}
|
||
@font-face
|
||
{font-family:SimSun;
|
||
panose-1:2 1 6 0 3 1 1 1 1 1;
|
||
mso-font-alt:\5B8B\4F53;
|
||
mso-font-charset:134;
|
||
mso-generic-font-family:auto;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:1 135135232 16 0 262144 0;}
|
||
@font-face
|
||
{font-family:PMingLiU;
|
||
panose-1:2 2 3 0 0 0 0 0 0 0;
|
||
mso-font-alt:\65B0\7D30\660E\9AD4;
|
||
mso-font-charset:136;
|
||
mso-generic-font-family:auto;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:1 134742016 16 0 1048576 0;}
|
||
@font-face
|
||
{font-family:"MS Gothic";
|
||
panose-1:2 11 6 9 7 2 5 8 2 4;
|
||
mso-font-alt:"\FF2D\FF33 \30B4\30B7\30C3\30AF";
|
||
mso-font-charset:128;
|
||
mso-generic-font-family:modern;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 134676480 16 0 131072 0;}
|
||
@font-face
|
||
{font-family:Dotum;
|
||
panose-1:2 11 6 0 0 1 1 1 1 1;
|
||
mso-font-alt:\B3CB\C6C0;
|
||
mso-font-charset:129;
|
||
mso-generic-font-family:modern;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 151388160 16 0 524288 0;}
|
||
@font-face
|
||
{font-family:SimHei;
|
||
panose-1:2 1 6 0 3 1 1 1 1 1;
|
||
mso-font-alt:\9ED1\4F53;
|
||
mso-font-charset:134;
|
||
mso-generic-font-family:modern;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 135135232 16 0 262144 0;}
|
||
@font-face
|
||
{font-family:MingLiU;
|
||
panose-1:2 2 3 9 0 0 0 0 0 0;
|
||
mso-font-alt:\7D30\660E\9AD4;
|
||
mso-font-charset:136;
|
||
mso-generic-font-family:modern;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 134742016 16 0 1048576 0;}
|
||
@font-face
|
||
{font-family:Mincho;
|
||
panose-1:2 2 6 9 4 3 5 8 3 5;
|
||
mso-font-alt:\660E\671D;
|
||
mso-font-charset:128;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 134676480 16 0 131072 0;}
|
||
@font-face
|
||
{font-family:Gulim;
|
||
panose-1:2 11 6 0 0 1 1 1 1 1;
|
||
mso-font-alt:\AD74\B9BC;
|
||
mso-font-charset:129;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:fixed;
|
||
mso-font-signature:1 151388160 16 0 524288 0;}
|
||
@font-face
|
||
{font-family:Century;
|
||
panose-1:2 4 6 4 5 5 5 2 3 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:"Angsana New";
|
||
panose-1:2 2 6 3 5 4 5 2 3 4;
|
||
mso-font-charset:222;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:16777217 0 0 0 65536 0;}
|
||
@font-face
|
||
{font-family:"Cordia New";
|
||
panose-1:2 11 3 4 2 2 2 2 2 4;
|
||
mso-font-charset:222;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:16777217 0 0 0 65536 0;}
|
||
@font-face
|
||
{font-family:Mangal;
|
||
panose-1:0 0 4 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:32768 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Latha;
|
||
panose-1:2 0 4 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:1048576 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Sylfaen;
|
||
panose-1:1 10 5 2 5 3 6 3 3 3;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:16778883 0 512 0 13 0;}
|
||
@font-face
|
||
{font-family:Vrinda;
|
||
panose-1:0 0 4 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Raavi;
|
||
panose-1:2 0 5 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Shruti;
|
||
panose-1:2 0 5 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Sendnya;
|
||
panose-1:0 0 4 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Gautami;
|
||
panose-1:2 0 5 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Tunga;
|
||
panose-1:0 0 4 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:"Estrangelo Edessa";
|
||
panose-1:0 0 0 0 0 0 0 0 0 0;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:Kartika;
|
||
panose-1:1 1 1 0 1 1 1 1 1 1;
|
||
mso-font-charset:1;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:0 0 0 0 0 0;}
|
||
@font-face
|
||
{font-family:"Arial Unicode MS";
|
||
panose-1:2 11 6 4 2 2 2 2 2 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:roman;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
@font-face
|
||
{font-family:Tahoma;
|
||
panose-1:2 11 6 4 3 5 4 4 2 4;
|
||
mso-font-charset:0;
|
||
mso-generic-font-family:swiss;
|
||
mso-font-format:other;
|
||
mso-font-pitch:variable;
|
||
mso-font-signature:3 0 0 0 1 0;}
|
||
/* Style Definitions */
|
||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||
{mso-style-parent:"";
|
||
margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
font-size:12.0pt;
|
||
font-family:"Times New Roman";
|
||
mso-fareast-font-family:"Times New Roman";
|
||
color:black;}
|
||
h1
|
||
{mso-margin-top-alt:auto;
|
||
margin-right:0cm;
|
||
mso-margin-bottom-alt:auto;
|
||
margin-left:0cm;
|
||
mso-pagination:widow-orphan;
|
||
mso-outline-level:1;
|
||
font-size:24.0pt;
|
||
font-family:"Times New Roman";
|
||
color:black;
|
||
font-weight:bold;}
|
||
h2
|
||
{mso-margin-top-alt:auto;
|
||
margin-right:0cm;
|
||
mso-margin-bottom-alt:auto;
|
||
margin-left:0cm;
|
||
mso-pagination:widow-orphan;
|
||
mso-outline-level:2;
|
||
font-size:18.0pt;
|
||
font-family:"Times New Roman";
|
||
color:black;
|
||
font-weight:bold;}
|
||
h3
|
||
{mso-margin-top-alt:auto;
|
||
margin-right:0cm;
|
||
mso-margin-bottom-alt:auto;
|
||
margin-left:0cm;
|
||
mso-pagination:widow-orphan;
|
||
mso-outline-level:3;
|
||
font-size:13.5pt;
|
||
font-family:"Times New Roman";
|
||
color:black;
|
||
font-weight:bold;}
|
||
h4
|
||
{mso-margin-top-alt:auto;
|
||
margin-right:0cm;
|
||
mso-margin-bottom-alt:auto;
|
||
margin-left:0cm;
|
||
mso-pagination:widow-orphan;
|
||
mso-outline-level:4;
|
||
font-size:12.0pt;
|
||
font-family:"Times New Roman";
|
||
color:black;
|
||
font-weight:bold;}
|
||
a:link, span.MsoHyperlink
|
||
{color:blue;
|
||
text-decoration:underline;
|
||
text-underline:single;}
|
||
a:visited, span.MsoHyperlinkFollowed
|
||
{color:blue;
|
||
text-decoration:underline;
|
||
text-underline:single;}
|
||
p
|
||
{font-size:12.0pt;
|
||
font-family:"Times New Roman";
|
||
mso-fareast-font-family:"Times New Roman";
|
||
color:black;}
|
||
code
|
||
{font-family:"Courier New";
|
||
mso-ascii-font-family:"Courier New";
|
||
mso-fareast-font-family:"Times New Roman";
|
||
mso-hansi-font-family:"Courier New";
|
||
mso-bidi-font-family:"Courier New";}
|
||
pre
|
||
{margin:0cm;
|
||
margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
|
||
background:#EEEEEE;
|
||
border:none;
|
||
mso-border-alt:solid #DDDDDD .75pt;
|
||
padding:0cm;
|
||
mso-padding-alt:9.0pt 18.0pt 9.0pt 18.0pt;
|
||
font-size:9.0pt;
|
||
font-family:"Courier New";
|
||
mso-fareast-font-family:"Times New Roman";
|
||
color:black;}
|
||
span.msoIns
|
||
{mso-style-type:export-only;
|
||
mso-style-name:"";
|
||
text-decoration:underline;
|
||
text-underline:single;
|
||
color:teal;}
|
||
span.msoDel
|
||
{mso-style-type:export-only;
|
||
mso-style-name:"";
|
||
text-decoration:line-through;
|
||
color:red;}
|
||
span.msoChangeProp
|
||
{mso-style-type:export-only;
|
||
mso-style-name:"";}
|
||
@page Section1
|
||
{size:612.0pt 792.0pt;
|
||
margin:72.0pt 90.0pt 72.0pt 90.0pt;
|
||
mso-header-margin:35.4pt;
|
||
mso-footer-margin:35.4pt;
|
||
mso-paper-source:0;}
|
||
div.Section1
|
||
{page:Section1;}
|
||
/* List Definitions */
|
||
@list l0
|
||
{mso-list-id:3098366;
|
||
mso-list-template-ids:-1654113918;}
|
||
@list l0:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l1
|
||
{mso-list-id:118686534;
|
||
mso-list-template-ids:1789952844;}
|
||
@list l1:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l2
|
||
{mso-list-id:325595838;
|
||
mso-list-template-ids:-924547596;}
|
||
@list l2:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l3
|
||
{mso-list-id:577053254;
|
||
mso-list-template-ids:1006266472;}
|
||
@list l3:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l4
|
||
{mso-list-id:584261941;
|
||
mso-list-template-ids:1672376844;}
|
||
@list l4:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l5
|
||
{mso-list-id:678311197;
|
||
mso-list-template-ids:-1025849406;}
|
||
@list l5:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l6
|
||
{mso-list-id:993068284;
|
||
mso-list-template-ids:-1149100626;}
|
||
@list l6:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l7
|
||
{mso-list-id:1120344907;
|
||
mso-list-template-ids:-1732590280;}
|
||
@list l7:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l8
|
||
{mso-list-id:1134718884;
|
||
mso-list-template-ids:-1854392276;}
|
||
@list l8:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l9
|
||
{mso-list-id:1289897560;
|
||
mso-list-template-ids:-1284101662;}
|
||
@list l9:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
@list l10
|
||
{mso-list-id:1461026030;
|
||
mso-list-template-ids:65944450;}
|
||
@list l11
|
||
{mso-list-id:1566380536;
|
||
mso-list-template-ids:395727058;}
|
||
@list l11:level1
|
||
{mso-level-number-format:bullet;
|
||
mso-level-text:\F0B7;
|
||
mso-level-tab-stop:36.0pt;
|
||
mso-level-number-position:left;
|
||
text-indent:-18.0pt;
|
||
mso-ansi-font-size:10.0pt;
|
||
font-family:Symbol;}
|
||
ol
|
||
{margin-bottom:0cm;}
|
||
ul
|
||
{margin-bottom:0cm;}
|
||
-->
|
||
</style>
|
||
<!--[if gte mso 10]>
|
||
<style>
|
||
/* Style Definitions */
|
||
table.MsoNormalTable
|
||
{mso-style-name:"Table Normal";
|
||
mso-tstyle-rowband-size:0;
|
||
mso-tstyle-colband-size:0;
|
||
mso-style-noshow:yes;
|
||
mso-style-parent:"";
|
||
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
|
||
mso-para-margin:0cm;
|
||
mso-para-margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
font-size:10.0pt;
|
||
font-family:"Times New Roman";
|
||
mso-ansi-language:#0400;
|
||
mso-fareast-language:#0400;
|
||
mso-bidi-language:#0400;}
|
||
</style>
|
||
<![endif]--><!--[if gte mso 9]><xml>
|
||
<o:shapedefaults v:ext="edit" spidmax="1026"/>
|
||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||
<o:shapelayout v:ext="edit">
|
||
<o:idmap v:ext="edit" data="1"/>
|
||
</o:shapelayout></xml><![endif]-->
|
||
</head>
|
||
|
||
<body bgcolor=white lang=EN-US link=blue vlink=blue style='tab-interval:36.0pt'>
|
||
|
||
<div class=Section1>
|
||
|
||
<h2>ADOdb Library for PHP</h2>
|
||
|
||
<p>V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com)</p>
|
||
|
||
<p><span style='font-size:7.5pt'>This software is dual licensed using BSD-Style
|
||
and LGPL. This means you can use it in compiled proprietary and commercial
|
||
products.</span></p>
|
||
|
||
<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
|
||
<a href="http://adodb.sourceforge.net/#docs">Other Docs</a> </p>
|
||
|
||
<p><a href="#intro"><b>Introduction</b></a><b><br>
|
||
<a href="#features">Unique Features</a><br>
|
||
<a href="#users">How People are using ADOdb</a><br>
|
||
<a href="#bugs">Feature Requests and Bug Reports</a><br>
|
||
<a href="#install">Installation</a><br>
|
||
<a href="#mininstall">Minimum Install</a><br>
|
||
<a href="#coding">Initializing Code and Connectioning to Databases</a><br>
|
||
</b><span style='font-size:10.0pt'> <a href="#dsnsupport">Data Source
|
||
Name (DSN) Support</a></span> <a href="#connect_ex">Connection Examples</a>
|
||
<br>
|
||
<b><a href="#speed">High Speed ADOdb - tuning tips</a></b><br>
|
||
<b><a href="#hack">Hacking and Modifying ADOdb Safely</a><br>
|
||
<a href="#php5">PHP5 Features</a></b><br>
|
||
<span style='font-size:10.0pt'><a href="#php5iterators">foreach iterators</a> <a
|
||
href="#php5exceptions">exceptions</a></span><br>
|
||
<b><a href="#drivers">Supported Databases</a></b><br>
|
||
<b><a href="#quickstart">Tutorials</a></b><br>
|
||
<a href="#ex1">Example 1: Select</a><br>
|
||
<a href="#ex2">Example 2: Advanced Select</a><br>
|
||
<a href="#ex3">Example 3: Insert</a><br>
|
||
<a href="#ex4">Example 4: Debugging</a> <a href="#exrs2html">rs2html
|
||
example</a><br>
|
||
<a href="#ex5">Example 5: MySQL and Menus</a><br>
|
||
<a href="#ex6">Example 6: Connecting to Multiple Databases at once</a> <br>
|
||
<a href="#ex7">Example 7: Generating Update and Insert SQL</a> <br>
|
||
<a href="#ex8">Example 8: Implementing Scrolling with Next and Previous</a><br>
|
||
<a href="#ex9">Example 9: Exporting in CSV or Tab-Delimited Format</a> <br>
|
||
<a href="#ex10">Example 10: Custom filters</a><br>
|
||
<a href="#ex11">Example 11: Smart Transactions</a><br>
|
||
<br>
|
||
<b><a href="#errorhandling">Using Custom Error Handlers and PEAR_Error</a><br>
|
||
<a href="#DSN">Data Source Names</a><br>
|
||
<a href="#caching">Caching</a></b><br>
|
||
<a href="#memcache">MemCache</a><br>
|
||
<a href="#cacheapi">Caching API</a><br>
|
||
<b><a href="#pivot">Pivot Tables</a></b> </p>
|
||
|
||
<p><a href="#ref"><b>REFERENCE</b></a> </p>
|
||
|
||
<p><span style='font-size:10.0pt'>Variables: <a href="#adodb_countrecs">$ADODB_COUNTRECS</a>
|
||
<a href="#adodb_ansi_padding_off">$ADODB_ANSI_PADDING_OFF</a> <a
|
||
href="#adodb_cache_dir">$ADODB_CACHE_DIR</a> <br>
|
||
<a href="#force_type">$ADODB_FORCE_TYPE</a> <a
|
||
href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a> <a href="#adodb_lang">$ADODB_LANG</a>
|
||
<a href="#adodb_auto_quote">ADODB_QUOTE_FIELDNAMES</a> <br>
|
||
Constants: <a href="#adodb_assoc_case">ADODB_ASSOC_CASE</a> </span><br>
|
||
<a href="#ADOConnection"><b>ADOConnection</b></a><br>
|
||
<span style='font-size:10.0pt'>Connections: <a href="#connect">Connect</a> <a
|
||
href="#pconnect">PConnect</a> <a href="#nconnect">NConnect</a> <a
|
||
href="#isconnected">IsConnected</a><br>
|
||
Executing SQL: <a href="#execute">Execute</a> <a href="#cacheexecute"><i>CacheExecute</i></a>
|
||
<a href="#selectlimit">SelectLimit</a> <a href="#cacheSelectLimit"><i>CacheSelectLimit</i></a>
|
||
<a href="#param">Param</a> <a href="#prepare">Prepare</a> <a href="#preparesp">PrepareSP</a>
|
||
<a href="#inparameter">InParameter</a> <a href="#outparameter">OutParameter</a>
|
||
<a href="#autoexecute">AutoExecute</a> <br>
|
||
<a
|
||
href="#getone">GetOne</a> <a href="#cachegetone"><i>CacheGetOne</i></a> <a
|
||
href="#getrow">GetRow</a> <a href="#cachegetrow"><i>CacheGetRow</i></a> <a
|
||
href="#getall">GetAll</a> <a href="#cachegetall"><i>CacheGetAll</i></a> <a
|
||
href="#getcol">GetCol</a> <a href="#cachegetcol"><i>CacheGetCol</i></a> <a
|
||
href="#getassoc1">GetAssoc</a> <a href="#cachegetassoc"><i>CacheGetAssoc</i></a>
|
||
<a href="#replace">Replace</a> <a href="#getmedian">GetMedian</a> <br>
|
||
<a
|
||
href="#executecursor">ExecuteCursor</a> (oci8 only)<br>
|
||
Generates SQL strings: <a href="#getupdatesql">GetUpdateSQL</a> <a
|
||
href="#getinsertsql">GetInsertSQL</a> <a href="#concat">Concat</a> <a
|
||
href="#ifnull">IfNull</a> <a href="#length">length</a> <a href="#random">random</a>
|
||
<a href="#substr">substr</a> <a href="#qstr">qstr</a> <a href="#param">Param</a>
|
||
<a href="#OffsetDate">OffsetDate</a> <a href="#sqldate">SQLDate</a> <a
|
||
href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a> <a
|
||
href="#binddate">BindDate</a> <a href="#bindtimestamp">BindTimeStamp</a> <br>
|
||
Blobs: <a href="#updateblob">UpdateBlob</a> <a href="#updateclob">UpdateClob</a>
|
||
<a href="#updateblobfile">UpdateBlobFile</a> <a href="#blobencode">BlobEncode</a>
|
||
<a href="#blobdecode">BlobDecode</a><br>
|
||
Paging/Scrolling: <a href="#pageexecute">PageExecute</a> <a
|
||
href="#cachepageexecute">CachePageExecute</a><br>
|
||
Cleanup: <a href="#cacheflush">CacheFlush</a> <a href="#Close">Close</a><br>
|
||
Transactions: <a href="#starttrans">StartTrans</a> <a href="#completetrans">CompleteTrans</a>
|
||
<a href="#failtrans">FailTrans</a> <a href="#hasfailedtrans">HasFailedTrans</a>
|
||
<a href="#begintrans">BeginTrans</a> <a href="#committrans">CommitTrans</a> <a
|
||
href="#rollbacktrans">RollbackTrans</a> <a href="#SetTransactionMode">SetTransactionMode</a><br>
|
||
Fetching Data: <a href="#setfetchmode">SetFetchMode</a><br>
|
||
Strings: <a href="#concat">concat</a> <a href="#length">length</a> <a
|
||
href="#qstr">qstr</a> <a href="#quote">quote</a> <a href="#substr">substr</a><br>
|
||
Dates: <a href="#dbdate">DBDate</a> <a href="#dbtimestamp">DBTimeStamp</a> <a
|
||
href="#unixdate">UnixDate</a> <a href="#binddate">BindDate</a> <a
|
||
href="#bindtimestamp">BindTimeStamp</a> <a href="#unixtimestamp">UnixTimeStamp</a>
|
||
<a href="#OffsetDate">OffsetDate</a> <a href="#SQLDate">SQLDate</a> <br>
|
||
Row Management: <a href="#affected_rows">Affected_Rows</a> <a
|
||
href="#inserted_id">Insert_ID</a> <a href="#rowlock">RowLock</a> <a
|
||
href="#genid">GenID</a> <a href="#createseq">CreateSequence</a> <a
|
||
href="#dropseq">DropSequence</a> <br>
|
||
Error Handling: <a href="#errormsg">ErrorMsg</a> <a href="#errorno">ErrorNo</a>
|
||
<a href="#metaerror">MetaError</a> <a href="#metaerrormsg">MetaErrorMsg</a> <a
|
||
href="#ignoreerrors">IgnoreErrors</a><br>
|
||
Data Dictionary (metadata): <a href="#metadatabases">MetaDatabases</a> <a
|
||
href="#metatables">MetaTables</a> <a href="#metacolumns">MetaColumns</a> <a
|
||
href="#metacolumnames">MetaColumnNames</a> <a href="#metaprimarykeys">MetaPrimaryKeys</a>
|
||
<a href="#metaforeignkeys">MetaForeignKeys</a> <a href="#serverinfo">ServerInfo</a>
|
||
<br>
|
||
Statistics and Query-Rewriting: <a href="#logsql">LogSQL</a> <a
|
||
href="#fnexecute">fnExecute and fnCacheExecute</a><br>
|
||
Deprecated: <a href="#bind">Bind</a> <a href="#blankrecordset">BlankRecordSet</a>
|
||
<a href="#parameter">Parameter</a></span> <a href="#adorecordSet"><b><br>
|
||
ADORecordSet</b></a><br>
|
||
<span style='font-size:10.0pt'>Returns one field: <a href="#fields">Fields</a><br>
|
||
Returns one row:<a href="#fetchrow">FetchRow</a> <a href="#fetchinto">FetchInto</a>
|
||
<a href="#fetchobject">FetchObject</a> <a href="#fetchnextobject">FetchNextObject</a>
|
||
<a href="#fetchobj">FetchObj</a> <a href="#fetchnextobj">FetchNextObj</a> <a
|
||
href="#getrowassoc">GetRowAssoc</a> <br>
|
||
Returns all rows:<a href="#getarray">GetArray</a> <a href="#getrows">GetRows</a>
|
||
<a href="#getassoc">GetAssoc</a><br>
|
||
Scrolling:<a href="#move">Move</a> <a href="#movenext">MoveNext</a> <a
|
||
href="#movefirst">MoveFirst</a> <a href="#movelast">MoveLast</a> <a
|
||
href="#abspos">AbsolutePosition</a> <a href="#currentrow">CurrentRow</a> <a
|
||
href="#atfirstpage">AtFirstPage</a> <a href="#atlastpage">AtLastPage</a> <a
|
||
href="#absolutepage">AbsolutePage</a> <br>
|
||
Menu generation:<a href="#getmenu">GetMenu</a> <a href="#getmenu2">GetMenu2</a><br>
|
||
Dates:<a href="#userdate">UserDate</a> <a href="#usertimestamp">UserTimeStamp</a>
|
||
<a href="#unixdate">UnixDate</a> <a href="#unixtimestamp">UnixTimeStamp<br>
|
||
</a>Recordset Info:<a href="#recordcount">RecordCount</a> <a
|
||
href="#po_recordcount">PO_RecordCount</a> <a href="#nextrecordset">NextRecordSet</a><br>
|
||
Field Info:<a href="#fieldcount">FieldCount</a> <a href="#fetchfield">FetchField</a>
|
||
<a href="#metatype">MetaType</a><br>
|
||
Cleanup: <a href="#rsclose">Close</a></span> </p>
|
||
|
||
<p><span style='font-size:10.0pt'><a href="#rs2html"><b>rs2html</b></a> <a
|
||
href="#exrs2html">example</a></span><br>
|
||
<a href="#adodiff">Differences between ADOdb and ADO</a><br>
|
||
<a href="#driverguide"><b>Database Driver Guide<br>
|
||
</b></a><b><a href="#changes">Change Log</a></b></p>
|
||
|
||
<h2>Introduction<a name=intro></a></h2>
|
||
|
||
<p>PHP's database access functions are not standardised. This creates a need
|
||
for a database class library to hide the differences between the different
|
||
database API's (encapsulate the differences) so we can easily switch databases.
|
||
PHP 4.0.5 or later is now required (because we use array-based str_replace).</p>
|
||
|
||
<p>We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL
|
||
Anywhere, Informix, PostgreSQL, FrontBase, SQLite, Interbase (Firebird and
|
||
Borland variants), Foxpro, Access, <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>,
|
||
DB2, SAP DB and ODBC. We have had successful reports of connecting to Progress
|
||
and CacheLite via ODBC. We hope more people will contribute drivers to support
|
||
other databases.</p>
|
||
|
||
<p>PHP4 supports session variables. You can store your session information
|
||
using ADOdb for true portability and scalability. See adodb-session.php for
|
||
more information.</p>
|
||
|
||
<p>Also read <a href="http://phplens.com/lens/adodb/tips_portable_sql.htm">tips_portable_sql.htm</a>
|
||
for tips on writing portable SQL.</p>
|
||
|
||
<h2>Unique Features of ADOdb<a name=features></a></h2>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Easy for Windows
|
||
programmers</b> to adapt to because many of the conventions are similar to
|
||
Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'>Unlike other PHP database
|
||
classes which focus only on select statements, <b>we provide support code
|
||
to handle inserts and updates which can be adapted to multiple databases
|
||
quickly.</b> Methods are provided for date handling, string concatenation
|
||
and string quoting characters for differing databases.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'>A<b> metatype system </b>is
|
||
built in so that we can figure out that types such as CHAR, TEXT and
|
||
STRING are equivalent in different databases.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Easy to port</b> because
|
||
all the database dependant code are stored in stub functions. You do not
|
||
need to port the core logic of the classes.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Portable table and index
|
||
creation</b> with the <a href="docs-datadict.htm">datadict</a> classes. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Database performance
|
||
monitoring and SQL tuning</b> with the <a href="docs-perf.htm">performance
|
||
monitoring</a> classes. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Database-backed sessions</b>
|
||
with the <a href="docs-session.htm">session management</a> classes.
|
||
Supports session expiry notification. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l2 level1 lfo1;tab-stops:list 36.0pt'><b>Object-Relational
|
||
Mapping</b> using <a href="docs-active-record.htm">ADOdb_Active_Record</a>
|
||
classes. </li>
|
||
</ul>
|
||
|
||
<h2>How People are using ADOdb<a name=users></a></h2>
|
||
|
||
<p class=MsoNormal>Here are some examples of how people are using ADOdb (for a
|
||
much longer list, visit <a
|
||
href="http://phplens.com/phpeverywhere/adodb-cool-apps">adodb-cool-apps</a>): </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://phplens.com/">PhpLens</a> is a commercial data grid component
|
||
that allows both cool Web designers and serious unshaved programmers to
|
||
develop and maintain databases on the Web easily. Developed by the author
|
||
of ADOdb.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://www.interakt.ro/phakt/">PHAkt: PHP Extension for DreamWeaver
|
||
Ultradev</a> allows you to script PHP in the popular Web page editor.
|
||
Database handling provided by ADOdb.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://www.andrew.cmu.edu/%7Erdanyliw/snort/snortacid.html">Analysis
|
||
Console for Intrusion Databases</a> (ACID): PHP-based analysis engine to
|
||
search and process a database of security incidents generated by
|
||
security-related software such as IDSes and firewalls (e.g. Snort,
|
||
ipchains). By Roman Danyliw.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://www.postnuke.com/">PostNuke</a> is a very popular free
|
||
content management system and weblog system. It offers full CSS support,
|
||
HTML 4.01 transitional compliance throughout, an advanced blocks system,
|
||
and is fully multi-lingual enabled. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://www.auto-net.no/easypublish.php?page=index&lang_id=2">EasyPublish
|
||
CMS</a> is another free content management system for managing information
|
||
and integrated modules on your internet, intranet- and extranet-sites.
|
||
From <st1:country-region w:st="on"><st1:place w:st="on">Norway</st1:place></st1:country-region>.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l4 level1 lfo2;tab-stops:list 36.0pt'><a
|
||
href="http://nola.noguska.com/">NOLA</a> is a full featured accounting,
|
||
inventory, and job tracking application. It is licensed under the GPL, and
|
||
developed by Noguska. </li>
|
||
</ul>
|
||
|
||
<h2>Feature Requests and Bug Reports<a name=bugs></a></h2>
|
||
|
||
<p>Feature requests and bug reports can be emailed to <a
|
||
href="mailto:jlim#natsoft.com">jlim#natsoft.com</a> or posted to the ADOdb Help
|
||
forums at <a href="http://phplens.com/lens/lensforum/topics.php?id=4">http://phplens.com/lens/lensforum/topics.php?id=4</a>.</p>
|
||
|
||
<h2>Installation Guide<a name=install></a></h2>
|
||
|
||
<p>Make sure you are running PHP 4.0.5 or later. Unpack all the files into a
|
||
directory accessible by your webserver.</p>
|
||
|
||
<p>To test, try modifying some of the tutorial examples. Make sure you
|
||
customize the connection settings correctly. You can debug using <i>$db->debug
|
||
= true</i> as shown below:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><?php<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>include('adodb/adodb.inc.php');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = <a href="#adonewconnection">ADONewConnection</a>($dbdriver); # eg 'mysql' or 'postgres'<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->debug = true;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db-><a href="#connect">Connect</a>($server, $user, $password, $database);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $db-><a href="#execute">Execute</a>('select * from some_small_table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print "<pre>";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs-><a href="#getrows">GetRows</a>());<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print "</pre>";<br>
|
||
?></pre></div>
|
||
|
||
<h3>Minimum Install<a name=mininstall></a></h3>
|
||
|
||
<p>For developers who want to release a minimal install of ADOdb, you will
|
||
need: </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb.inc.php </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-lib.inc.php </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-time.inc.php </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>drivers/adodb-$database.inc.php
|
||
</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>license.txt (for legal
|
||
reasons) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-php4.inc.php </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l9 level1 lfo3;tab-stops:list 36.0pt'>adodb-iterator.inc.php
|
||
(php5 functionality) </li>
|
||
</ul>
|
||
|
||
<p class=MsoNormal>Optional: </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-error.inc.php and
|
||
lang/adodb-$lang.inc.php (if you use MetaError()) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-csvlib.inc.php (if
|
||
you use cached recordsets - CacheExecute(), etc) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-exceptions.inc.php
|
||
and adodb-errorhandler.inc.php (if you use adodb error handler or php5
|
||
exceptions). </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l3 level1 lfo4;tab-stops:list 36.0pt'>adodb-active-record.inc.php
|
||
if you use <a href="docs-active-record.htm">Active Records</a>. </li>
|
||
</ul>
|
||
|
||
<h3>Code Initialization Examples<a name=coding></a></h3>
|
||
|
||
<p>When running ADOdb, at least two files are loaded. First is
|
||
adodb/adodb.inc.php, which contains all functions used by all database classes.
|
||
The code specific to a particular database is in the
|
||
adodb/driver/adodb-????.inc.php file.</p>
|
||
|
||
<p><a name=adonewconnection></a>For example, to connect to a mysql database:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>include('/path/to/set/here/adodb.inc.php');<br>
|
||
$conn = &ADONewConnection('mysql');</pre></div>
|
||
|
||
<p>Whenever you need to connect to a database, you create a Connection object
|
||
using the <b>ADONewConnection</b>($driver) function. <b>NewADOConnection</b>($driver)
|
||
is an alternative name for the same function.</p>
|
||
|
||
<p>At this point, you are not connected to the database (no longer true if you
|
||
pass in a <a href="#dsnsupport">dsn</a>). You will first need to decide whether
|
||
to use <i>persistent</i> or <i>non-persistent</i> connections. The advantage of
|
||
<i>persistent</i> connections is that they are faster, as the database
|
||
connection is never closed (even when you call Close()). <i>Non-persistent </i>connections
|
||
take up much fewer resources though, reducing the risk of your database and
|
||
your web-server becoming overloaded. </p>
|
||
|
||
<p>For persistent connections, use $conn-><a href="#pconnect">PConnect()</a>,
|
||
or $conn-><a href="#connect">Connect()</a> for non-persistent connections.
|
||
Some database drivers also support <a href="#nconnect">NConnect()</a>, which
|
||
forces the creation of a new connection. <a name="connection_gotcha"></a></p>
|
||
|
||
<p><b>Connection Gotcha</b>: If you create two connections, but both use the
|
||
same userid and password, PHP will share the same connection. This can cause
|
||
problems if the connections are meant to different databases. The solution is
|
||
to always use different userid's for different databases, or use NConnect(). <a
|
||
name=dsnsupport></a></p>
|
||
|
||
<h3>Data Source Name (DSN) Support</h3>
|
||
|
||
<p>Since ADOdb 4.51, you can connect to a database by passing a dsn to
|
||
NewADOConnection() (or ADONewConnection, which is the same function). The dsn
|
||
format is: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$driver://$username:$password@hostname/$database?options[=value]</pre></div>
|
||
|
||
<p>NewADOConnection() calls Connect() or PConnect() internally for you. If the
|
||
connection fails, false is returned. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='color:green'># non-persistent connection</span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'mysql://root:pwd@localhost/mydb'; </pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = NewADOConnection($dsn);</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>if (!$db) die("Connection failed");<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='color:green'># no need to call connect/pconnect!</span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$arr = $db->GetArray("select * from table");</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='color:green'># persistent connection</span></pre>
|
||
<pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn2 = 'mysql://root:pwd@localhost/mydb?persist';
|
||
<span
|
||
style='mso-tab-count:1'></span></pre>
|
||
<pre><span style='mso-tab-count:
|
||
1'> </span><span style='color:green'># non-persistent connection on port 3000</span></pre>
|
||
<pre><span
|
||
style='mso-tab-count:1'> </span>$dsn2 = 'mysqli://root:pwd@localhost/mydb?persist=0&port=3000';</pre>
|
||
</div>
|
||
|
||
<p>If you have special characters such as /:?_ in your dsn, then you need to
|
||
rawurlencode them first: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$pwd = rawurlencode($pwd);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = "mysql://root:$pwd@localhost/mydb";</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn2=rawurlencode("sybase_ase")."://user:pass@host/path?query";</pre></div>
|
||
|
||
<p>Legal options are: </p>
|
||
|
||
<div align=center>
|
||
|
||
<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>For all drivers</p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'persist', 'persistent', 'debug', 'fetchmode', 'new' </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Interbase/Firebird </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'dialect','charset','buffers','role' </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>M'soft <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City></p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'charpage' </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:3'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>MySQL</p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'clientflags' </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:4'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>MySQLi</p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'port', 'socket', 'clientflags' </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Oci8</p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>'nls_date_format','charset' </p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</div>
|
||
|
||
<p>For all drivers, when the options <i>persist</i> or <i>persistent</i> are
|
||
set, a persistent connection is forced; similarly, when <i>new</i> is set, then
|
||
a new connection will be created using NConnect if the underlying driver
|
||
supports it. The <i>debug</i> option enables debugging. The <i>fetchmode</i>
|
||
calls <a href="#setfetchmode">SetFetchMode()</a>. If no value is defined for an
|
||
option, then the value is set to 1. </p>
|
||
|
||
<p>ADOdb DSN's are compatible with version 1.0 of PEAR DB's DSN format. <a
|
||
name="connect_ex"></a></p>
|
||
|
||
<h3><span style='mso-bookmark:connect_ex'>Examples of Connecting to Databases</span></h3>
|
||
|
||
<h4><span style='mso-bookmark:connect_ex'>MySQL and Most Other Database Drivers</span></h4>
|
||
|
||
<p><span style='mso-bookmark:connect_ex'>MySQL connections are very
|
||
straightforward, and the parameters are identical to mysql_connect:</span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = &ADONewConnection('mysql'); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('localhost','userid','password','database');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></span><span style='mso-bookmark:
|
||
connect_ex'><span style='color:green'># or dsn </span></span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'mysql://user:pwd@localhost/mydb'; </span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for Connect()</span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></span><span
|
||
style='mso-bookmark:connect_ex'><span style='color:green'># or persistent dsn</span></span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'mysql://user:pwd@localhost/mydb?persist'; </span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for PConnect()</span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></span><span
|
||
style='mso-bookmark:connect_ex'><span style='color:green'># a more complex example:</span></span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$pwd = urlencode($pwd);</span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$flags =<span style='mso-spacerun:yes'><EFBFBD> </span>MYSQL_CLIENT_COMPRESS;</span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags";</span></pre><pre><span
|
||
style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for PConnect()</span></pre><pre
|
||
style='background:#EEEEEE'><span style='mso-bookmark:connect_ex'> </span></pre></div>
|
||
|
||
<p><span style='mso-bookmark:connect_ex'>For most drivers, you can use the
|
||
standard function: Connect($server, $user, $password, $database), or a </span><a
|
||
href="dsnsupport">DSN</a> since ADOdb 4.51. Exceptions to this are listed
|
||
below. </p>
|
||
|
||
<h4><a name=pdo>PDO</a></h4>
|
||
|
||
<p><span style='mso-bookmark:pdo'>PDO, which only works with PHP5, accepts a
|
||
driver specific connection string: </span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:pdo'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn =& NewADConnection('pdo');</span></pre><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect('mysql:host=localhost',$user,$pwd,$mydb);</span></pre><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);</span></pre><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect("mysql:host=localhost;dbname=mydb;username=$user;password=$pwd");</span></pre></div>
|
||
|
||
<p><span style='mso-bookmark:pdo'>The DSN mechanism is also supported: </span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:pdo'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn =& NewADConnection("pdo_mysql://user:pwd@localhost/mydb?persist"); # persist is optional</span></pre></div>
|
||
|
||
<h4><span style='mso-bookmark:pdo'>PostgreSQL</span></h4>
|
||
|
||
<p><span style='mso-bookmark:pdo'>PostgreSQL 7 and 8 accepts connections using:
|
||
</span></p>
|
||
|
||
<p><span style='mso-bookmark:pdo'>a. the standard connection string:</span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = &ADONewConnection('postgres');<span style='mso-spacerun:yes'><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('host=localhost port=5432 dbname=mary');</span></pre></div>
|
||
|
||
<p><span style='mso-bookmark:pdo'>b. the classical 4 parameters:</span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('localhost','userid','password','database');<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span></span></pre></div>
|
||
|
||
<p><span style='mso-bookmark:pdo'>c. dsn: </span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:pdo'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'postgres://user:pwd@localhost/mydb?persist';<span style='mso-spacerun:yes'><EFBFBD> </span># persist is optional</span></pre><pre
|
||
style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for Connect/PConnect</span></pre></div>
|
||
|
||
<span style='mso-bookmark:pdo'></span>
|
||
|
||
<h4><a name=ldap></a>LDAP</h4>
|
||
|
||
<p>Here is an example of querying a LDAP server. Thanks to Josh Eldridge for
|
||
the driver and this example: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>require('/path/to/adodb.inc.php');</pre><pre><o:p> </o:p></pre><pre>/* Make sure to set this BEFORE calling Connect() */</pre><pre>$LDAP_CONNECT_OPTIONS = Array(</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_DEREF, "OPTION_VALUE"=>2),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_SIZELIMIT,"OPTION_VALUE"=>100),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_TIMELIMIT,"OPTION_VALUE"=>30),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,"OPTION_VALUE"=>3),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,"OPTION_VALUE"=>13),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_REFERRALS,"OPTION_VALUE"=>FALSE),</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Array ("OPTION_NAME"=>LDAP_OPT_RESTART,"OPTION_VALUE"=>FALSE)</pre><pre>);</pre><pre>$host = 'ldap.baylor.edu';</pre><pre>$ldapbase = 'ou=People,o=<st1:place
|
||
w:st="on"><st1:PlaceName w:st="on">Baylor</st1:PlaceName> <st1:PlaceType w:st="on">University</st1:PlaceType></st1:place>,c=US';</pre><pre><o:p> </o:p></pre><pre>$ldap = NewADOConnection( 'ldap' );</pre><pre>$ldap->Connect( $host, $user_name='', $password='', $ldapbase );</pre><pre><o:p> </o:p></pre><pre>echo "<pre>";</pre><pre><o:p> </o:p></pre><pre>print_r( $ldap->ServerInfo() );</pre><pre>$ldap->SetFetchMode(ADODB_FETCH_ASSOC);</pre><pre>$userName = 'eldridge';</pre><pre>$filter="(|(CN=$userName*)(sn=$userName*)(givenname=$userName*)(uid=$userName*))";</pre><pre><o:p> </o:p></pre><pre>$rs = $ldap->Execute( $filter );</pre><pre>if ($rs)</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>while ($arr = $rs->FetchRow()) {</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($arr);<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}</pre><pre><o:p> </o:p></pre><pre>$rs = $ldap->Execute( $filter );</pre><pre>if ($rs) </pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>while (!$rs->EOF) {</pre><pre> <span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs->fields);<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs->MoveNext();</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>} </pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre>print_r( $ldap->GetArray( $filter ) );</pre><pre>print_r( $ldap->GetRow( $filter ) );</pre><pre><o:p> </o:p></pre><pre>$ldap->Close();</pre><pre>echo "</pre>";</pre></div>
|
||
|
||
<p>Using DSN: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$dsn = "ldap://ldap.baylor.edu/ou=People,o=<st1:place
|
||
w:st="on"><st1:PlaceName w:st="on">Baylor</st1:PlaceName> <st1:PlaceType w:st="on">University</st1:PlaceType></st1:place>,c=US";</pre><pre>$db = NewADOConnection($dsn);</pre></div>
|
||
|
||
<h4>Interbase/Firebird</h4>
|
||
|
||
<p class=MsoNormal>You define the database in the $host parameter: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = &ADONewConnection('ibase'); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('localhost:c:\ibase\employee.gdb','sysdba','masterkey');</pre></div>
|
||
|
||
<p>Or dsn: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'firebird://user:pwd@localhost/mydb?persist&dialect=3';<span style='mso-spacerun:yes'><EFBFBD> </span># persist is optional<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for Connect/PConnect</pre></div>
|
||
|
||
<h4>SQLite</h4>
|
||
|
||
<p class=MsoNormal>Sqlite will create the database file if it does not exist. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = &ADONewConnection('sqlite');</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('c:\path\to\sqlite.db'); # sqlite will create if does not exist</pre></div>
|
||
|
||
<p>Or dsn: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$path = urlencode('c:\path\to\sqlite.db');</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = "sqlite://$path/?persist";<span style='mso-spacerun:yes'><EFBFBD> </span># persist is optional</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for Connect/PConnect</pre></div>
|
||
|
||
<h4>Oracle (oci8)</h4>
|
||
|
||
<p>With oci8, you can connect in multiple ways. Note that oci8 works fine with
|
||
newer versions of the Oracle, eg. 9i and 10g.</p>
|
||
|
||
<p>a. PHP and Oracle reside on the same machine, use default SID.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect(false, 'scott', 'tiger');</pre></div>
|
||
|
||
<p>b. TNS Name defined in tnsnames.ora (or ONAMES or HOSTNAMES), eg. 'myTNS'</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect(false, 'scott', 'tiger', 'myTNS');</pre></div>
|
||
|
||
<p>or</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->PConnect('myTNS', 'scott', 'tiger');</pre></div>
|
||
|
||
<p>c. Host Address and SID</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># with adodb 5.06 or 4.991 and later</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect('192.168.0.1', 'scott', 'tiger', "SID=$SID");</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># OR with all versions of ADOdb</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->connectSID = true;</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect('192.168.0.1', 'scott', 'tiger', $SID);</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre></div>
|
||
|
||
<p>d. Host Address and Service Name</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect('192.168.0.1', 'scott', 'tiger', 'servicename');</pre></div>
|
||
|
||
<p>e. Oracle connection string: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))<br>
|
||
<span style='mso-tab-count:3'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>(CONNECT_DATA=(SID=$sid)))";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect($cstr, 'scott', 'tiger');</pre></div>
|
||
|
||
<p>f. ADOdb dsn: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'oci8://user:pwd@tnsname/?persist';<span style='mso-spacerun:yes'><EFBFBD> </span># persist is optional<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'><EFBFBD> </span># no need for Connect/PConnect<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'oci8://user:pwd@host/sid';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'oci8://user:pwd@/';<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># oracle on local machine<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn = ADONewConnection($dsn);</pre></div>
|
||
|
||
<p>You can also set the charSet for Oracle 9.2 and later, supported since PHP
|
||
4.3.2, ADOdb 4.54: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->charSet = 'we8iso8859p1';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect(...);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># or<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = ADONewConnection($dsn);</pre></div>
|
||
|
||
<h4><a name=dsnless></a>DSN-less ODBC ( Access, MSSQL and DB2 examples)</h4>
|
||
|
||
<p>ODBC DSN's can be created in the ODBC control panel, or you can use a
|
||
DSN-less connection.To use DSN-less connections with ODBC you need PHP 4.3 or
|
||
later. </p>
|
||
|
||
<p>For Microsoft Access:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db =& ADONewConnection('access');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = <strong><span
|
||
style='font-family:"Courier New"'>"Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\\northwind.mdb;Uid=Admin;Pwd=;";</span></strong></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect($dsn);</pre></div>
|
||
|
||
<p class=MsoNormal>For Microsoft SQL Server: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db =& ADONewConnection('odbc_mssql');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = <strong><span
|
||
style='font-family:"Courier New"'>"Driver={SQL Server};Server=localhost;Database=northwind;"</span></strong>;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect($dsn,'userid','password');</pre></div>
|
||
|
||
<p class=MsoNormal>or if you prefer to use the mssql extension (which is
|
||
limited to mssql 6.5 functionality): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db =& ADONewConnection('mssql');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute('localhost', 'userid', 'password', 'northwind');</pre></div>
|
||
|
||
<p class=MsoNormal>For DB2: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dbms = 'db2'; # or 'odbc_db2' if db2 extension not available</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db =& ADONewConnection($dbms);</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;".</pre><pre><span
|
||
style='mso-tab-count:4'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>"uid=root; pwd=secret";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect($dsn);</pre></div>
|
||
|
||
<p class=MsoNormal><b>DSN-less Connections with <st1:City w:st="on">ADO</st1:City></b><br>
|
||
If you are using versions of PHP earlier than PHP 4.3.0, DSN-less connections
|
||
only work with Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>,
|
||
which is Microsoft's COM based API. An example using the ADOdb library and
|
||
Microsoft's <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>:
|
||
</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?php<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>include('adodb.inc.php'); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = &ADONewConnection("ado_mssql");<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print "<h1>Connecting DSN-less $db->databaseType...</h1>";<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>$myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>. "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;"<span style='mso-spacerun:yes'><EFBFBD> </span>;</b></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect($myDSN);</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $db->Execute("select * from table");</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$arr = $rs->GetArray();</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($arr);</pre><pre>?></pre></div>
|
||
|
||
<h2><a name=speed></a>High Speed ADOdb - tuning tips</h2>
|
||
|
||
<p>ADOdb is a big class library, yet it <a href="http://phplens.com/lens/adodb/">consistently
|
||
beats</a> all other PHP class libraries in performance. This is because it is
|
||
designed in a layered fashion, like an onion, with the fastest functions in the
|
||
innermost layer. Stick to the following functions for best performance:</p>
|
||
|
||
<div align=center>
|
||
|
||
<table class=MsoNormalTable border=1 cellpadding=0 width="40%"
|
||
style='width:40.0%;mso-cellspacing:1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=center style='text-align:center'><b>Innermost Layer</b></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p align=center style='text-align:center'>Connect, PConnect, NConnect<br>
|
||
Execute, CacheExecute<br>
|
||
SelectLimit, CacheSelectLimit<br>
|
||
MoveNext, Close <br>
|
||
qstr, Affected_Rows, Insert_ID</p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</div>
|
||
|
||
<p>The fastest way to access the field data is by accessing the array
|
||
$recordset->fields directly. Also set the global variables <a
|
||
href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a> = ADODB_FETCH_NUM, and (for
|
||
oci8, ibase/firebird and odbc) <a href="#adodb_countrecs">$ADODB_COUNTRECS</a>
|
||
= false before you connect to your database.</p>
|
||
|
||
<p>Consider using bind parameters if your database supports it, as it improves
|
||
query plan reuse. Use ADOdb's performance tuning system to identify bottlenecks
|
||
quickly. At the time of writing (Dec 2003), this means oci8 and odbc drivers.</p>
|
||
|
||
<p>Lastly make sure you have a PHP accelerator cache installed such as APC,
|
||
Turck MMCache, Zend Accelerator or ionCube.</p>
|
||
|
||
<p>Some examples:</p>
|
||
|
||
<div align=center>
|
||
|
||
<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Fastest data retrieval using PHP</b></p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Fastest data retrieval using ADOdb extension</b></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;
|
||
mso-border-alt:solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;
|
||
background:#EEEEEE'><pre style='background:#EEEEEE'>$rs =& $rs->Execute($sql);<br>
|
||
while (!$rs->EOF) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>var_dump($rs->fields);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs->MoveNext();<br>
|
||
}</pre></div>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;
|
||
mso-border-alt:solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;
|
||
background:#EEEEEE'><pre style='margin-bottom:12.0pt;background:#EEEEEE'>$rs =& $rs->Execute($sql);<br>
|
||
$array = adodb_getall($rs);<br>
|
||
var_dump($array);<br style='mso-special-character:line-break'>
|
||
<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
|
||
<![endif]></pre></div>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</div>
|
||
|
||
<p><b>Advanced Tips</b> </p>
|
||
|
||
<p>If you have the <a href="http://adodb.sourceforge.net/#extension">ADOdb C
|
||
extension</a> installed, you can replace your calls to $rs->MoveNext() with
|
||
adodb_movenext($rs). This doubles the speed of this operation. For retrieving
|
||
entire recordsets at once, use GetArray(), which uses the high speed extension
|
||
function adodb_getall($rs) internally. </p>
|
||
|
||
<p>Execute() is the default way to run queries. You can use the low-level
|
||
functions _Execute() and _query() to reduce query overhead. Both these
|
||
functions share the same parameters as Execute(). </p>
|
||
|
||
<p>If you do not have any bind parameters or your database supports binding
|
||
(without emulation), then you can call _Execute() directly. Calling this
|
||
function bypasses bind emulation. Debugging is still supported in _Execute(). </p>
|
||
|
||
<p>If you do not require debugging facilities nor emulated binding, and do not
|
||
require a recordset to be returned, then you can call _query. This is great for
|
||
inserts, updates and deletes. Calling this function bypasses emulated binding,
|
||
debugging, and recordset handling. Either the resultid, true or false are
|
||
returned by _query(). </p>
|
||
|
||
<p>For Informix, you can disable scrollable cursors with $db->cursorType =
|
||
0. </p>
|
||
|
||
<h2><a name=hack></a>Hacking ADOdb Safely</h2>
|
||
|
||
<p>You might want to modify ADOdb for your own purposes. Luckily you can still
|
||
maintain backward compatibility by sub-classing ADOdb and using the
|
||
$ADODB_NEWCONNECTION variable. $ADODB_NEWCONNECTION allows you to override the
|
||
behaviour of ADONewConnection(). ADOConnection() checks for this variable and
|
||
will call the function-name stored in this variable if it is defined. </p>
|
||
|
||
<p>In the following example, new functionality for the connection object is
|
||
placed in the <i>hack_mysql</i> and <i>hack_postgres7</i> classes. The
|
||
recordset class naming convention can be controlled using $rsPrefix. Here we
|
||
set it to 'hack_rs_', which will make ADOdb use <i>hack_rs_mysql</i> and <i>hack_rs_postgres7</i>
|
||
as the recordset classes. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>class hack_mysql extends adodb_mysql {<br>
|
||
var $rsPrefix = 'hack_rs_';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>/* Your mods here */<br>
|
||
}<br>
|
||
<br>
|
||
class hack_rs_mysql extends ADORecordSet_mysql {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD></span>/* Your mods here */<br>
|
||
}<br>
|
||
<br>
|
||
class hack_postgres7 extends adodb_postgres7 {<br>
|
||
var $rsPrefix = 'hack_rs_';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>/* Your mods here */<br>
|
||
}<br>
|
||
<br>
|
||
class hack_rs_postgres7 extends ADORecordSet_postgres7 {<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>/* Your mods here */<br>
|
||
}<br>
|
||
<br>
|
||
$ADODB_NEWCONNECTION = 'hack_factory';<br>
|
||
<br>
|
||
function& hack_factory($driver)<br>
|
||
{<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>if ($driver !== 'mysql' && $driver !== 'postgres7') return false;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$driver = 'hack_'.$driver;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$obj = new $driver();<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>return $obj;<br>
|
||
}<br>
|
||
<br>
|
||
include_once('adodb.inc.php');</pre></div>
|
||
|
||
<p>Don't forget to call the constructor of the parent class in your
|
||
constructor. If you want to use the default ADOdb drivers return false in the
|
||
above hack_factory() function. Also you can define your own
|
||
ADORecordSet_empty() class, by defining a class $$this->rsPrefix.'empty'
|
||
since 4.96/5.02. <a name=php5></a></p>
|
||
|
||
<h2>PHP5 Features</h2>
|
||
|
||
<p class=MsoNormal>ADOdb 4.02 or later will transparently determine which
|
||
version of PHP you are using. If PHP5 is detected, the following features become
|
||
available: </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt;
|
||
mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><b>PDO</b>: PDO drivers
|
||
are available. See the <a href="#pdo">connection examples</a>. Currently
|
||
PDO drivers are not as powerful as native drivers, and should be treated
|
||
as experimental.<a name=php5iterators></a></li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><b>Foreach iterators</b>:
|
||
This is a very natural way of going through a recordset: </li>
|
||
</ul>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE;
|
||
margin-left:36.0pt;margin-right:0cm'><pre style='background:#EEEEEE'><span
|
||
style='mso-tab-count:1'><EFBFBD> </span>$ADODB_FETCH_MODE = ADODB_FETCH_NUM;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>$rs = $db->Execute($sql);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>foreach($rs as $k => $row) {<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo "r1=".$row[0]." r2=".$row[1]."<br>";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>}</pre></div>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l11 level1 lfo5;tab-stops:list 36.0pt'><a name=php5exceptions></a><b>Exceptions</b>:
|
||
Just include <i>adodb-exceptions.inc.php</i> and you can now catch
|
||
exceptions on errors as they occur. </li>
|
||
</ul>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE;
|
||
margin-left:36.0pt;margin-right:0cm'><pre style='background:#EEEEEE'><span
|
||
style='mso-tab-count:1'><EFBFBD> </span><b>include("../adodb-exceptions.inc.php");</b> <br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>include("../adodb.inc.php");<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span> <br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>try { <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = NewADOConnection("oci8"); <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect('','scott','bad-password'); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>} catch (exception $e) { <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>var_dump($e); <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>adodb_backtrace($e->gettrace());<br>
|
||
<span style='mso-tab-count:1'><EFBFBD> </span>} </pre></div>
|
||
|
||
<p style='margin-left:36.0pt'>Note that reaching EOF is <b>not</b> considered
|
||
an error nor an exception. </p>
|
||
|
||
<h3><a name=drivers></a>Databases Supported</h3>
|
||
|
||
<p class=MsoNormal>The <i>name</i> below is the value you pass to
|
||
NewADOConnection($name) to create a connection object for that database. </p>
|
||
|
||
<table class=MsoNormalTable border=1 cellpadding=0 width="100%"
|
||
style='width:100.0%;mso-cellspacing:1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Name</b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Tested</b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Database</b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>RecordCount() usable</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Prerequisites</b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b>Operating Systems</b></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>access</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Access/Jet. You
|
||
need to create an ODBC DSN.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>ODBC </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>ado</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>Generic <st1:City w:st="on"><st1:place
|
||
w:st="on">ADO</st1:place></st1:City>, not tuned for specific databases.
|
||
Allows DSN-less connections. For best performance, use an OLEDB provider.
|
||
This is the base class for all ado drivers.</span></p>
|
||
<p><span style='font-size:10.0pt'>You can set $db->codePage before
|
||
connecting.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>? depends on database</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span
|
||
style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span
|
||
style='font-size:10.0pt'> or OLEDB provider</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:3'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>ado_access</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Access/Jet using <st1:City
|
||
w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>. Allows DSN-less
|
||
connections. For best performance, use an OLEDB provider.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span
|
||
style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span
|
||
style='font-size:10.0pt'> or OLEDB provider</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:4'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>ado_mssql</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Microsoft SQL Server using <st1:City
|
||
w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>. Allows DSN-less
|
||
connections. For best performance, use an OLEDB provider.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><st1:City w:st="on"><st1:place w:st="on"><span
|
||
style='font-size:10.0pt'>ADO</span></st1:place></st1:City><span
|
||
style='font-size:10.0pt'> or OLEDB provider</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:5;height:40.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>db2</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Uses PHP's db2-specific
|
||
extension for better performance.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>DB2 CLI/ODBC interface</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows. Requires IBM DB2
|
||
Universal Database client.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:6;height:40.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_db2</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Connects to DB2 using
|
||
generic ODBC extension.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>DB2 CLI/ODBC interface</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows. <a
|
||
href="http://www.faqts.com/knowledge_base/view.phtml/aid/6283/fid/14">Unix
|
||
install hints</a>. I have had reports that the $host and $database params
|
||
have to be reversed in Connect() when using the CLI interface.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:7'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>vfp</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Microsoft Visual FoxPro.
|
||
You need to create an ODBC DSN.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Windows only</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:8'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>fbsql</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>FrontBase. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:9'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>ibase</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Interbase 6 or earlier.
|
||
Some users report you might need to use this<br>
|
||
$db->PConnect('localhost:c:/ibase/employee.gdb', "sysdba",
|
||
"masterkey") to connect. Lacks Affected_Rows currently.<br>
|
||
<br>
|
||
You can set $db->role, $db->dialect, $db->buffers and
|
||
$db->charSet before connecting.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:10'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><i><span style='font-size:10.0pt'>firebird</span></i></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Firebird version of
|
||
interbase.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:11'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><i><span style='font-size:10.0pt'>borland_ibase</span></i></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Borland version of
|
||
Interbase 6.5 or later. Very sad that the forks differ.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Interbase client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:12'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>informix</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Generic informix driver.
|
||
Use this if you are using Informix 7.3 or later.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Informix client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:13'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>informix72</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Informix databases before
|
||
Informix 7.3 that do no support SELECT FIRST.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Informix client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:14'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>ldap</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>LDAP driver. See this
|
||
example for usage information.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal> </p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>LDAP extension</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:15;height:54.75pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>mssql</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Microsoft SQL Server 7 and later. Works
|
||
with Microsoft SQL Server 2000 also. Note that date formating is problematic
|
||
with this driver. For example, the PHP mssql extension does not return the
|
||
seconds for datetime!</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Mssql client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows. <br>
|
||
<a href="http://phpbuilder.com/columns/alberto20000919.php3">Unix install
|
||
howto</a> and <a
|
||
href="http://linuxjournal.com/article.php?sid=6636&mode=thread&order=0">another
|
||
one</a>. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:16;height:54.75pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>mssqlpo</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Portable mssql driver. Identical to above mssql
|
||
driver, except that '||', the concatenation operator, is converted to '+'.
|
||
Useful for porting scripts from most other sql variants that use ||.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Mssql client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows. <a
|
||
href="http://phpbuilder.com/columns/alberto20000919.php3"><br>
|
||
Unix install howto</a>.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:17;height:54.75pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>mssqlnative</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Native mssql driver from M'soft. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:54.75pt'>
|
||
<p><span style='font-size:10.0pt'>Windows. Tq Garrett Serack of M'soft.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:18'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><o:p> </o:p></p>
|
||
</td>
|
||
<td style='border:none;padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p> </o:p></span></p>
|
||
</td>
|
||
<td style='border:none;padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p> </o:p></span></p>
|
||
</td>
|
||
<td style='border:none;padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p> </o:p></span></p>
|
||
</td>
|
||
<td style='border:none;padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p> </o:p></span></p>
|
||
</td>
|
||
<td style='border:none;padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt;color:windowtext'><o:p> </o:p></span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:19'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>mysql</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>MySQL without transaction
|
||
support. You can also set $db->clientFlags before connecting.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>MySQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:20'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>mysqlt</span></b><span
|
||
style='font-size:10.0pt'> or <b>maxsql</b></span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>MySQL with transaction support. We
|
||
recommend using || as the concat operator for best portability. This can be
|
||
done by running MySQL using: <br>
|
||
<i>mysqld --ansi</i> or <i>mysqld --sql-mode=PIPES_AS_CONCAT</i></span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>MySQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:21'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>oci8</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle 8/9. Has more
|
||
functionality than <i>oracle</i> driver (eg. Affected_Rows). You might have
|
||
to putenv('ORACLE_HOME=...') before Connect/PConnect. </span></p>
|
||
<p><span style='font-size:10.0pt'>There are 2 ways of connecting - with
|
||
server IP and service name: <br>
|
||
<i>PConnect('serverip:1521','scott','tiger','service'</i>)<br>
|
||
or using an entry in TNSNAMES.ORA or ONAMES or HOSTNAMES: <br>
|
||
<i>PConnect(false, 'scott', 'tiger', $oraname)</i>. </span></p>
|
||
<p><span style='font-size:10.0pt'>Since 2.31, we support Oracle REF cursor
|
||
variables directly (see <a href="#executecursor">ExecuteCursor</a>).</span> </p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:22'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>oci805</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Supports reduced Oracle
|
||
functionality for Oracle 8.0.5. SelectLimit is not as efficient as in the
|
||
oci8 or oci8po drivers.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:23'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>oci8po</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle 8/9 portable driver.
|
||
This is nearly identical with the oci8 driver except (a) bind variables in
|
||
Prepare() use the ? convention, instead of :bindvar, (b) field names use the
|
||
more common PHP convention of lowercase names. </span></p>
|
||
<p><span style='font-size:10.0pt'>Use this driver if porting from other
|
||
databases is important. Otherwise the oci8 driver offers better performance. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:24'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbc</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Generic ODBC, not tuned for
|
||
specific databases. To connect, use <br>
|
||
PConnect('DSN','user','pwd'). This is the base class for all odbc derived
|
||
drivers.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>? depends on database</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. <a
|
||
href="http://phpbuilder.com/columns/alberto20000919.php3?page=4">Unix hints.</a></span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:25'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_mssql</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Uses ODBC to connect to
|
||
MSSQL</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:26'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbc_oracle</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Uses ODBC to connect to
|
||
Oracle</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>ODBC</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:27'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbtp</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Generic odbtp driver. <a
|
||
href="http://odbtp.sourceforge.net/">Odbtp</a> is a software for accessing
|
||
Windows ODBC data sources from other operating systems.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>odbtp</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:28'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>odbtp_unicode</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Odtbp with unicode support</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>odbtp</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:29;height:25.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>oracle</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Implements old Oracle 7
|
||
client API. Use oci8 driver if possible for better performance.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Oracle client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:30;height:25.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>netezza</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Netezza driver. Netezza is
|
||
based on postgres code-base.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:25.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:31'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>pdo</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Generic PDO driver for
|
||
PHP5. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PDO extension and database
|
||
specific drivers</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:32'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>postgres</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Generic PostgreSQL driver.
|
||
Currently identical to postgres7 driver.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:33'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>postgres64</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>For PostgreSQL 6.4 and
|
||
earlier which does not support LIMIT internally.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:34'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>postgres7</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL which supports
|
||
LIMIT and other version 7 functionality.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:35'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>postgres8</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>A</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL which supports
|
||
version 8 functionality.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>PostgreSQL client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Unix and Windows. </span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:36'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sapdb</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>SAP DB. Should work
|
||
reliably as based on ODBC driver.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>SAP ODBC client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:37'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sqlanywhere</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Sybase SQL Anywhere. Should
|
||
work reliably as based on ODBC driver.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>SQL Anywhere ODBC client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>?</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:38;height:40.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sqlite</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>SQLite.</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>-</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:39;height:40.5pt'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sqlitepo</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>B</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Portable SQLite driver. This
|
||
is because assoc mode does not work like other drivers in sqlite. Namely,
|
||
when selecting (joining) multiple tables, the table names are included in the
|
||
assoc keys in the "sqlite" driver.</span></p>
|
||
<p><span style='font-size:10.0pt'>In "sqlitepo" driver, the table
|
||
names are stripped from the returned column names. When this results in a
|
||
conflict, the first field get preference. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>-</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt;height:40.5pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:40'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sybase</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Sybase. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Sybase client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows.</span></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:41;mso-yfti-lastrow:yes'>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><b><span style='font-size:10.0pt'>sybase_ase</span></b></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>C</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Sybase ASE. </span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Y/N</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Sybase client</span></p>
|
||
</td>
|
||
<td valign=top style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p><span style='font-size:10.0pt'>Unix and Windows.</span></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<p>The "Tested" column indicates how extensively the code has been
|
||
tested and used. <br>
|
||
A = well tested and used by many people<br>
|
||
B = tested and usable, but some features might not be implemented<br>
|
||
C = user contributed or experimental driver. Might not fully support all of the
|
||
latest features of ADOdb. </p>
|
||
|
||
<p>The column "RecordCount() usable" indicates whether RecordCount()
|
||
return the number of rows, or returns -1 when a SELECT statement is executed.
|
||
If this column displays Y/N then the RecordCount() is emulated when the global
|
||
variable $ADODB_COUNTRECS=true (this is the default). Note that for large
|
||
recordsets, it might be better to disable RecordCount() emulation because
|
||
substantial amounts of memory are required to cache the recordset for counting.
|
||
Also there is a speed penalty of 40-50% if emulation is required. This is
|
||
emulated in most databases except for PostgreSQL and MySQL. This variable is
|
||
checked every time a query is executed, so you can selectively choose which
|
||
recordsets to count.</p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h1>Tutorials<a name=quickstart></a></h1>
|
||
|
||
<h3>Example 1: Select Statement<a name=ex1></a></h3>
|
||
|
||
<p>Task: Connect to the Access Northwind DSN, display the first 2 columns of
|
||
each row.</p>
|
||
|
||
<p>In this example, we create a ADOConnection object, which represents the
|
||
connection to the database. The connection is initiated with <a href="#pconnect"><span
|
||
style='font-family:"Courier New"'>PConnect</span></a>, which is a persistent
|
||
connection. Whenever we want to query the database, we call the <span
|
||
style='font-family:"Courier New"'>ADOConnection.<a href="#execute">Execute</a>()</span>
|
||
function. This returns an ADORecordSet object which is actually a cursor that
|
||
holds the current row in the array <span style='font-family:"Courier New"'>fields[]</span>.
|
||
We use <span style='font-family:"Courier New"'><a href="#movenext">MoveNext</a>()</span>
|
||
to move from row to row.</p>
|
||
|
||
<p>NB: A useful function that is not used in this example is <span
|
||
style='font-family:"Courier New"'><a href="#selectlimit">SelectLimit</a></span>,
|
||
which allows us to limit the number of rows shown. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?<br>
|
||
<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># load code common to ADOdb<br>
|
||
$<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># create a connection<br>
|
||
$<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># connect to MS-Access, northwind DSN<br>
|
||
$<span style='color:#660000'>recordSet</span> = &$<span style='color:#660000'>conn</span>->Execute('select * from products');<br>
|
||
if (!$<span style='color:#660000'>recordSet</span>) <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print $<span style='color:#660000'>conn</span>->ErrorMsg();<br>
|
||
else<br>
|
||
<b>while</b> (!$<span style='color:#660000'>recordSet</span>->EOF) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>print</b> $<span
|
||
style='color:#660000'>recordSet</span>->fields[0].' '.$<span
|
||
style='color:#660000'>recordSet</span>->fields[1].'<BR>';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$<span style='color:#660000'>recordSet</span>->MoveNext();<br>
|
||
}</pre><pre><o:p> </o:p></pre><pre>$<span style='color:#660000'>recordSet</span>->Close(); # optional<br>
|
||
$<span style='color:#660000'>conn</span>->Close(); # optional<br
|
||
style='mso-special-character:line-break'>
|
||
<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
|
||
<![endif]></pre><pre>?></pre></div>
|
||
|
||
<p>The $<span style='font-family:"Courier New"'>recordSet</span> returned
|
||
stores the current row in the <span style='font-family:"Courier New"'>$recordSet->fields</span>
|
||
array, indexed by column number (starting from zero). We use the <span
|
||
style='font-family:"Courier New"'><a href="#movenext">MoveNext</a>()</span>
|
||
function to move to the next row. The <span style='font-family:"Courier New"'>EOF</span>
|
||
property is set to true when end-of-file is reached. If an error occurs in
|
||
Execute(), we return false instead of a recordset.</p>
|
||
|
||
<p>The <code><span style='font-size:10.0pt'>$recordSet->fields[]</span></code>
|
||
array is generated by the PHP database extension. Some database extensions only
|
||
index by number and do not index the array by field name. To force indexing by
|
||
name - that is associative arrays - use the SetFetchMode function. Each
|
||
recordset saves and uses whatever fetch mode was set when the recordset was
|
||
created in Execute() or SelectLimit(). </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->SetFetchMode(ADODB_FETCH_NUM);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs1 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->SetFetchMode(ADODB_FETCH_ASSOC);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs2 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs2->fields); # shows <i>array(['col1']=>'v0',['col2'] =>'v1')</i></pre></div>
|
||
|
||
<p>To get the number of rows in the select statement, you can use <span
|
||
style='font-family:"Courier New"'>$recordSet-><a href="#recordcount">RecordCount</a>()</span>.
|
||
Note that it can return -1 if the number of rows returned cannot be determined.</p>
|
||
|
||
<h3>Example 2: Advanced Select with Field Objects<a name=ex2></a></h3>
|
||
|
||
<p>Select a table, display the first two columns. If the second column is a
|
||
date or timestamp, reformat the date to <st1:country-region w:st="on"><st1:place
|
||
w:st="on">US</st1:place></st1:country-region> format.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?<br>
|
||
<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># load code common to ADOdb<br>
|
||
$<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># create a connection<br>
|
||
$<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># connect to MS-Access, northwind dsn<br>
|
||
$<span style='color:#660000'>recordSet</span> = &$<span style='color:#660000'>conn</span>->Execute('select CustomerID,OrderDate from Orders');<br>
|
||
if (!$<span style='color:#660000'>recordSet</span>) <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print $<span style='color:#660000'>conn</span>->ErrorMsg();<br>
|
||
else<br>
|
||
<b>while</b> (!$<span style='color:#660000'>recordSet</span>->EOF) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$<span style='color:#660000'>fld</span> = <b><span
|
||
style='color:#336600'>$</span></b><span style='color:#660000'>recordSet</span><b><span
|
||
style='color:#336600'>->FetchField</span></b><span style='color:#006600'>(</span>1<span
|
||
style='color:#006600'>);</span></pre><pre><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$<span
|
||
style='color:#660000'>type</span> = <b><span style='color:#336600'>$</span></b><span
|
||
style='color:#660000'>recordSet</span><b><span style='color:#336600'>->MetaType</span></b>($fld->type);<br>
|
||
<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>if</b> ( $<span
|
||
style='color:#660000'>type</span> == 'D' || $<span style='color:#660000'>type</span> == 'T') <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>print</b> $<span
|
||
style='color:#660000'>recordSet</span>->fields[0].' '.<br>
|
||
<span style='mso-tab-count:3'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b><span
|
||
style='color:#336600'>$</span></b><span style='color:#660000'>recordSet</span><b><span
|
||
style='color:#336600'>->UserDate</span></b>($<span style='color:#660000'>recordSet</span>->fields[1],'<b>m/d/Y</b>').'<BR>';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>else </b></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>print</b> $<span
|
||
style='color:#660000'>recordSet</span>->fields[0].' '.$<span
|
||
style='color:#660000'>recordSet</span>->fields[1].'<BR>';<br>
|
||
<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$<span style='color:#660000'>recordSet</span>->MoveNext();<br>
|
||
}</pre><pre>$<span style='color:#660000'>recordSet</span>->Close(); # optional<br>
|
||
$<span style='color:#660000'>conn</span>->Close(); # optional<br
|
||
style='mso-special-character:line-break'>
|
||
<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
|
||
<![endif]></pre><pre>?></pre></div>
|
||
|
||
<p>In this example, we check the field type of the second column using <span
|
||
style='font-family:"Courier New"'><a href="#fetchfield">FetchField</a>().</span>
|
||
This returns an object with at least 3 fields.</p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>name</b>: name of column</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>type</b>: native field
|
||
type of column</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l6 level1 lfo6;tab-stops:list 36.0pt'><b>max_length</b>: maximum
|
||
length of field. Some databases such as MySQL do not return the maximum
|
||
length of the field correctly. In these cases max_length will be set to
|
||
-1.</li>
|
||
</ul>
|
||
|
||
<p>We then use <span style='font-family:"Courier New"'><a href="#metatype">MetaType</a>()</span>
|
||
to translate the native type to a <i>generic</i> type. Currently the following <i>generic</i>
|
||
types are defined:</p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>C</b>: character fields
|
||
that should be shown in a <input type="text"> tag.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>X</b>: TeXt, large text
|
||
fields that should be shown in a <textarea></li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>B</b>: Blobs, or Binary
|
||
Large Objects. Typically images. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>D</b>: Date field</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>T</b>: Timestamp field</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>L</b>: Logical field
|
||
(boolean or bit-field)</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>I</b>: Integer
|
||
field</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>N</b>: Numeric field.
|
||
Includes autoincrement, numeric, floating point, real and integer. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l0 level1 lfo7;tab-stops:list 36.0pt'><b>R</b>: Serial field.
|
||
Includes serial, autoincrement integers. This works for selected
|
||
databases. </li>
|
||
</ul>
|
||
|
||
<p>If the metatype is of type date or timestamp, then we print it using the
|
||
user defined date format with <span style='font-family:"Courier New"'><a
|
||
href="#userdate">UserDate</a>(),</span> which converts the PHP SQL date string
|
||
format to a user defined one. Another use for <span style='font-family:"Courier New"'><a
|
||
href="#metatype">MetaType</a>()</span> is data validation before doing an SQL
|
||
insert or update.</p>
|
||
|
||
<h3>Example 3: Inserting<a name=ex3></a></h3>
|
||
|
||
<p>Insert a row to the Orders table containing dates and strings that need to
|
||
be quoted before they can be accepted by the database, eg: the single-quote in
|
||
the word <i>John's</i>.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><?<br>
|
||
<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># load code common to ADOdb<br>
|
||
$<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># create a connection<br>
|
||
<br>
|
||
$<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># connect to MS-Access, northwind dsn<br>
|
||
$<span style='color:#660000'>shipto</span> = <b><span style='color:#006600'>$conn->qstr</span></b>("<i>John's Old Shoppe</i>");<br>
|
||
<br>
|
||
$<span style='color:#660000'>sql</span> = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";<br>
|
||
$<span style='color:#660000'>sql</span> .= "values ('ANATR',2,".<b><span
|
||
style='color:#006600'>$conn->DBDate(</span>time()</b><b><span
|
||
style='color:#006600'>)</span></b><span style='color:#006600'>.</span>",$<span
|
||
style='color:#660000'>shipto</span>)";<br>
|
||
<br>
|
||
<b>if</b> ($<span style='color:#660000'>conn</span>->Execute($<span
|
||
style='color:#660000'>sql</span>) <b><span style='color:#336600'>=== false</span></b>) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>print</b> 'error inserting: '.<b><span
|
||
style='color:#336600'>$conn->ErrorMsg()</span></b>.'<BR>';<br>
|
||
}<br>
|
||
?></pre></div>
|
||
|
||
<p>In this example, we see the advanced date and quote handling facilities of
|
||
ADOdb. The unix timestamp (which is a long integer) is appropriately formated
|
||
for Access with <span style='font-family:"Courier New"'><a href="#dbdate">DBDate</a>()</span>,
|
||
and the right escape character is used for quoting the <i>John's Old Shoppe</i>,
|
||
which is<b> </b><i>John'<b>'</b>s Old Shoppe</i> and not PHP's default <i>John<b>'</b>s
|
||
Old Shoppe</i> with <span style='font-family:"Courier New"'><a href="#qstr">qstr</a>()</span>.
|
||
</p>
|
||
|
||
<p>Observe the error-handling of the Execute statement. False is returned by<span
|
||
style='font-family:"Courier New"'> <a href="#execute">Execute</a>() </span>if
|
||
an error occured. The error message for the last error that occurred is
|
||
displayed in <span style='font-family:"Courier New"'><a href="#errormsg">ErrorMsg</a>()</span>.
|
||
Note: <i>php_track_errors</i> might have to be enabled for error messages to be
|
||
saved.</p>
|
||
|
||
<h3>Example 4: Debugging<a name=ex4></a></h3>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?<br>
|
||
<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># load code common to ADOdb<br>
|
||
$<span style='color:#663300'>conn</span> = &ADONewConnection('access');<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># create a connection<br>
|
||
$<span style='color:#663300'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># connect to MS-Access, northwind dsn<br>
|
||
$<span style='color:#663300'>shipto</span> = <b>$conn->qstr</b>("John's Old Shoppe");<br>
|
||
$<span style='color:#663300'>sql</span> = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";<br>
|
||
$<span style='color:#663300'>sql</span> .= "values ('ANATR',2,".$<span
|
||
style='color:#663300'>conn</span>->FormatDate(time()).",$shipto)";<br>
|
||
<b><span style='color:#336600'>$</span></b><b><span style='color:#663300'>conn</span></b><b><span
|
||
style='color:#336600'>->debug = true;</span></b></pre><pre><b>if</b> ($<span
|
||
style='color:#663300'>conn</span>->Execute($sql) <b>=== false</b>) <b>print</b> 'error inserting';</pre><pre>?></pre></div>
|
||
|
||
<p>In the above example, we have turned on debugging by setting <b>debug = true</b>.
|
||
This will display the SQL statement before execution, and also show any error
|
||
messages. There is no need to call <span style='font-family:"Courier New"'><a
|
||
href="#errormsg">ErrorMsg</a>()</span> in this case. For displaying the
|
||
recordset, see the <span style='font-family:"Courier New"'><a href="#exrs2html">rs2html</a>()
|
||
</span>example.</p>
|
||
|
||
<p>Also see the section on <a href="#errorhandling">Custom Error Handlers</a>.</p>
|
||
|
||
<h3>Example 5: MySQL and Menus<a name=ex5></a></h3>
|
||
|
||
<p>Connect to MySQL database <i>agora</i>, and generate a <select> menu
|
||
from an SQL statement where the <option> captions are in the 1st column,
|
||
and the value to send back to the server is in the 2nd column.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><?<br>
|
||
<b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>
|
||
$<span style='color:#663300'>conn</span> = &ADONewConnection('mysql');<span style='mso-spacerun:yes'><EFBFBD> </span># create a connection<br>
|
||
$<span style='color:#663300'>conn</span>->PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br>
|
||
$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers';<br>
|
||
$<span style='color:#663300'>rs</span> = $<span style='color:#663300'>conn</span>->Execute($sql);<br>
|
||
<b>print</b> <b><span style='color:#336600'>$</span></b><b><span
|
||
style='color:#663300'>rs</span></b><b><span style='color:#336600'>->GetMenu('GetCust','Mary Rosli');<br>
|
||
?></span></b></pre></div>
|
||
|
||
<p>Here we define a menu named GetCust, with the menu option 'Mary Rosli'
|
||
selected. See <a href="#getmenu"><span style='font-family:"Courier New"'>GetMenu</span></a><span
|
||
style='font-family:"Courier New"'>()</span>. We also have functions that return
|
||
the recordset as an array: <span style='font-family:"Courier New"'><a
|
||
href="#getarray">GetArray</a>()</span>, and as an associative array with the
|
||
key being the first column: <a href="#getassoc1">GetAssoc</a>().</p>
|
||
|
||
<h3>Example 6: Connecting to 2 Databases At Once<a name=ex6></a></h3>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><?<br>
|
||
<b>include</b>('adodb.inc.php');<span style='mso-tab-count:1'> </span> # load code common to ADOdb<br>
|
||
$<span style='color:#663300'>conn1</span> = &ADONewConnection('mysql');<span style='mso-spacerun:yes'><EFBFBD> </span># create a mysql connection<br>
|
||
$<span style='color:#663300'>conn2</span> = &ADONewConnection('oracle');<span style='mso-spacerun:yes'><EFBFBD> </span># create a oracle connection<br>
|
||
<br>
|
||
$conn1->PConnect($server, $userid, $password, $database);<br>
|
||
$conn2->PConnect(false, $ora_userid, $ora_pwd, $oraname);<br>
|
||
<br>
|
||
$conn1->Execute('insert ...');<br>
|
||
$conn2->Execute('update ...');<br>
|
||
?></pre></div>
|
||
|
||
<h3>Example 7: Generating Update and Insert SQL<a name=ex7></a></h3>
|
||
|
||
<p>Since ADOdb 4.56, we support <a
|
||
href="reference.functions.getupdatesql.html#autoexecute">AutoExecute()</a>,
|
||
which simplifies things by providing an advanced wrapper for GetInsertSQL() and
|
||
GetUpdateSQL(). For example, an INSERT can be carried out with: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>$record["firstname"] = "Bob"; </pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>$record["lastname"] = "Smith"; </pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>$record["created"] = time(); </pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>$insertSQL = $conn->AutoExecute($rs, $record, 'INSERT'); </pre></div>
|
||
|
||
<p class=MsoNormal>and an UPDATE with: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>$record["firstname"] = "Caroline"; </pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith </pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>$insertSQL = $conn->AutoExecute($rs, $record, 'UPDATE', 'id = 1'); </pre></div>
|
||
|
||
<p>The rest of this section is out-of-date: </p>
|
||
|
||
<p>ADOdb 1.31 and later supports two new recordset functions: GetUpdateSQL( )
|
||
and GetInsertSQL( ). This allow you to perform a "SELECT * FROM table
|
||
query WHERE...", make a copy of the $rs->fields, modify the fields, and
|
||
then generate the SQL to update or insert into the table automatically. </p>
|
||
|
||
<p>We show how the functions can be used when accessing a table with the
|
||
following fields: (ID, FirstName, LastName, Created). </p>
|
||
|
||
<p>Before these functions can be called, you need to initialize the recordset by
|
||
performing a select on the table. Idea and code by Jonathan Younger
|
||
jyounger#unilab.com. Since ADOdb 2.42, you can pass a table name instead of a
|
||
recordset into GetInsertSQL (in $rs), and it will generate an insert statement
|
||
for that table. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><?<br>
|
||
#==============================================<br>
|
||
# SAMPLE GetUpdateSQL() and GetInsertSQL() code<br>
|
||
#==============================================<br>
|
||
include('adodb.inc.php');<br>
|
||
include('tohtml.inc.php');<br>
|
||
<br>
|
||
#==========================<br>
|
||
# This code tests an insert<br>
|
||
<br>
|
||
$sql = "SELECT * FROM ADOXYZ WHERE id = -1"; <br>
|
||
# Select an empty record from the database<br>
|
||
<br>
|
||
$conn = &ADONewConnection("mysql");<span style='mso-spacerun:yes'><EFBFBD> </span># create a connection<br>
|
||
$conn->debug=1;<br>
|
||
$conn->PConnect("localhost", "admin", "", "test"); # connect to MySQL, testdb<br>
|
||
$rs = $conn->Execute($sql); # Execute the query and get the empty recordset<br>
|
||
<br>
|
||
$record = array(); # Initialize an array to hold the record data to insert<br>
|
||
<br>
|
||
# Set the values for the fields in the record<br>
|
||
# Note that field names are case-insensitive<br>
|
||
$record["firstname"] = "Bob";<br>
|
||
$record["lastNamE"] = "Smith";<br>
|
||
$record["creaTed"] = time();<br>
|
||
<br>
|
||
# Pass the empty recordset and the array containing the data to insert<br>
|
||
# into the GetInsertSQL function. The function will process the data and return<br>
|
||
# a fully formatted insert sql statement.<br>
|
||
$insertSQL = $conn->GetInsertSQL($rs, $record);<br>
|
||
<br>
|
||
$conn->Execute($insertSQL); # Insert the record into the database<br>
|
||
<br>
|
||
#==========================<br>
|
||
# This code tests an update<br>
|
||
<br>
|
||
$sql = "SELECT * FROM ADOXYZ WHERE id = 1"; <br>
|
||
# Select a record to update<br>
|
||
<br>
|
||
$rs = $conn->Execute($sql); # Execute the query and get the existing record to update<br>
|
||
<br>
|
||
$record = array(); # Initialize an array to hold the record data to update<br>
|
||
<br>
|
||
# Set the values for the fields in the record<br>
|
||
# Note that field names are case-insensitive<br>
|
||
$record["firstname"] = "Caroline";<br>
|
||
$record["LasTnAme"] = "Smith"; # Update Caroline's lastname from Miranda to Smith<br>
|
||
<br>
|
||
# Pass the single record recordset and the array containing the data to update<br>
|
||
# into the GetUpdateSQL function. The function will process the data and return<br>
|
||
# a fully formatted update sql statement with the correct WHERE clause.<br>
|
||
# If the data has not changed, no recordset is returned<br>
|
||
$updateSQL = $conn->GetUpdateSQL($rs, $record);<br>
|
||
<br>
|
||
$conn->Execute($updateSQL); # Update the record in the database<br>
|
||
$conn->Close();<br>
|
||
?></pre></div>
|
||
|
||
<p class=MsoNormal><a name="ADODB_FORCE_TYPE"></a><b>$ADODB_FORCE_TYPE</b></p>
|
||
|
||
<p>The behaviour of AutoExecute(), GetUpdateSQL() and GetInsertSQL() when
|
||
converting empty or null PHP variables to SQL is controlled by the global
|
||
$ADODB_FORCE_TYPE variable. Set it to one of the values below. Default is
|
||
ADODB_FORCE_VALUE (3): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>0 = ignore empty fields. All empty fields in array are ignored.<br>
|
||
1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.<br>
|
||
2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.<br>
|
||
3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>empty fields '' are set to empty '' sql values.<br>
|
||
<br>
|
||
define('ADODB_FORCE_IGNORE',0);<br>
|
||
define('ADODB_FORCE_NULL',1);<br>
|
||
define('ADODB_FORCE_EMPTY',2);<br>
|
||
define('ADODB_FORCE_VALUE',3);</pre></div>
|
||
|
||
<p>Thanks to Niko (nuko#mbnet.fi) for the $ADODB_FORCE_TYPE code. </p>
|
||
|
||
<p>Note: the constant ADODB_FORCE_NULLS is obsolete since 4.52 and is ignored.
|
||
Set $ADODB_FORCE_TYPE = ADODB_FORCE_NULL for equivalent behaviour. </p>
|
||
|
||
<p>Since 4.62, the table name to be used can be overridden by setting
|
||
$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is
|
||
called. </p>
|
||
|
||
<h3>Example 8: Implementing Scrolling with Next and Previous<a name=ex8></a></h3>
|
||
|
||
<p>The following code creates a very simple recordset pager, where you can
|
||
scroll from page to page of a recordset.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>include_once('../adodb.inc.php');<br>
|
||
include_once('../adodb-pager.inc.php');<br>
|
||
session_start();<br>
|
||
<br>
|
||
$db = NewADOConnection('mysql');<br>
|
||
<br>
|
||
$db->Connect('localhost','root','','xphplens');<br>
|
||
<br>
|
||
$sql = "select * from adoxyz ";<br>
|
||
<br>
|
||
$pager = new ADODB_Pager($db,$sql);<br>
|
||
$pager->Render($rows_per_page=5);</pre></div>
|
||
|
||
<p>This will create a basic record pager that looks like this: <a name=scr></a></p>
|
||
|
||
<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:1.5pt;
|
||
background:beige'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><a href="#scr"><code><span style='font-size:10.0pt'>|<</span></code></a>
|
||
<a href="#scr"><code><span style='font-size:10.0pt'><<</span></code></a>
|
||
<a href="#scr"><code><span style='font-size:10.0pt'>>></span></code></a>
|
||
<a href="#scr"><code><span style='font-size:10.0pt'>>|</span></code></a>
|
||
</p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<table class=MsoNormalTable border=1 cellpadding=0 width="100%"
|
||
style='width:100.0%;mso-cellspacing:1.5pt;background:white' cols=4>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=center style='text-align:center'><b>ID<o:p></o:p></b></p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=center style='text-align:center'><b>First Name<o:p></o:p></b></p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=center style='text-align:center'><b>Last Name<o:p></o:p></b></p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=center style='text-align:center'><b>Date Created<o:p></o:p></b></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>36 </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Alan </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Turing </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sat 06, Oct 2001 </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>37 </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Serena </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Williams </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sat 06, Oct 2001 </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:3'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>38 </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Yat Sun </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sun </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sat 06, Oct 2001 </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:4'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>39 </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Wai Hun </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>See </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sat 06, Oct 2001 </p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>40 </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Steven </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Oey </p>
|
||
</td>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal>Sat 06, Oct 2001 </p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<p class=MsoNormal><o:p></o:p></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'>
|
||
<td style='padding:.75pt .75pt .75pt .75pt'>
|
||
<p class=MsoNormal><span style='font-size:10.0pt'>Page 8/10</span></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<p>The number of rows to display at one time is controled by the Render($rows)
|
||
method. If you do not pass any value to Render(), ADODB_Pager will default to
|
||
10 records per page. </p>
|
||
|
||
<p>You can control the column titles by modifying your SQL (supported by most
|
||
databases): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$sql = 'select id as "ID", firstname as "First Name", <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>lastname as "Last Name", created as "Date Created" <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>from adoxyz';</pre></div>
|
||
|
||
<p>The above code can be found in the <i>adodb/tests/testpaging.php</i> example
|
||
included with this release, and the class ADODB_Pager in <i>adodb/adodb-pager.inc.php</i>.
|
||
The ADODB_Pager code can be adapted by a programmer so that the text links can
|
||
be replaced by images, and the dull white background be replaced with more
|
||
interesting colors. </p>
|
||
|
||
<p>You can also allow display of html by setting $pager->htmlSpecialChars =
|
||
false. </p>
|
||
|
||
<p>Some of the code used here was contributed by Iv<49>n Oliva and Cornel G. </p>
|
||
|
||
<h3><a name=ex9></a>Example 9: Exporting in CSV or Tab-Delimited Format</h3>
|
||
|
||
<p>We provide some helper functions to export in comma-separated-value (CSV)
|
||
and tab-delimited formats:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><b>include_once('/path/to/adodb/toexport.inc.php');</b><br>
|
||
include_once('/path/to/adodb/adodb.inc.php');<br style='mso-special-character:
|
||
line-break'>
|
||
<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
|
||
<![endif]></pre><pre style='background:#EEEEEE'>$db = &NewADOConnection('mysql');<br>
|
||
$db->Connect($server, $userid, $password, $database);<br>
|
||
<br>
|
||
$rs = $db->Execute('select fname as "First Name", surname as "Surname" from table');<br>
|
||
<br>
|
||
print "<pre>";<br>
|
||
print <b>rs2csv</b>($rs); # return a string, CSV format</pre>
|
||
|
||
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
|
||
background:#EEEEEE;border:none;mso-border-alt:solid #DDDDDD .75pt;padding:0cm;
|
||
mso-padding-alt:9.0pt 18.0pt 9.0pt 18.0pt'><span style='font-size:9.0pt;
|
||
font-family:"Courier New"'>print '<hr>';<br>
|
||
<br>
|
||
$rs->MoveFirst(); # note, some databases do not support MoveFirst<br>
|
||
print <b>rs2tab</b>($rs,<i>false</i>); # return a string, tab-delimited<br>
|
||
<span style='mso-tab-count:6'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span
|
||
style='mso-spacerun:yes'><EFBFBD></span># false == suppress field names in first line<o:p></o:p></span></p>
|
||
|
||
<pre style='background:#EEEEEE'>print '<hr>';<br>
|
||
$rs->MoveFirst();<br>
|
||
<b>rs2tabout</b>($rs); # send to stdout directly (there is also an rs2csvout function)<br>
|
||
print "</pre>";<br>
|
||
<br>
|
||
$rs->MoveFirst();<br>
|
||
$fp = fopen($path, "w");<br>
|
||
if ($fp) {<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span><b>rs2csvfile</b>($rs, $fp); # write to file (there is also an rs2tabfile function)<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>fclose($fp);<br>
|
||
}</pre></div>
|
||
|
||
<p>Carriage-returns or newlines are converted to spaces. Field names are
|
||
returned in the first line of text. Strings containing the delimiter character
|
||
are quoted with double-quotes. Double-quotes are double-quoted again. This
|
||
conforms to Excel import and export guide-lines. </p>
|
||
|
||
<p>All the above functions take as an optional last parameter, $addtitles which
|
||
defaults to <i>true</i>. When set to <i>false</i> field names in the first line
|
||
are suppressed. </p>
|
||
|
||
<h3>Example 10: Recordset Filters<a name=ex10></a></h3>
|
||
|
||
<p>Sometimes we want to pre-process all rows in a recordset before we use it.
|
||
For example, we want to ucwords all text in recordset. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>include_once('adodb/rsfilter.inc.php');<br>
|
||
include_once('adodb/adodb.inc.php');<br>
|
||
<br>
|
||
// ucwords() every element in the recordset<br>
|
||
function do_ucwords(&$arr,$rs)<br>
|
||
{<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>foreach($arr as $k => $v) {<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$arr[$k] = ucwords($v);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}<br>
|
||
}<br>
|
||
<br>
|
||
$db = NewADOConnection('mysql');<br>
|
||
$db->PConnect('server','user','pwd','db');<br>
|
||
<br>
|
||
$rs = $db->Execute('select ... from table');<br>
|
||
$rs = <b>RSFilter</b>($rs,'do_ucwords');</pre></div>
|
||
|
||
<p>The <i>RSFilter</i> function takes 2 parameters, the recordset, and the name
|
||
of the <i>filter</i> function. It returns the processed recordset scrolled to
|
||
the first record. The <i>filter</i> function takes two parameters, the current
|
||
row as an array, and the recordset object. For future compatibility, you should
|
||
not use the original recordset object. </p>
|
||
|
||
<h3>Example 11:<a name=ex11></a> Smart Transactions</h3>
|
||
|
||
<p class=MsoNormal>The old way of doing transactions required you to use </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$conn-><b>BeginTrans</b>();<br>
|
||
$ok = $conn->Execute($sql);<br>
|
||
if ($ok) $ok = $conn->Execute($sql2);<br>
|
||
if (!$ok) $conn-><b>RollbackTrans</b>();<br>
|
||
else $conn-><b>CommitTrans</b>();</pre></div>
|
||
|
||
<p class=MsoNormal>This is very complicated for large projects because you have
|
||
to track the error status. Smart Transactions is much simpler. You start a
|
||
smart transaction by calling StartTrans(): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$conn-><b>StartTrans</b>();<br>
|
||
$conn->Execute($sql);<br>
|
||
$conn->Execute($Sql2);<br>
|
||
$conn-><b>CompleteTrans</b>();</pre></div>
|
||
|
||
<p class=MsoNormal>CompleteTrans() detects when an SQL error occurs, and will
|
||
Rollback/Commit as appropriate. To specificly force a rollback even if no error
|
||
occured, use FailTrans(). Note that the rollback is done in CompleteTrans(),
|
||
and not in FailTrans(). </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$conn-><b>StartTrans</b>();<br>
|
||
$conn->Execute($sql);<br>
|
||
if (!CheckRecords()) $conn-><strong><span style='font-family:"Courier New"'>FailTrans</span></strong>();<br>
|
||
$conn->Execute($Sql2);<br>
|
||
$conn-><b>CompleteTrans</b>();</pre></div>
|
||
|
||
<p>You can also check if a transaction has failed, using HasFailedTrans(),
|
||
which returns true if FailTrans() was called, or there was an error in the SQL
|
||
execution. Make sure you call HasFailedTrans() before you call CompleteTrans(),
|
||
as it is only works between StartTrans/CompleteTrans. </p>
|
||
|
||
<p>Lastly, StartTrans/CompleteTrans is nestable, and only the outermost block
|
||
is executed. In contrast, BeginTrans/CommitTrans/RollbackTrans is NOT nestable.
|
||
</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>$conn-><strong><span
|
||
style='font-family:"Courier New"'>StartTrans</span></strong>();<br>
|
||
$conn->Execute($sql);<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$conn-><strong><span
|
||
style='font-family:"Courier New"'>StartTrans</span></strong>();<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span><span
|
||
style='color:#006600'># ignored</span></pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>if (!CheckRecords()) $conn->FailTrans();</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>$conn-><strong><span
|
||
style='font-family:"Courier New"'>CompleteTrans</span></strong>(); <span
|
||
style='color:#006600'># ignored</span></pre><pre>$conn->Execute($Sql2);</pre><pre
|
||
style='background:#EEEEEE'>$conn-><strong><span style='font-family:"Courier New"'>CompleteTrans</span></strong>();</pre></div>
|
||
|
||
<p>Note: Savepoints are currently not supported. </p>
|
||
|
||
<h2><a name=errorhandling></a>Using Custom Error Handlers and PEAR_Error</h2>
|
||
|
||
<p>ADOdb supports PHP5 exceptions. Just include <i>adodb-exceptions.inc.php</i>
|
||
and you can now catch exceptions on errors as they occur. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>include("../adodb-exceptions.inc.php");</b> <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>include("../adodb.inc.php");<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span> <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>try { <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db = NewADOConnection("oci8://scott:bad-password@mytns/"); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>} catch (exception $e) { <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>var_dump($e); <br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>adodb_backtrace($e->gettrace());<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>} </pre></div>
|
||
|
||
<p>ADOdb also provides two custom handlers which you can modify for your needs.
|
||
The first one is in the <b>adodb-errorhandler.inc.php</b> file. This makes use
|
||
of the standard PHP functions <a href="http://php.net/error_reporting">error_reporting</a>
|
||
to control what error messages types to display, and <a
|
||
href="http://php.net/trigger_error">trigger_error</a> which invokes the default
|
||
PHP error handler. </p>
|
||
|
||
<p>Including the above file will cause <i>trigger_error($errorstring,E_USER_ERROR)</i>
|
||
to be called when<br>
|
||
(a) Connect() or PConnect() fails, or <br>
|
||
(b) a function that executes SQL statements such as Execute() or SelectLimit()
|
||
has an error.<br>
|
||
(c) GenID() appears to go into an infinite loop. </p>
|
||
|
||
<p>The $errorstring is generated by ADOdb and will contain useful debugging
|
||
information similar to the error.log data generated below. This file
|
||
adodb-errorhandler.inc.php should be included before you create any
|
||
ADOConnection objects. </p>
|
||
|
||
<p>If you define error_reporting(0), no errors will be passed to the error
|
||
handler. If you set error_reporting(E_ALL), all errors will be passed to the
|
||
error handler. You still need to use <b>ini_set("display_errors",
|
||
"0" or "1")</b> to control the display of errors. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?php<br>
|
||
<b>error_reporting(E_ALL); # pass any error messages triggered to error handler<br>
|
||
include('adodb-errorhandler.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c->PConnect('localhost','root','','northwind');</pre><pre>$rs=$c->Execute('select * from productsz'); #invalid table productsz');</pre><pre>if ($rs) rs2html($rs);</pre><pre>?></pre></div>
|
||
|
||
<p>If you want to log the error message, you can do so by defining the
|
||
following optional constants ADODB_ERROR_LOG_TYPE and ADODB_ERROR_LOG_DEST.
|
||
ADODB_ERROR_LOG_TYPE is the error log message type (see <a
|
||
href="http://php.net/error_log">error_log</a> in the PHP manual). In this case
|
||
we set it to 3, which means log to the file defined by the constant
|
||
ADODB_ERROR_LOG_DEST. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?php<br>
|
||
<b>error_reporting(E_ALL); # report all errors<br>
|
||
ini_set("display_errors", "0"); # but do not echo the errors<br>
|
||
define('ADODB_ERROR_LOG_TYPE',3);<br>
|
||
define('ADODB_ERROR_LOG_DEST','C:/errors.log');<br>
|
||
include('adodb-errorhandler.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre><o:p> </o:p></pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c->PConnect('localhost','root','','northwind');</pre><pre>$rs=$c->Execute('select * from productsz'); ## invalid table productsz</pre><pre>if ($rs) rs2html($rs);</pre><pre>?></pre></div>
|
||
|
||
<p class=MsoNormal>The following message will be logged in the error.log file: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>EXECUTE("select * from productsz")</pre></div>
|
||
|
||
<h3>PEAR_ERROR</h3>
|
||
|
||
<p class=MsoNormal>The second error handler is <b>adodb-errorpear.inc.php</b>.
|
||
This will create a PEAR_Error derived object whenever an error occurs. The last
|
||
PEAR_Error object created can be retrieved using ADODB_Pear_Error(). </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><?php<br>
|
||
<b>include('adodb-errorpear.inc.php');</b></pre><pre>include('adodb.inc.php');</pre><pre>include('tohtml.inc.php');</pre><pre>$c = NewADOConnection('mysql');</pre><pre>$c->PConnect('localhost','root','','northwind');</pre><pre>$rs=$c->Execute('select * from productsz'); #invalid table productsz');</pre><pre>if ($rs) rs2html($rs);</pre><pre>else {</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>$e = ADODB_Pear_Error();<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo '<p>',$e->message,'</p>';</b></pre><pre>}</pre><pre>?></pre></div>
|
||
|
||
<p>You can use a PEAR_Error derived class by defining the constant
|
||
ADODB_PEAR_ERROR_CLASS before the adodb-errorpear.inc.php file is included. For
|
||
easy debugging, you can set the default error handler in the beginning of the
|
||
PHP script to PEAR_ERROR_DIE, which will cause an error message to be printed,
|
||
then halt script execution: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>include('PEAR.php');<br>
|
||
PEAR::setErrorHandling('PEAR_ERROR_DIE');</pre></div>
|
||
|
||
<p>Note that we do not explicitly return a PEAR_Error object to you when an
|
||
error occurs. We return false instead. You have to call ADODB_Pear_Error() to
|
||
get the last error or use the PEAR_ERROR_DIE technique. </p>
|
||
|
||
<h3>MetaError and MetaErrMsg</h3>
|
||
|
||
<p>If you need error messages that work across multiple databases, then use <a
|
||
href="#metaerror">MetaError()</a>, which returns a virtualized error number,
|
||
based on PEAR DB's error number system, and <a href="#metaerrmsg">MetaErrMsg()</a>.
|
||
</p>
|
||
|
||
<h4>Error Messages</h4>
|
||
|
||
<p>Error messages are outputted using the static method
|
||
ADOConnnection::outp($msg,$newline=true). By default, it sends the messages to
|
||
the client. You can override this to perform error-logging. </p>
|
||
|
||
<h2><a name=dsn></a>Data Source Names</h2>
|
||
|
||
<p>We now support connecting using PEAR style DSN's. A DSN is a connection
|
||
string of the form:</p>
|
||
|
||
<p>$dsn = <i>"$driver://$username:$password@$hostname/$databasename"</i>;</p>
|
||
|
||
<p>An example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$username = 'root';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$password = '';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$hostname = 'localhost';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$databasename = 'xphplens';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$driver = 'mysql';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$dsn = "$driver://$username:$password@$hostname/$databasename"<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$db = NewADOConnection(); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$rs = $db->query('select firstname,lastname from adoxyz');<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$cnt = 0;<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>while ($arr = $rs->fetchRow()) {<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($arr); print "<br>";<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>}</pre></div>
|
||
|
||
<p><a href="#dsnsupport">More info and connection examples</a> on the DSN
|
||
format. </p>
|
||
|
||
<h2><a name=pear></a>PEAR Compatibility</h2>
|
||
|
||
<p class=MsoNormal>We support DSN's (see above), and the following functions: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><b><span style='mso-spacerun:yes'><EFBFBD></span>DB_Common</b></pre><pre> <span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>query - returns PEAR_Error on error</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>limitQuery - return PEAR_Error on error</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>prepare - does not return PEAR_Error on error</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>execute - does not return PEAR_Error on error</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>setFetchMode - supports ASSOC and ORDERED</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>errorNative</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>quote</pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>nextID</pre><pre><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>disconnect</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>getOne</pre><pre><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>getAssoc</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>getRow</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>getCol</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><b> DB_Result</b></pre><pre> <span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>numRows - returns -1 if not supported</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>numCols</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>fetchInto - does not support passing of fetchmode</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>fetchRows - does not support passing of fetchmode</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>free</pre></div>
|
||
|
||
<h2><a name=caching></a>Caching of Recordsets</h2>
|
||
|
||
<p>ADOdb now supports caching of recordsets in the file system using the
|
||
CacheExecute( ), CachePageExecute( ) and CacheSelectLimit( ) functions. There
|
||
are similar to the non-cache functions, except that they take a new first
|
||
parameter, $secs2cache. </p>
|
||
|
||
<p>An example: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><b>include</b>('adodb.inc.php'); # load code common to ADOdb<br>
|
||
$ADODB_CACHE_DIR = '/usr/ADODB_cache';<br>
|
||
$<span style='color:#663300'>conn</span> = &ADONewConnection('mysql');<span style='mso-spacerun:yes'><EFBFBD> </span># create a connection<br>
|
||
$<span style='color:#663300'>conn</span>->PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br>
|
||
$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers';<br>
|
||
$<span style='color:#663300'>rs</span> = $<span style='color:#663300'>conn</span>->CacheExecute(15,$sql);</pre></div>
|
||
|
||
<p>The first parameter is the number of seconds to cache the query. Subsequent
|
||
calls to that query will used the cached version stored in $ADODB_CACHE_DIR. To
|
||
force a query to execute and flush the cache, call CacheExecute() with the
|
||
first parameter set to zero. Alternatively, use the CacheFlush($sql) call. </p>
|
||
|
||
<p>For the sake of security, we recommend you set <i>register_globals=off</i> in
|
||
php.ini if you are using $ADODB_CACHE_DIR.</p>
|
||
|
||
<p>In ADOdb 1.80 onwards, the secs2cache parameter is optional in
|
||
CacheSelectLimit() and CacheExecute(). If you leave it out, it will use the
|
||
$connection->cacheSecs parameter, which defaults to 60 minutes. The following
|
||
are equivalent: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span># (1)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>$rs = $db->SelectLimit(30, 'select * from table', 10);</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span></pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD></span># (2)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>$db->cacheSsecs = 30;</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>$rs = $db->SelectLimit('select * from table', 10);</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect(...);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->cacheSecs = 3600*24; # cache 24 hours<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $conn->CacheExecute('select * from table');</pre></div>
|
||
|
||
<p>Please note that magic_quotes_runtime should be turned off. Do not change
|
||
$ADODB_FETCH_MODE (or SetFetchMode) as the cached recordset will use the
|
||
$ADODB_FETCH_MODE set when the query was executed. <a name=memcache></a></p>
|
||
|
||
<h3><span style='mso-bookmark:memcache'>MemCache support</span></h3>
|
||
|
||
<p><span style='mso-bookmark:memcache'>You can also share cached recordsets on
|
||
a memcache server. The memcache API supports one or more pooled hosts. Only if
|
||
none of the pooled servers can be contacted will a connect error be generated.
|
||
Example below: </span></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:memcache'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db = NewADOConnection($driver='mysql');</span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->memCache = true;</span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->memCacheHost = array($ip1, $ip2, $ip3); /// $db->memCacheHost = $ip1; will work too</span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->memCachePort = 11211; /// this is default memCache port</span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</span></pre><pre><span
|
||
style='mso-bookmark:memcache'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->Connect(...);</span></pre><pre><span
|
||
style='mso-bookmark:memcache'>$db->CacheExecute($sql);</span></pre></div>
|
||
|
||
<p><span style='mso-bookmark:memcache'>More info on memcache can be found at </span><a
|
||
href="http://www.danga.com/memcached/">http://www.danga.com/memcached/</a>. <a
|
||
name=cacheapi></a></p>
|
||
|
||
<h3><span style='mso-bookmark:cacheapi'>Caching API</span></h3>
|
||
|
||
<p><span style='mso-bookmark:cacheapi'>There is also a caching API since
|
||
4.99/5.05. Two implementations of the API are already available providing file
|
||
and memcache support. </span></p>
|
||
|
||
<p><span style='mso-bookmark:cacheapi'>The new API for creating your custom
|
||
caching class uses 2 globals: </span></p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l8 level1 lfo8;tab-stops:list 36.0pt'><span style='mso-bookmark:
|
||
cacheapi'>$ADODB_CACHE_CLASS: name of caching class </span></li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l8 level1 lfo8;tab-stops:list 36.0pt'><span style='mso-bookmark:
|
||
cacheapi'>$ADODB_CACHE: instance of $ADODB_CACHE_CLASS </span></li>
|
||
</ul>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-bookmark:cacheapi'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>include "/path/to/adodb.inc.php";</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>$ADODB_CACHE_CLASS = 'MyCacheClass';</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>class MyCacheClass extends ADODB_Cache_File</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>{</span></pre><pre><span style='mso-bookmark:
|
||
cacheapi'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>var $createdir = false; // do not set this to true unless you use temp directories in cache path</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>function writecache($filename, $contents,$debug=false){...}</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>function &readcache($filename, &$err, $secs2cache, $rsClass){ ...}</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span> :</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>}</span></pre><pre><span style='mso-bookmark:
|
||
cacheapi'><o:p> </o:p></span></pre><pre><span style='mso-bookmark:cacheapi'>$DB = NewADOConnection($driver);</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>$DB->Connect(...);<span style='mso-spacerun:yes'><EFBFBD> </span>## MyCacheClass created here and stored in $ADODB_CACHE global variable.</span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'><o:p> </o:p></span></pre><pre><span
|
||
style='mso-bookmark:cacheapi'>$data = $rs->CacheGetOne($sql); ## MyCacheClass is used here for caching...</span></pre></div>
|
||
|
||
<span style='mso-bookmark:cacheapi'></span>
|
||
|
||
<h2><a name=pivot></a>Pivot Tables</h2>
|
||
|
||
<p>Since ADOdb 2.30, we support the generation of SQL to create pivot tables,
|
||
also known as cross-tabulations. For further explanation read this DevShed <a
|
||
href="http://www.devshed.com/Server_Side/MySQL/MySQLWiz/">Cross-Tabulation tutorial</a>.
|
||
We assume that your database supports the SQL case-when expression. </p>
|
||
|
||
<p>In this example, we will use the Northwind database from Microsoft. In the
|
||
database, we have a products table, and we want to analyze this table by <i>suppliers
|
||
versus product categories</i>. We will place the suppliers on each row, and
|
||
pivot on categories. So from the table on the left, we generate the pivot-table
|
||
on the right:</p>
|
||
|
||
<div align=center>
|
||
|
||
<table class=MsoNormalTable border=0 cellpadding=0 style='mso-cellspacing:1.5pt;
|
||
mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<div align=center>
|
||
<table class=MsoNormalTable border=1 cellpadding=0 width=142
|
||
style='width:106.5pt;mso-cellspacing:1.5pt;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>Supplier</i></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>Category</i></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>supplier1</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>category1</p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>supplier2</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>category1</p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:3;mso-yfti-lastrow:yes'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>supplier2</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal>category2</p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<p class=MsoNormal><o:p></o:p></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><span style='font-family:"Courier New"'>--></span></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<div align=center>
|
||
<table class=MsoNormalTable border=1 cellpadding=0 style='mso-cellspacing:
|
||
1.5pt;mso-padding-alt:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal> </p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>category1</i></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>category2</i></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>total</i></p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:1'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>supplier1</i></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>1</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>0</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>1</p>
|
||
</td>
|
||
</tr>
|
||
<tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal><i>supplier2</i></p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>1</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>1</p>
|
||
</td>
|
||
<td style='padding:1.5pt 1.5pt 1.5pt 1.5pt'>
|
||
<p class=MsoNormal align=right style='text-align:right'>2</p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<p class=MsoNormal><o:p></o:p></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</div>
|
||
|
||
<p>The following code will generate the SQL for a cross-tabulation: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'># Query the main "product" table<br>
|
||
# Set the rows to SupplierName<br>
|
||
# and the columns to the values of Categories<br>
|
||
# and define the joins to link to lookup tables <br>
|
||
# "categories" and "suppliers"<br>
|
||
#<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>include "adodb/pivottable.inc.php";<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$sql = PivotTableSQL(<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$gDB,<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># adodb connection<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># tables<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'SupplierName',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># rows (multiple fields allowed)<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'CategoryName',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># column to pivot on <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where<br>
|
||
);</pre></div>
|
||
|
||
<p>This will generate the following SQL:</p>
|
||
|
||
<p><code><span style='font-size:10.0pt'>SELECT SupplierName, </span></code><span
|
||
style='font-size:10.0pt;font-family:"Courier New"'><br>
|
||
<code>SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS
|
||
"Beverages", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS
|
||
"Condiments", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS
|
||
"Confections", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS
|
||
"Dairy Products", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS
|
||
"Grains/Cereals", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS
|
||
"Meat/Poultry", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS
|
||
"Produce", </code><br>
|
||
<code>SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS
|
||
"Seafood", </code><br>
|
||
<code>SUM(1) as Total </code><br>
|
||
<code>FROM products p ,categories c ,suppliers s WHERE p.CategoryID =
|
||
c.CategoryID and s.SupplierID= p.SupplierID </code><br>
|
||
<code>GROUP BY SupplierName</code></span></p>
|
||
|
||
<p>You can also pivot on <i>numerical columns</i> and <i>generate totals</i> by
|
||
using ranges. This code was revised in ADODB 2.41 and is not backward
|
||
compatible. The second example shows this:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span style='mso-spacerun:yes'><EFBFBD></span>$sql = PivotTableSQL(<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$gDB,<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># adodb connection<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span># tables<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'SupplierName',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># rows (multiple fields allowed)</pre><pre><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>array(<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span># column ranges</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>' 0 '<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>=> 'UnitsInStock <= 0',</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>"1 to 5"<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>=> '0 < UnitsInStock and UnitsInStock <= 5',</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>"6 to 10"<span style='mso-spacerun:yes'><EFBFBD> </span>=> '5 < UnitsInStock and UnitsInStock <= 10',</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>"16+"<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>=> '15 < UnitsInStock'</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>),</pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'UnitsInStock',<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># sum this field</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'Sum '<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># sum label prefix</pre><pre>);</pre></div>
|
||
|
||
<p>Which generates: </p>
|
||
|
||
<p><code><span style='font-size:10.0pt'>SELECT SupplierName, </span></code><span
|
||
style='font-size:10.0pt;font-family:"Courier New"'><br>
|
||
<code>SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS
|
||
"Sum 0 ", </code><br>
|
||
<code>SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN
|
||
UnitsInStock ELSE 0 END) AS "Sum 1 to 5",</code><br>
|
||
<code>SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock
|
||
ELSE 0 END) AS "Sum 6 to 10",</code><br>
|
||
<code>SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN
|
||
UnitsInStock ELSE 0 END) AS "Sum 11 to 15", </code><br>
|
||
<code>SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS
|
||
"Sum 16+", </code><br>
|
||
<code>SUM(UnitsInStock) AS "Sum UnitsInStock", </code><br>
|
||
<code>SUM(1) as Total,</code><br>
|
||
<code>FROM products p ,categories c ,suppliers s WHERE p.CategoryID =
|
||
c.CategoryID and s.SupplierID= p.SupplierID </code><br>
|
||
<code>GROUP BY SupplierName</code></span></p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h1>Class Reference<a name=ref></a></h1>
|
||
|
||
<p>Function parameters with [ ] around them are optional.</p>
|
||
|
||
<h2>Global Variables</h2>
|
||
|
||
<h3><a name="adodb_countrecs"></a>$ADODB_COUNTRECS</h3>
|
||
|
||
<p>If the database driver API does not support counting the number of records
|
||
returned in a SELECT statement, the function RecordCount() is emulated when the
|
||
global variable $ADODB_COUNTRECS is set to true, which is the default. We
|
||
emulate this by buffering the records, which can take up large amounts of
|
||
memory for big recordsets. Set this variable to false for the best performance.
|
||
This variable is checked every time a query is executed, so you can selectively
|
||
choose which recordsets to count.</p>
|
||
|
||
<h3><a name="adodb_cache_dir"></a>$ADODB_CACHE_DIR</h3>
|
||
|
||
<p>If you are using recordset caching, this is the directory to save your
|
||
recordsets in. Define this before you call any caching functions such as
|
||
CacheExecute( ). We recommend setting <i>register_globals=off</i> in php.ini if
|
||
you use this feature for security reasons.</p>
|
||
|
||
<p>If you are using Unix and apache, you might need to set your cache directory
|
||
permissions to something similar to the following:</p>
|
||
|
||
<p>chown -R apache /path/to/adodb/cache<br>
|
||
chgrp -R apache /path/to/adodb/cache </p>
|
||
|
||
<h3><a name="adodb_ansi_padding_off"></a>$ADODB_ANSI_PADDING_OFF</h3>
|
||
|
||
<p>Determines whether to right trim CHAR fields (and also VARCHAR for
|
||
ibase/firebird). Set to true to trim. Default is false. Currently works for
|
||
oci8po, ibase and firebird drivers. Added in ADOdb 4.01. </p>
|
||
|
||
<h3><a name="adodb_lang"></a>$ADODB_LANG</h3>
|
||
|
||
<p>Determines the language used in MetaErrorMsg(). The default is 'en', for
|
||
English. To find out what languages are supported, see the files in
|
||
adodb/lang/adodb-$lang.inc.php, where $lang is the supported langauge. </p>
|
||
|
||
<h3><a name="adodb_fetch_mode"></a>$ADODB_FETCH_MODE</h3>
|
||
|
||
<p>This is a global variable that determines how arrays are retrieved by recordsets.
|
||
The recordset saves this value on creation (eg. in Execute( ) or SelectLimit(
|
||
)), and any subsequent changes to $ADODB_FETCH_MODE have no affect on existing
|
||
recordsets, only on recordsets created in the future.</p>
|
||
|
||
<p>The following constants are defined:</p>
|
||
|
||
<p>define('ADODB_FETCH_DEFAULT',0);<br>
|
||
define('ADODB_FETCH_NUM',1);<br>
|
||
define('ADODB_FETCH_ASSOC',2);<br>
|
||
define('ADODB_FETCH_BOTH',3); </p>
|
||
|
||
<p>An example: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_NUM;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs1 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_ASSOC;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs2 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs2->fields); # shows <i>array(['col1']=>'v0',['col2'] =>'v1')</i></pre></div>
|
||
|
||
<p>As you can see in the above example, both recordsets store and use different
|
||
fetch modes based on the $ADODB_FETCH_MODE setting when the recordset was
|
||
created by Execute().</p>
|
||
|
||
<p>If no fetch mode is predefined, the fetch mode defaults to
|
||
ADODB_FETCH_DEFAULT. The behaviour of this default mode varies from driver to
|
||
driver, so do not rely on ADODB_FETCH_DEFAULT. For portability, we recommend
|
||
sticking to ADODB_FETCH_NUM or ADODB_FETCH_ASSOC. Many drivers do not support
|
||
ADODB_FETCH_BOTH.</p>
|
||
|
||
<p><strong>SetFetchMode Function</strong></p>
|
||
|
||
<p>If you have multiple connection objects, and want to have different fetch
|
||
modes for each connection, then use <a href="#setfetchmode">SetFetchMode</a>.
|
||
Once this function is called for a connection object, that connection object
|
||
will ignore the global variable $ADODB_FETCH_MODE and will use the internal
|
||
fetchMode property exclusively.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->SetFetchMode(ADODB_FETCH_NUM);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs1 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->SetFetchMode(ADODB_FETCH_ASSOC);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs2 = $db->Execute('select * from table');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($rs2->fields); # shows <i>array(['col1']=>'v0',['col2'] =>'v1')</i></pre></div>
|
||
|
||
<p>To retrieve the previous fetch mode, you can use check the $db->fetchMode
|
||
property, or use the return value of SetFetchMode( ). </p>
|
||
|
||
<p><a name="adodb_assoc_case"></a><strong>ADODB_ASSOC_CASE</strong></p>
|
||
|
||
<p>You can control the associative fetch case for certain drivers which behave
|
||
differently. For the sybase, oci8po, mssql, odbc and ibase drivers and all
|
||
drivers derived from them, ADODB_ASSOC_CASE will by default generate recordsets
|
||
where the field name keys are lower-cased. Use the constant ADODB_ASSOC_CASE to
|
||
change the case of the keys. There are 3 possible values:</p>
|
||
|
||
<p>0 = assoc lowercase field names. $rs->fields['orderid']<br>
|
||
1 = assoc uppercase field names. $rs->fields['ORDERID']<br>
|
||
2 = use native-case field names. $rs->fields['OrderID'] -- this is the
|
||
default since ADOdb 2.90</p>
|
||
|
||
<p>To use it, declare it before you incldue adodb.inc.php.</p>
|
||
|
||
<p>define('ADODB_ASSOC_CASE', 2); # use native-case for ADODB_FETCH_ASSOC<br>
|
||
include('adodb.inc.php'); </p>
|
||
|
||
<h3><a name="force_type"></a>$ADODB_FORCE_TYPE</h3>
|
||
|
||
<p>See the <a href="#ADODB_FORCE_TYPE">GetUpdateSQL tutorial</a>. </p>
|
||
|
||
<h3><a name="adodb_auto_quote"></a>$ADODB_QUOTE_FIELDNAMES</h3>
|
||
|
||
<p>Auto-quotes field names when using AutoExecute() when set to true. </p>
|
||
|
||
<p> </p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h2>ADOConnection<a name=adoconnection></a></h2>
|
||
|
||
<p>Object that performs the connection to the database, executes SQL statements
|
||
and has a set of utility functions for standardising the format of SQL
|
||
statements for issues such as concatenation and date formats.</p>
|
||
|
||
<h3>ADOConnection Fields</h3>
|
||
|
||
<p><b>databaseType</b>: Name of the database system we are connecting to. Eg. <b>odbc</b>
|
||
or <b>mssql</b> or <b>mysql</b>.</p>
|
||
|
||
<p><b>dataProvider</b>: The underlying mechanism used to connect to the
|
||
database. Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</p>
|
||
|
||
<p><b>host: </b>Name of server or data source name (DSN) to connect to.</p>
|
||
|
||
<p><b>database</b>: Name of the database or to connect to. If ado is used, it
|
||
will hold the ado data provider.</p>
|
||
|
||
<p><b>user</b>: Login id to connect to database. Password is not saved for
|
||
security reasons.</p>
|
||
|
||
<p><b>raiseErrorFn</b>: Allows you to define an error handling function. See
|
||
adodb-errorhandler.inc.php for an example.</p>
|
||
|
||
<p><b>debug</b>: Set to <i>true</i> to make debug statements to appear.</p>
|
||
|
||
<p><b>concat_operator</b>: Set to '+' or '||' normally. The operator used to
|
||
concatenate strings in SQL. Used by the <b><a href="#concat">Concat</a></b>
|
||
function.</p>
|
||
|
||
<p><b>fmtDate</b>: The format used by the <b><a href="#dbdate">DBDate</a></b>
|
||
function to send dates to the database. is '#Y-m-d#' for Microsoft Access, and
|
||
''Y-m-d'' for MySQL.</p>
|
||
|
||
<p><b>fmtTimeStamp: </b>The format used by the <b><a href="#dbtimestamp">DBTimeStamp</a></b>
|
||
function to send timestamps to the database. </p>
|
||
|
||
<p><b>true</b>: The value used to represent true.Eg. '.T.'. for Foxpro, '1' for
|
||
Microsoft SQL.</p>
|
||
|
||
<p><b>false: </b>The value used to represent false. Eg. '.F.'. for Foxpro, '0'
|
||
for Microsoft SQL.</p>
|
||
|
||
<p><b>replaceQuote</b>: The string used to escape quotes. Eg. double
|
||
single-quotes for Microsoft SQL, and backslash-quote for MySQL. Used by <a
|
||
href="#qstr">qstr</a>.</p>
|
||
|
||
<p><b>autoCommit</b>: indicates whether automatic commit is enabled. Default is
|
||
true.</p>
|
||
|
||
<p><b>charSet</b>: set the default charset to use. Currently only
|
||
interbase/firebird supports this.</p>
|
||
|
||
<p><b>dialect</b>: set the default sql dialect to use. Currently only interbase/firebird
|
||
supports this.</p>
|
||
|
||
<p><b>role</b>: set the role. Currently only interbase/firebird supports this.</p>
|
||
|
||
<p><b>metaTablesSQL</b>: SQL statement to return a list of available tables.
|
||
Eg. <i>SHOW TABLES</i> in MySQL.</p>
|
||
|
||
<p><b>genID</b>: The latest id generated by GenID() if supported by the
|
||
database.</p>
|
||
|
||
<p><b>cacheSecs</b>: The number of seconds to cache recordsets if
|
||
CacheExecute() or CacheSelectLimit() omit the $secs2cache parameter. Defaults
|
||
to 60 minutes.</p>
|
||
|
||
<p><b>sysDate</b>: String that holds the name of the database function to call
|
||
to get the current date. Useful for inserts and updates.</p>
|
||
|
||
<p><b>sysTimeStamp</b>: String that holds the name of the database function to
|
||
call to get the current timestamp/datetime value.</p>
|
||
|
||
<p><b>leftOuter</b>: String that holds operator for left outer join, if known.
|
||
Otherwise set to false.</p>
|
||
|
||
<p><b>rightOuter</b>: String that holds operator for left outer join, if known.
|
||
Otherwise set to false.</p>
|
||
|
||
<p><b>ansiOuter</b>: Boolean that if true indicates that ANSI style outer joins
|
||
are permitted. Eg. <i>select * from table1 left join table2 on p1=p2.</i></p>
|
||
|
||
<p><b>connectSID</b>: Boolean that indicates whether to treat the $database
|
||
parameter in connects as the SID for the oci8 driver. Defaults to false. Useful
|
||
for Oracle 8.0.5 and earlier.</p>
|
||
|
||
<p><b>autoRollback</b>: Persistent connections are auto-rollbacked in PConnect(
|
||
) if this is set to true. Default is false.</p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h3>ADOConnection Main Functions</h3>
|
||
|
||
<p><b>ADOConnection( )</b></p>
|
||
|
||
<p>Constructor function. Do not call this directly. Use ADONewConnection( )
|
||
instead.</p>
|
||
|
||
<p><b>Connect<a name=connect></a>($host,[$user],[$password],[$database])</b></p>
|
||
|
||
<p>Non-persistent connect to data source or server $<b>host</b>, using userid $<b>user
|
||
</b>and password $<b>password</b>. If the server supports multiple databases,
|
||
connect to database $<b>database</b>. </p>
|
||
|
||
<p>Returns true/false depending on connection success. Since 4.23, null is
|
||
returned if the extension is not loaded.</p>
|
||
|
||
<p><st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City> Note: If
|
||
you are using a Microsoft ADO and not OLEDB, you can set the $database
|
||
parameter to the OLEDB data provider you are using.</p>
|
||
|
||
<p>PostgreSQL: An alternative way of connecting to the database is to pass the
|
||
standard PostgreSQL connection string in the first parameter $host, and the
|
||
other parameters will be ignored.</p>
|
||
|
||
<p>For Oracle and Oci8, there are two ways to connect. First is to use the TNS
|
||
name defined in your local tnsnames.ora (or ONAMES or HOSTNAMES). Place the
|
||
name in the $database field, and set the $host field to false. Alternatively,
|
||
set $host to the server, and $database to the database SID, this bypassed
|
||
tnsnames.ora. </p>
|
||
|
||
<p>Examples: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span># $oraname in tnsnames.ora/ONAMES/HOSTNAMES<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$conn->Connect(false, 'scott', 'tiger', $oraname); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$conn->Connect('server:1521', 'scott', 'tiger', 'ServiceName'); # bypass tnsnames.ora</pre></div>
|
||
|
||
<p>There are many examples of connecting to a database. See <a
|
||
href="#connect_ex">Connection Examples</a> for many examples. </p>
|
||
|
||
<p><b>PConnect<a name=pconnect></a>($host,[$user],[$password],[$database])</b></p>
|
||
|
||
<p>Persistent connect to data source or server $<b>host</b>, using userid $<b>user</b>
|
||
and password $<b>password</b>. If the server supports multiple databases,
|
||
connect to database $<b>database</b>.</p>
|
||
|
||
<p>We now perform a rollback on persistent connection for selected databases
|
||
since 2.21, as advised in the PHP manual. See change log or source code for
|
||
which databases are affected. </p>
|
||
|
||
<p>Returns true/false depending on connection. Since 4.23, 0 is returned if the
|
||
extension is not loaded. See Connect( ) above for more info.</p>
|
||
|
||
<p>Since ADOdb 2.21, we also support autoRollback. If you set:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>$conn = &NewADOConnection('mysql');<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$conn->autoRollback = true; # default is false<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$conn->PConnect(...); # rollback here</pre></div>
|
||
|
||
<p>Then when doing a persistent connection with PConnect( ), ADOdb will perform
|
||
a rollback first. This is because it is documented that PHP is not guaranteed
|
||
to rollback existing failed transactions when persistent connections are used.
|
||
This is implemented in Oracle, MySQL, PgSQL, MSSQL, ODBC currently. </p>
|
||
|
||
<p>Since ADOdb 3.11, you can force non-persistent connections even if PConnect
|
||
is called by defining the constant ADODB_NEVER_PERSIST before you call
|
||
PConnect. </p>
|
||
|
||
<p>Since 4.23, null is returned if the extension is not loaded. </p>
|
||
|
||
<p><b>NConnect<a name=nconnect></a>($host,[$user],[$password],[$database])</b></p>
|
||
|
||
<p>Always force a new connection. In contrast, PHP sometimes reuses connections
|
||
when you use Connect() or PConnect(). Currently works only on mysql (PHP 4.3.0
|
||
or later), postgresql and oci8-derived drivers. For other drivers, NConnect()
|
||
works like Connect().</p>
|
||
|
||
<p><b>IsConnected( )</b><a name=isconnected></a></p>
|
||
|
||
<p>Returns true if connected to database. Added in 4.53. </p>
|
||
|
||
<p><b>Execute<a name=execute></a>($sql,$inputarr=false)</b></p>
|
||
|
||
<p>Execute SQL statement $<b>sql</b> and return derived class of ADORecordSet
|
||
if successful. Note that a record set is always returned on success, even if we
|
||
are executing an insert or update statement. You can also pass in $sql a
|
||
statement prepared in <a href="#prepare">Prepare()</a>.</p>
|
||
|
||
<p>Returns derived class of ADORecordSet. Eg. if connecting via mysql, then
|
||
ADORecordSet_mysql would be returned. False is returned if there was an error
|
||
in executing the sql.</p>
|
||
|
||
<p>The $inputarr parameter can be used for binding variables to parameters.
|
||
Below is an Oracle example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>$conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val));<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span></pre></div>
|
||
|
||
<p>Another example, using ODBC,which uses the ? convention:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span>$conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val));</pre></div>
|
||
|
||
<p class=MsoNormal><a name=binding></a><i>Binding variables</i></p>
|
||
|
||
<p>Variable binding speeds the compilation and caching of SQL statements,
|
||
leading to higher performance. Currently Oracle, Interbase and ODBC supports
|
||
variable binding. Interbase/ODBC style ? binding is emulated in databases that
|
||
do not support binding. Note that you do not have to quote strings if you use
|
||
binding. </p>
|
||
|
||
<p>Variable binding in the odbc, interbase and oci8po drivers. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute('select * from table where val=?', array('10'));</pre></div>
|
||
|
||
<p class=MsoNormal>Variable binding in the oci8 driver: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute('select name from table where val=:key', <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>array('key' => 10));</pre></div>
|
||
|
||
<p class=MsoNormal><a name=bulkbind></a><i>Bulk binding</i> </p>
|
||
|
||
<p>Since ADOdb 3.80, we support bulk binding in Execute(), in which you pass in
|
||
a 2-dimensional array to be bound to an INSERT/UPDATE or DELETE statement. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$arr = array(<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('Ahmad',32),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('Zulkifli', 24),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('Rosnah', 21)<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>);<br>
|
||
$ok = $db->Execute('insert into table (name,age) values (?,?)',$arr);</pre></div>
|
||
|
||
<p>This provides very high performance as the SQL statement is prepared first.
|
||
The prepared statement is executed repeatedly for each array row until all rows
|
||
are completed, or until the first error. Very useful for importing data. </p>
|
||
|
||
<p><b>CacheExecute<a name=cacheexecute></a>([$secs2cache,]$sql,$inputarr=false)</b></p>
|
||
|
||
<p>Similar to Execute, except that the recordset is cached for $secs2cache
|
||
seconds in the $ADODB_CACHE_DIR directory, and $inputarr only accepts
|
||
1-dimensional arrays. If CacheExecute() is called again with the same $sql,
|
||
$inputarr, and also the same database, same userid, and the cached recordset
|
||
has not expired, the cached recordset is returned. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span>include('adodb.inc.php'); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>include('tohtml.inc.php');<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$ADODB_<b>CACHE_DIR</b> = '/usr/local/ADOdbcache';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$conn = &ADONewConnection('mysql'); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$conn->PConnect('localhost','userid','password','database');<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$rs = $conn-><b>CacheExecute</b>(15, 'select * from table'); # cache 15 secs<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>rs2html($rs); /* recordset to html table */<span style='mso-spacerun:yes'><EFBFBD> </span></pre></div>
|
||
|
||
<p>Alternatively, since ADOdb 1.80, the $secs2cache parameter is optional:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect(...);<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->cacheSecs = 3600*24; // cache 24 hours<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $conn->CacheExecute('select * from table');</pre></div>
|
||
|
||
<p class=MsoNormal>If $secs2cache is omitted, we use the value in
|
||
$connection->cacheSecs (default is 3600 seconds, or 1 hour). Use
|
||
CacheExecute() only with SELECT statements. </p>
|
||
|
||
<p>Performance note: I have done some benchmarks and found that they vary so
|
||
greatly that it's better to talk about when caching is of benefit. When your
|
||
database server is <i>much slower </i>than your Web server or the database is <i>very
|
||
overloaded </i>then ADOdb's caching is good because it reduces the load on your
|
||
database server. If your database server is lightly loaded or much faster than
|
||
your Web server, then caching could actually reduce performance. </p>
|
||
|
||
<p><b>ExecuteCursor<a name=executecursor></a>($sql,$cursorName='rs',$parameters=false)</b></p>
|
||
|
||
<p>Execute an Oracle stored procedure, and returns an Oracle REF cursor
|
||
variable as a regular ADOdb recordset. Does not work with any other database
|
||
except oci8. Thanks to Robert Tuttle for the design. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>$db = ADONewConnection("oci8"); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>$db->Connect("foo.com:1521", "uid", "pwd", "FOO"); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;", <br>
|
||
<span style='mso-tab-count:5'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'cursorvar',<br>
|
||
<span style='mso-tab-count:5'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('param1'=>10)); <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span># $rs is now just like any other ADOdb recordset object<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD> </span>rs2html($rs);</pre></div>
|
||
|
||
<p>ExecuteCursor() is a helper function that does the following internally: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$stmt = $db->Prepare("begin :cursorvar := getdata(:param1); end;", true); <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $db->Execute($stmt,$bindarr);</pre></div>
|
||
|
||
<p>ExecuteCursor only accepts 1 out parameter. So if you have 2 out parameters,
|
||
use: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$vv = 'A%';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$stmt = $db->PrepareSP("BEGIN list_tabs(:crsr,:tt); END;");<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$arr = $db->GetArray($stmt);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print_r($arr);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo " val = $vv"; ## outputs 'TEST'</pre></div>
|
||
|
||
<p class=MsoNormal>for the following PL/SQL: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;<br>
|
||
<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>BEGIN<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>tablenames := 'TEST';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>END list_tabs;</pre></div>
|
||
|
||
<p><b>SelectLimit<a name=selectlimit></a>($sql,$numrows=-1,$offset=-1,$inputarr=false)</b></p>
|
||
|
||
<p>Returns a recordset if successful. Returns false otherwise. Performs a
|
||
select statement, simulating PostgreSQL's SELECT statement, LIMIT $numrows
|
||
OFFSET $offset clause.</p>
|
||
|
||
<p>In PostgreSQL, SELECT * FROM TABLE LIMIT 3 will return the first 3 records
|
||
only. The equivalent is <code><span style='font-size:10.0pt'>$connection->SelectLimit('SELECT
|
||
* FROM TABLE',3)</span></code>. This functionality is simulated for databases
|
||
that do not possess this feature.</p>
|
||
|
||
<p>And SELECT * FROM TABLE LIMIT 3 OFFSET 2 will return records 3, 4 and 5 (eg.
|
||
after record 2, return 3 rows). The equivalent in ADOdb is <code><span
|
||
style='font-size:10.0pt'>$connection->SelectLimit('SELECT * FROM TABLE',3,2)</span></code>.</p>
|
||
|
||
<p>Note that this is the <i>opposite</i> of MySQL's LIMIT clause. You can also
|
||
set <code><span style='font-size:10.0pt'>$connection->SelectLimit('SELECT *
|
||
FROM TABLE',-1,10)</span></code> to get rows 11 to the last row.</p>
|
||
|
||
<p>The last parameter $inputarr is for databases that support variable binding
|
||
such as Oracle oci8. This substantially reduces SQL compilation overhead. Below
|
||
is an Oracle example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=> $val));<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span></pre></div>
|
||
|
||
<p>The oci8po driver (oracle portable driver) uses the more standard bind
|
||
variable of ?: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=?", 100,-1,array('val'=> $val));</pre></div>
|
||
|
||
<p>Ron Wilson reports that SelectLimit does not work with UNIONs. </p>
|
||
|
||
<p><b>CacheSelectLimit<a name=cacheselectlimit></a>([$secs2cache,] $sql,
|
||
$numrows=-1,$offset=-1,$inputarr=false)</b></p>
|
||
|
||
<p>Similar to SelectLimit, except that the recordset returned is cached for
|
||
$secs2cache seconds in the $ADODB_CACHE_DIR directory. </p>
|
||
|
||
<p>Since 1.80, $secs2cache has been optional, and you can define the caching
|
||
time in $connection->cacheSecs.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Connect(...);<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$conn->cacheSecs = 3600*24; // cache 24 hours<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = $conn->CacheSelectLimit('select * from table',10);</pre></div>
|
||
|
||
<p><b>CacheFlush<a name=cacheflush></a>($sql=false,$inputarr=false)</b></p>
|
||
|
||
<p>Flush (delete) any cached recordsets for the SQL statement $sql in
|
||
$ADODB_CACHE_DIR. </p>
|
||
|
||
<p>If no parameter is passed in, then all adodb_*.cache files are deleted. </p>
|
||
|
||
<p>CacheSelectLimit() rewrites the SQL query, so you won't be able to pass the
|
||
SQL to CacheFlush. In this case, to flush the cached SQL recordset returned by
|
||
CacheSelectLimit(), set $secs2cache to -1: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->CacheSelectLimit(-1, $sql, $nrows);</pre></div>
|
||
|
||
<p>If you want to flush all cached recordsets manually, execute the following
|
||
PHP code (works only under Unix): <br>
|
||
<code><span style='font-size:10.0pt'> system("rm -f `find
|
||
".$ADODB_CACHE_DIR." -name adodb_*.cache`");</span></code></p>
|
||
|
||
<p>For general cleanup of all expired files, you should use <a
|
||
href="http://www.superscripts.com/tutorial/crontab.html">crontab</a> on Unix,
|
||
or at.exe on Windows, and a shell script similar to the following:<span
|
||
style='font-family:"Courier New"'><br>
|
||
#------------------------------------------------------ <br>
|
||
# This particular example deletes files in the TMPPATH <br>
|
||
# directory with the string ".cache" in their name that <br>
|
||
# are more than 7 days old. <br>
|
||
#------------------------------------------------------ <br>
|
||
AGED=7 <br>
|
||
find ${TMPPATH} -mtime +$AGED | grep "\.cache" | xargs rm -f </span></p>
|
||
|
||
<p><b>MetaError<a name=metaerror></a>($errno=false)</b></p>
|
||
|
||
<p>Returns a virtualized error number, based on PEAR DB's error number system.
|
||
You might need to include adodb-error.inc.php before you call this function.
|
||
The parameter $errno is the native error number you want to convert. If you do
|
||
not pass any parameter, MetaError will call ErrorNo() for you and convert it.
|
||
If the error number cannot be virtualized, MetaError will return -1 (DB_ERROR).</p>
|
||
|
||
<p><b>MetaErrorMsg<a name=metaerrormsg></a>($errno)</b></p>
|
||
|
||
<p>Pass the error number returned by MetaError() for the equivalent textual
|
||
error message.</p>
|
||
|
||
<p><b>ErrorMsg<a name=errormsg></a>()</b></p>
|
||
|
||
<p>Returns the last status or error message. The error message is reset after
|
||
every call to Execute(). </p>
|
||
|
||
<p>This can return a string even if no error occurs. In general you do not need
|
||
to call this function unless an ADOdb function returns false on an error. </p>
|
||
|
||
<p>Note: If <b>debug</b> is enabled, the SQL error message is always displayed
|
||
when the <b>Execute</b> function is called.</p>
|
||
|
||
<p><b>ErrorNo<a name=errorno></a>()</b></p>
|
||
|
||
<p>Returns the last error number. The error number is reset after every call to
|
||
Execute(). If 0 is returned, no error occurred. </p>
|
||
|
||
<p>Note that old versions of PHP (pre 4.0.6) do not support error number for
|
||
ODBC. In general you do not need to call this function unless an ADOdb function
|
||
returns false on an error.</p>
|
||
|
||
<p><b>IgnoreErrors<a name=ignoreerrors></a>($saveErrHandlers)</b></p>
|
||
|
||
<p>Allows you to ignore errors so that StartTrans()/CompleteTrans() is not
|
||
affected, nor is the default error handler called if an error occurs. Useful
|
||
when you want to check if a field or table exists in a database without
|
||
invoking an error if it does not exist. </p>
|
||
|
||
<p>Usage: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$saveErrHandlers = $conn->IgnoreErrors();</pre><pre>$rs = $conn->Execute("select field from some_table_that_might_not_exist");</pre><pre>$conn->IgnoreErrors($saveErrHandlers);</pre></div>
|
||
|
||
<p>Warning: do not call StartTrans()/CompleteTrans() inside a code block that
|
||
is using IgnoreErrors(). </p>
|
||
|
||
<p><b>SetFetchMode<a name=setfetchmode></a>($mode)</b></p>
|
||
|
||
<p>Sets the current fetch mode for the connection and stores it in
|
||
$db->fetchMode. Legal modes are ADODB_FETCH_ASSOC and ADODB_FETCH_NUM. For
|
||
more info, see <a href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>.</p>
|
||
|
||
<p>Returns the previous fetch mode, which could be false if SetFetchMode( ) has
|
||
not been called before.</p>
|
||
|
||
<p><b>CreateSequence<a name=createseq></a>($seqName = 'adodbseq',$startID=1)</b></p>
|
||
|
||
<p>Create a sequence. The next time GenID( ) is called, the value returned will
|
||
be $startID. Added in 2.60. </p>
|
||
|
||
<p><b>DropSequence<a name=dropseq></a>($seqName = 'adodbseq')</b></p>
|
||
|
||
<p>Delete a sequence. Added in 2.60. </p>
|
||
|
||
<p><b>GenID<a name=genid></a>($seqName = 'adodbseq',$startID=1)</b></p>
|
||
|
||
<p>Generate a sequence number . Works for interbase, mysql, postgresql, oci8,
|
||
oci8po, mssql, ODBC based (access,vfp,db2,etc) drivers currently. Uses $seqName
|
||
as the name of the sequence. GenID() will automatically create the sequence for
|
||
you if it does not exist (provided the userid has permission to do so).
|
||
Otherwise you will have to create the sequence yourself. </p>
|
||
|
||
<p>If your database driver emulates sequences, the name of the table is the
|
||
sequence name. The table has one column, "id" which should be of type
|
||
integer, or if you need something larger - numeric(16). </p>
|
||
|
||
<p>For ODBC and databases that do not support sequences natively (eg mssql,
|
||
mysql), we create a table for each sequence. If the sequence has not been
|
||
defined earlier, it is created with the starting value set in $startID.</p>
|
||
|
||
<p>Note that the mssql driver's GenID() before 1.90 used to generate 16 byte
|
||
GUID's.</p>
|
||
|
||
<p><b>UpdateBlob<a name=updateblob></a>($table,$column,$val,$where)</b></p>
|
||
|
||
<p class=MsoNormal>Allows you to store a blob (in $val) into $table into
|
||
$column in a row at $where. </p>
|
||
|
||
<p>Usage: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># for oracle<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># non oracle databases<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');</pre></div>
|
||
|
||
<p>Returns true if succesful, false otherwise. Supported by MySQL, PostgreSQL,
|
||
Oci8, Oci8po and Interbase drivers. Other drivers might work, depending on the
|
||
state of development.</p>
|
||
|
||
<p>Note that when an Interbase blob is retrieved using SELECT, it still needs
|
||
to be decoded using $connection->DecodeBlob($blob); to derive the original
|
||
value in versions of PHP before 4.1.0. </p>
|
||
|
||
<p>For PostgreSQL, you can store your blob using blob oid's or as a bytea field.
|
||
You can use bytea fields but not blob oid's currently with UpdateBlob( ).
|
||
Conversely UpdateBlobFile( ) supports oid's, but not bytea data.<br>
|
||
<br>
|
||
If you do not pass in an oid, then UpdateBlob() assumes that you are storing in
|
||
bytea fields. </p>
|
||
|
||
<p>If you do not have any blob fields, you can improve you can improve general
|
||
SQL query performance by disabling blob handling with
|
||
$connection->disableBlobs = true. </p>
|
||
|
||
<p><b>UpdateClob<a name=updateclob></a>($table,$column,$val,$where)</b></p>
|
||
|
||
<p class=MsoNormal>Allows you to store a clob (in $val) into $table into
|
||
$column in a row at $where. Similar to UpdateBlob (see above), but for
|
||
Character Large OBjects. </p>
|
||
|
||
<p>Usage: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># for oracle<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># non oracle databases<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');</pre></div>
|
||
|
||
<p><b>UpdateBlobFile<a name=updateblobfile></a>($table,$column,$path,$where,$blobtype='BLOB')</b></p>
|
||
|
||
<p>Similar to UpdateBlob, except that we pass in a file path to where the blob
|
||
resides. </p>
|
||
|
||
<p>For PostgreSQL, if you are using blob oid's, use this interface. This
|
||
interface does not support bytea fields. </p>
|
||
|
||
<p>Returns true if successful, false otherwise. </p>
|
||
|
||
<p><b>BlobEncode<a name=blobencode id=blobencode></a>($blob)</b> </p>
|
||
|
||
<p>Some databases require blob's to be encoded manually before upload. Note if
|
||
you use UpdateBlob( ) or UpdateBlobFile( ) the conversion is done automatically
|
||
for you and you do not have to call this function. For PostgreSQL, currently,
|
||
BlobEncode() can only be used for bytea fields. </p>
|
||
|
||
<p>Returns the encoded blob value. </p>
|
||
|
||
<p>Note that there is a connection property called <em>blobEncodeType</em>
|
||
which has 3 legal values: </p>
|
||
|
||
<p>false - no need to perform encoding or decoding.<br>
|
||
'I' - blob encoding required, and returned encoded blob is a numeric value (no
|
||
need to quote).<br>
|
||
'C' - blob encoding required, and returned encoded blob is a character value
|
||
(requires quoting). </p>
|
||
|
||
<p>This is purely for documentation purposes, so that programs that accept
|
||
multiple database drivers know what is the right thing to do when processing
|
||
blobs. </p>
|
||
|
||
<p><strong>BlobDecode<a name=blobdecode></a>($blob, $maxblobsize = false)</strong>
|
||
</p>
|
||
|
||
<p>Some databases require blob's to be decoded manually after doing a select
|
||
statement. If the database does not require decoding, then this function will
|
||
return the blob unchanged. Currently BlobDecode is only required for one
|
||
database, PostgreSQL, and only if you are using blob oid's (if you are using
|
||
bytea fields, we auto-decode for you). The default maxblobsize is set in
|
||
$connection->maxblobsize, which is set to 256K in adodb 4.54. </p>
|
||
|
||
<p>In ADOdb 4.54 and later, the blob is the return value. In earlier versions,
|
||
the blob data is sent to stdout.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute("select bloboid from postgres_table where id=$key");<br>
|
||
$blob = $db->BlobDecode( reset($rs->fields) );</pre></div>
|
||
|
||
<p><b>Replace<a name=replace></a>($table, $arrFields,
|
||
$keyCols,$autoQuote=false)</b></p>
|
||
|
||
<p>Try to update a record, and if the record is not found, an insert statement
|
||
is generated and executed. Returns 0 on failure, 1 if update statement worked,
|
||
2 if no record was found and the insert was executed successfully. This differs
|
||
from MySQL's replace which deletes the record and inserts a new record. This
|
||
also means you cannot update the primary key. The only exception to this is
|
||
Interbase and its derivitives, which uses delete and insert because of some
|
||
Interbase API limitations. </p>
|
||
|
||
<p>The parameters are $table which is the table name, the $arrFields which is
|
||
an associative array where the keys are the field names, and $keyCols is the
|
||
name of the primary key, or an array of field names if it is a compound key. If
|
||
$autoQuote is set to true, then Replace() will quote all values that are
|
||
non-numeric; auto-quoting will not quote nulls. Note that auto-quoting will not
|
||
work if you use SQL functions or operators. </p>
|
||
|
||
<p>Examples: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'># single field primary key<br>
|
||
$ret = $db->Replace('atable', <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'id',$autoquote = true);<span
|
||
style='mso-tab-count:1'><EFBFBD> </span><br>
|
||
# generates UPDATE atable SET firstname='Harun',lastname='Al-Rashid' WHERE id=1000<br>
|
||
# or INSERT INTO atable (id,firstname,lastname) VALUES (1000,'Harun','Al-Rashid')<br>
|
||
<br>
|
||
# compound key<br>
|
||
$ret = $db->Replace('atable2', <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('firstname'=>'Harun','lastname'=>'Al-Rashid', 'age' => 33, 'birthday' => 'null'),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('lastname','firstname'),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$autoquote = true);<br>
|
||
<br>
|
||
# no auto-quoting<br>
|
||
$ret = $db->Replace('atable2', <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('firstname'=>"'Harun'",'lastname'=>"'Al-Rashid'", 'age' => 'null'),<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array('lastname','firstname'));<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD> </span></pre></div>
|
||
|
||
<p><b>AutoExecute<a name=autoexecute></a>($table, $arrFields, $mode,
|
||
$where=false, $forceUpdate=true,$magicq=false)</b></p>
|
||
|
||
<p>Since ADOdb 4.56, you can automatically generate and execute INSERTs and
|
||
UPDATEs on a given table with this function, which is a wrapper for
|
||
GetInsertSQL() and GetUpdateSQL(). </p>
|
||
|
||
<p>AutoExecute() inserts or updates $table given an array of $arrFields, where
|
||
the keys are the field names and the array values are the field values to
|
||
store. Note that there is some overhead because the table is first queried to
|
||
extract key information before the SQL is generated. We generate an INSERT or
|
||
UPDATE based on $mode (see below). </p>
|
||
|
||
<p>Legal values for $mode are </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l5 level1 lfo9;tab-stops:list 36.0pt'>'INSERT' or 1 or DB_AUTOQUERY_INSERT
|
||
</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l5 level1 lfo9;tab-stops:list 36.0pt'>'UPDATE' or 2 or
|
||
DB_AUTOQUERY_UPDATE </li>
|
||
</ul>
|
||
|
||
<p>You have to define the constants DB_AUTOQUERY_UPDATE and DB_AUTOQUERY_INSERT
|
||
yourself or include adodb-pear.inc.php. </p>
|
||
|
||
<p>The $where clause is required if $mode == 'UPDATE'. If $forceUpdate=false
|
||
then we will query the database first and check if the field value returned by
|
||
the query matches the current field value; only if they differ do we update
|
||
that field. </p>
|
||
|
||
<p>Returns true on success, false on error. </p>
|
||
|
||
<p>An example of its use is: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$record["firstName"] = "Carol";</pre><pre>$record["lasTname"] = "Smith"; </pre><pre>$conn->AutoExecute($table,$record,'INSERT');</pre><pre># executes <i>"INSERT INTO $table (firstName,lasTname) values ('Carol',Smith')"</i>;</pre><pre><o:p> </o:p></pre><pre>$record["firstName"] = "Carol";</pre><pre>$record["lasTname"] = "Jones"; </pre><pre>$conn->AutoExecute($table,$record,'UPDATE', "lastname like 'Sm%'");</pre><pre># executes <i>"UPDATE $table SET firstName='Carol',lasTname='Jones' WHERE lastname like 'Sm%'"</i>;</pre></div>
|
||
|
||
<p>Note: One of the strengths of ADOdb's AutoExecute() is that only valid field
|
||
names for $table are updated. If $arrFields contains keys that are invalid
|
||
field names for $table, they are ignored. There is some overhead in doing this
|
||
as we have to query the database to get the field names, but given that you are
|
||
not directly coding the SQL yourself, you probably aren't interested in speed
|
||
at all, but convenience. </p>
|
||
|
||
<p>Since 4.62, the table name to be used can be overridden by setting
|
||
$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is
|
||
called. </p>
|
||
|
||
<p>Since 4.94, setting the global variable $ADODB_QUOTE_FIELDNAMES to true will
|
||
force field names to be auto-quoted in AutoExecute(), GetInsertSQL() and
|
||
GetUpdateSQL(). </p>
|
||
|
||
<p><b>GetUpdateSQL<a name=getupdatesql></a>(&$rs, $arrFields,
|
||
$forceUpdate=false,$magicq=false, $force=null)</b></p>
|
||
|
||
<p>Generate SQL to update a table given a recordset $rs, and the modified
|
||
fields of the array $arrFields (which must be an associative array holding the
|
||
column names and the new values) are compared with the current recordset. If
|
||
$forceUpdate is true, then we also generate the SQL even if $arrFields is
|
||
identical to $rs->fields. Requires the recordset to be associative. $magicq
|
||
is used to indicate whether magic quotes are enabled (see qstr()). The field
|
||
names in the array are case-insensitive.</p>
|
||
|
||
<p>Since 4.52, we allow you to pass the $force type parameter, and this
|
||
overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a> global
|
||
variable. </p>
|
||
|
||
<p>Since 4.62, the table name to be used can be overridden by setting
|
||
$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is
|
||
called. </p>
|
||
|
||
<p><b>GetInsertSQL<a name=getinsertsql></a>(&$rs, $arrFields,$magicq=false,$force_type=false)</b></p>
|
||
|
||
<p>Generate SQL to insert into a table given a recordset $rs. Requires the
|
||
query to be associative. $magicq is used to indicate whether magic quotes are
|
||
enabled (for qstr()). The field names in the array are case-insensitive.</p>
|
||
|
||
<p>Since 2.42, you can pass a table name instead of a recordset into
|
||
GetInsertSQL (in $rs), and it will generate an insert statement for that table.
|
||
</p>
|
||
|
||
<p>Since 4.52, we allow you to pass the $force_type parameter, and this
|
||
overrides the <a href="#ADODB_FORCE_TYPE">$ADODB_FORCE_TYPE</a> global
|
||
variable. </p>
|
||
|
||
<p>Since 4.62, the table name to be used can be overridden by setting
|
||
$rs->tableName before AutoExecute(), GetInsertSQL() or GetUpdateSQL() is
|
||
called. </p>
|
||
|
||
<p><b>PageExecute<a name=pageexecute></a>($sql, $nrows, $page, $inputarr=false)</b>
|
||
</p>
|
||
|
||
<p>Used for pagination of recordset. $page is 1-based. See <a href="#ex8">Example
|
||
8</a>.</p>
|
||
|
||
<p><b>CachePageExecute<a name=cachepageexecute></a>($secs2cache, $sql, $nrows,
|
||
$page, $inputarr=false)</b> </p>
|
||
|
||
<p>Used for pagination of recordset. $page is 1-based. See <a href="#ex8">Example
|
||
8</a>. Caching version of PageExecute.</p>
|
||
|
||
<p><b>Close<a name=close></a>( )</b></p>
|
||
|
||
<p>Close the database connection. PHP4 proudly states that we no longer have to
|
||
clean up at the end of the connection because the reference counting mechanism
|
||
of PHP4 will automatically clean up for us.</p>
|
||
|
||
<p><b>StartTrans<a name=starttrans></a>( )</b></p>
|
||
|
||
<p>Start a monitored transaction. As SQL statements are executed, ADOdb will
|
||
monitor for SQL errors, and if any are detected, when CompleteTrans() is
|
||
called, we auto-rollback. </p>
|
||
|
||
<p>To understand why StartTrans() is superior to BeginTrans(), let us examine a
|
||
few ways of using BeginTrans(). The following is the wrong way to use
|
||
transactions: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$DB->BeginTrans();<br>
|
||
$DB->Execute("update table1 set val=$val1 where id=$id");<br>
|
||
$DB->Execute("update table2 set val=$val2 where id=$id");<br>
|
||
$DB->CommitTrans();</pre></div>
|
||
|
||
<p>because you perform no error checking. It is possible to update table1 and
|
||
for the update on table2 to fail. Here is a better way: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$DB->BeginTrans();<br>
|
||
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");<br>
|
||
if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");<br>
|
||
if ($ok) $DB->CommitTrans();<br>
|
||
else $DB->RollbackTrans();</pre></div>
|
||
|
||
<p>Another way is (since ADOdb 2.0): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$DB->BeginTrans();<br>
|
||
$ok = $DB->Execute("update table1 set val=$val1 where id=$id");<br>
|
||
if ($ok) $ok = $DB->Execute("update table2 set val=$val2 where id=$id");<br>
|
||
$DB->CommitTrans($ok);</pre></div>
|
||
|
||
<p>Now it is a headache monitoring $ok all over the place. StartTrans() is an
|
||
improvement because it monitors all SQL errors for you. This is particularly
|
||
useful if you are calling black-box functions in which SQL queries might be
|
||
executed. Also all BeginTrans, CommitTrans and RollbackTrans calls inside a
|
||
StartTrans block will be disabled, so even if the black box function does a
|
||
commit, it will be ignored. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$DB->StartTrans();<br>
|
||
CallBlackBox();<br>
|
||
$DB->Execute("update table1 set val=$val1 where id=$id");<br>
|
||
$DB->Execute("update table2 set val=$val2 where id=$id");<br>
|
||
$DB->CompleteTrans();</pre></div>
|
||
|
||
<p>Note that a StartTrans blocks are nestable, the inner blocks are ignored. </p>
|
||
|
||
<p><b>CompleteTrans<a name=completetrans></a>($autoComplete=true)</b></p>
|
||
|
||
<p>Complete a transaction called with StartTrans(). This function monitors for
|
||
SQL errors, and will commit if no errors have occured, otherwise it will
|
||
rollback. Returns true on commit, false on rollback. If the parameter
|
||
$autoComplete is true monitor sql errors and commit and rollback as
|
||
appropriate. Set $autoComplete to false to force rollback even if no SQL error
|
||
detected. </p>
|
||
|
||
<p><b>FailTrans<a name=failtrans></a>( )</b></p>
|
||
|
||
<p>Fail a transaction started with StartTrans(). The rollback will only occur
|
||
when CompleteTrans() is called. </p>
|
||
|
||
<p><b>HasFailedTrans<a name=hasfailedtrans></a>( )</b></p>
|
||
|
||
<p>Check whether smart transaction has failed, eg. returns true if there was an
|
||
error in SQL execution or FailTrans() was called. If not within smart
|
||
transaction, returns false. </p>
|
||
|
||
<p><b>BeginTrans<a name=begintrans></a>( )</b></p>
|
||
|
||
<p>Begin a transaction. Turns off autoCommit. Returns true if successful. Some
|
||
databases will always return false if transaction support is not available. Any
|
||
open transactions will be rolled back when the connection is closed. Among the
|
||
databases that support transactions are Oracle, PostgreSQL, Interbase, MSSQL,
|
||
certain versions of MySQL, DB2, Informix, Sybase, etc.</p>
|
||
|
||
<p>Note that <a href="#starttrans">StartTrans()</a> and CompleteTrans() is a
|
||
superior method of handling transactions, available since ADOdb 3.40. For a
|
||
explanation, see the <a href="#starttrans">StartTrans()</a> documentation. </p>
|
||
|
||
<p>You can also use the ADOdb <a href="#errorhandling">error handler</a> to die
|
||
and rollback your transactions for you transparently. Some buggy database
|
||
extensions are known to commit all outstanding tranasactions, so you might want
|
||
to explicitly do a $DB->RollbackTrans() in your error handler for safety. </p>
|
||
|
||
<h4>Detecting Transactions</h4>
|
||
|
||
<p>Since ADOdb 2.50, you are able to detect when you are inside a transaction.
|
||
Check that $connection->transCnt > 0. This variable is incremented whenever
|
||
BeginTrans() is called, and decremented whenever RollbackTrans() or
|
||
CommitTrans() is called. </p>
|
||
|
||
<p><b>CommitTrans<a name=committrans></a>($ok=true)</b></p>
|
||
|
||
<p>End a transaction successfully. Returns true if successful. If the database
|
||
does not support transactions, will return true also as data is always
|
||
committed. </p>
|
||
|
||
<p>If you pass the parameter $ok=false, the data is rolled back. See example in
|
||
BeginTrans().</p>
|
||
|
||
<p><b>RollbackTrans<a name=rollbacktrans></a>( )</b></p>
|
||
|
||
<p>End a transaction, rollback all changes. Returns true if successful. If the
|
||
database does not support transactions, will return false as data is never
|
||
rollbacked. </p>
|
||
|
||
<p><b>SetTransactionMode<a name=SetTransactionMode></a>($mode )</b></p>
|
||
|
||
<p>SetTransactionMode allows you to pass in the transaction mode to use for all
|
||
subsequent transactions. Note: if you have persistent connections and using
|
||
mssql or mysql, you might have to explicitly reset your transaction mode at the
|
||
beginning of each page request. This is only supported in postgresql, mssql,
|
||
mysql with InnoDB and oci8 currently. For example: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$db->SetTransactionMode("SERIALIZABLE");</pre><pre>$db->BeginTrans();</pre><pre>$db->Execute(...); $db->Execute(...);</pre><pre>$db->CommiTrans();</pre><pre><o:p> </o:p></pre><pre>$db->SetTransactionMode(""); // restore to default</pre><pre>$db->StartTrans();</pre><pre>$db->Execute(...); $db->Execute(...);</pre><pre>$db->CompleteTrans();</pre></div>
|
||
|
||
<p>Supported values to pass in: </p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>READ UNCOMMITTED (allows
|
||
dirty reads, but fastest) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>READ COMMITTED (default
|
||
postgres, mssql and oci8) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>REPEATABLE READ (default
|
||
mysql) </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l1 level1 lfo10;tab-stops:list 36.0pt'>SERIALIZABLE (slowest and
|
||
most restrictive) </li>
|
||
</ul>
|
||
|
||
<p>You can also pass in database specific values such as 'SNAPSHOT' for mssql
|
||
or 'READ ONLY' for oci8/postgres. </p>
|
||
|
||
<p>See transaction levels for <a
|
||
href="http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html">PostgreSQL</a>,
|
||
<a
|
||
href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm">Oracle</a>,
|
||
<a href="http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html">MySQL</a>,
|
||
and <a href="http://msdn2.microsoft.com/en-US/ms173763.aspx">MS SQL Server</a>.
|
||
</p>
|
||
|
||
<p><b>GetAssoc<a name=getassoc1></a>($sql,$inputarr=false,$force_array=false,$first2cols=false)</b></p>
|
||
|
||
<p>Returns an associative array for the given query $sql with optional bind
|
||
parameters in $inputarr. If the number of columns returned is greater to two, a
|
||
2-dimensional array is returned, with the first column of the recordset becomes
|
||
the keys to the rest of the rows. If the columns is equal to two, a 1-dimensional
|
||
array is created, where the the keys directly map to the values (unless
|
||
$force_array is set to true, when an array is created for each value). </p>
|
||
|
||
<p>Examples:<a name=getassocex></a></p>
|
||
|
||
<p>We have the following data in a recordset:</p>
|
||
|
||
<p>row1: Apple, Fruit, Edible<br>
|
||
row2: Cactus, Plant, Inedible<br>
|
||
row3: Rose, Flower, Edible</p>
|
||
|
||
<p>GetAssoc will generate the following 2-dimensional associative array:</p>
|
||
|
||
<p>Apple => array[Fruit, Edible]<br>
|
||
Cactus => array[Plant, Inedible]<br>
|
||
Rose => array[Flower,Edible]</p>
|
||
|
||
<p>If the dataset is:</p>
|
||
|
||
<p>row1: Apple, Fruit<br>
|
||
row2: Cactus, Plant<br>
|
||
row3: Rose, Flower </p>
|
||
|
||
<p>GetAssoc will generate the following 1-dimensional associative array (with
|
||
$force_array==false):</p>
|
||
|
||
<p>Apple => Fruit<br>
|
||
Cactus=>Plant<br>
|
||
Rose=>Flower </p>
|
||
|
||
<p>The function returns:</p>
|
||
|
||
<p>The associative array, or false if an error occurs.</p>
|
||
|
||
<p><b>CacheGetAssoc<a name=cachegetassoc></a>([$secs2cache,] $sql,$inputarr=false,$force_array=false,$first2cols=false)</b></p>
|
||
|
||
<p>Caching version of <a href="#getassoc1">GetAssoc</a> function above. </p>
|
||
|
||
<p><b>GetMedian<a name=getmedian></a>($table, $field, $where='')</b></p>
|
||
|
||
<p>Returns the median value of $field for $table. The $where clause is
|
||
optional. If used, make sure the WHERE is included, as in "WHERE name >
|
||
'A'". If an error occurs, false is returned. Since ADOdb 5.06 and PHP
|
||
4.991. </p>
|
||
|
||
<p><b>GetOne<a name=getone></a>($sql,$inputarr=false)</b></p>
|
||
|
||
<p>Executes the SQL and returns the first field of the first row. The recordset
|
||
and remaining rows are discarded for you automatically. If an error occur,
|
||
false is returned; use ErrorNo() or ErrorMsg() to get the error details. Since
|
||
4.96/5.00, we return null if no records were found. And since 4.991/5.06, you
|
||
can have change the return value if no records are found using the global
|
||
variable $ADODB_GETONE_EOF: $ADODB_GETONE_EOF = false;</p>
|
||
|
||
<p><b>GetRow<a name=getrow></a>($sql,$inputarr=false)</b></p>
|
||
|
||
<p>Executes the SQL and returns the first row as an array. The recordset and
|
||
remaining rows are discarded for you automatically. If no records are returned,
|
||
an empty array is returned. If an error occurs, false is returned.</p>
|
||
|
||
<p><b>GetAll<a name=getall></a>($sql,$inputarr=false)</b></p>
|
||
|
||
<p>Executes the SQL and returns the all the rows as a 2-dimensional array. The
|
||
recordset is discarded for you automatically. If an error occurs, false is
|
||
returned. <i>GetArray</i> is a synonym for <i>GetAll</i>.</p>
|
||
|
||
<p><b>GetCol<a name=getcol></a>($sql,$inputarr=false,$trim=false)</b></p>
|
||
|
||
<p>Executes the SQL and returns all elements of the first column as a
|
||
1-dimensional array. The recordset is discarded for you automatically. If an
|
||
error occurs, false is returned.</p>
|
||
|
||
<p><b>CacheGetOne<a name=cachegetone></a>([$secs2cache,] $sql,$inputarr=false),
|
||
CacheGetRow<a name=cachegetrow></a>([$secs2cache,] $sql,$inputarr=false),
|
||
CacheGetAll<a name=cachegetall></a>([$secs2cache,] $sql,$inputarr=false),
|
||
CacheGetCol<a name=cachegetcol></a>([$secs2cache,]
|
||
$sql,$inputarr=false,$trim=false)</b></p>
|
||
|
||
<p>Similar to above Get* functions, except that the recordset is serialized and
|
||
cached in the $ADODB_CACHE_DIR directory for $secs2cache seconds. Good for
|
||
speeding up queries on rarely changing data. Note that the $secs2cache
|
||
parameter is optional. If omitted, we use the value in
|
||
$connection->cacheSecs (default is 3600 seconds, or 1 hour). </p>
|
||
|
||
<p><b>Prepare<a name=prepare></a>($sql )</b></p>
|
||
|
||
<p>Prepares (compiles) an SQL query for repeated execution. Bind parameters are
|
||
denoted by ?, except for the oci8 driver, which uses the traditional Oracle
|
||
:varname convention. </p>
|
||
|
||
<p>Returns an array containing the original sql statement in the first array
|
||
element; the remaining elements of the array are driver dependent. If there is
|
||
an error, or we are emulating Prepare( ), we return the original $sql string.
|
||
This is because all error-handling has been centralized in Execute( ).</p>
|
||
|
||
<p>Prepare( ) cannot be used with functions that use SQL query rewriting
|
||
techniques, e.g. PageExecute( ) and SelectLimit( ).</p>
|
||
|
||
<p>Example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$stmt = $DB->Prepare('insert into table (col1,col2) values (?,?)');<br>
|
||
for ($i=0; $i < $max; $i++)<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->Execute($stmt,array((string) rand(), $i));</pre></div>
|
||
|
||
<p>Also see InParameter(), OutParameter() and PrepareSP() below. Only supported
|
||
internally by interbase, oci8 and selected ODBC-based drivers, otherwise it is
|
||
emulated. There is no performance advantage to using Prepare() with emulation. </p>
|
||
|
||
<p>Important: Due to limitations or bugs in PHP, if you are getting errors when
|
||
you using prepared queries, try setting $ADODB_COUNTRECS = false before
|
||
preparing. This behaviour has been observed with ODBC. </p>
|
||
|
||
<p><b>IfNull<a name=ifnull></a>($field, $nullReplacementValue)</b></p>
|
||
|
||
<p>Portable IFNULL function (NVL in Oracle). Returns a string that represents
|
||
the function that checks whether a $field is null for the given database, and
|
||
if null, change the value returned to $nullReplacementValue. Eg.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$sql = <span style='color:#993300'>'SELECT '</span>.$db->IfNull('name', <span
|
||
style='color:#993300'>"'- unknown -'"</span>).<span style='color:
|
||
#993300'> ' FROM table'</span>;</pre></div>
|
||
|
||
<p><b>length</b><a name=length></a></p>
|
||
|
||
<p>This is not a function, but a property. Some databases have
|
||
"length" and others "len" as the function to measure the
|
||
length of a string. To use this property: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span>$sql = <span
|
||
style='color:#993300'>"SELECT "</span>.$db->length.<span
|
||
style='color:#993300'>"(field) from table"</span>;<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$rs = $db->Execute($sql);</pre></div>
|
||
|
||
<p><b>random</b><a name=random></a></p>
|
||
|
||
<p>This is not a function, but a property. This is a string that holds the sql
|
||
to generate a random number between 0.0 and 1.0 inclusive. </p>
|
||
|
||
<p><b>substr</b><a name=substr></a></p>
|
||
|
||
<p>This is not a function, but a property. Some databases have
|
||
"substr" and others "substring" as the function to retrieve
|
||
a sub-string. To use this property: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span>$sql = <span
|
||
style='color:#993300'>"SELECT "</span>.$db->substr.<span
|
||
style='color:#993300'>"(field, $offset, $length) from table"</span>;<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span>$rs = $db->Execute($sql);</pre></div>
|
||
|
||
<p>For all databases, the 1st parameter of <i>substr</i> is the field, the 2nd
|
||
is the offset (1-based) to the beginning of the sub-string, and the 3rd is the
|
||
length of the sub-string. </p>
|
||
|
||
<p><b>Param<a name=param></a>($name)</b></p>
|
||
|
||
<p>Generates a bind placeholder portably. For most databases, the bind
|
||
placeholder is "?". However some databases use named bind parameters
|
||
such as Oracle, eg ":somevar". This allows us to portably define an
|
||
SQL statement with bind parameters: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$sql = <span style='color:#993300'>'insert into table (col1,col2) values ('</span>.$DB->Param('a').<span
|
||
style='color:#993300'>','</span>.$DB->Param('b').<span style='color:#993300'>')'</span>;<br>
|
||
<span style='color:#006600'># generates 'insert into table (col1,col2) values (?,?)'<br>
|
||
# or<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'insert into table (col1,col2) values (:a,:b)</span>'<br>
|
||
$stmt = $DB->Prepare($sql);<br>
|
||
$stmt = $DB->Execute($stmt,array('one','two'));</pre></div>
|
||
|
||
<p><b>PrepareSP<a name=preparesp></a>($sql, $cursor=false )</b></p>
|
||
|
||
<p>When calling stored procedures in mssql and oci8 (oracle), and you might
|
||
want to directly bind to parameters that return values, or for special LOB
|
||
handling. PrepareSP() allows you to do so. </p>
|
||
|
||
<p>Returns the same array or $sql string as Prepare( ) above. If you do not
|
||
need to bind to return values, you should use Prepare( ) instead.</p>
|
||
|
||
<p>The 2nd parameter, $cursor is not used except with oci8. Setting it to true
|
||
will force OCINewCursor to be called; this is to support output REF CURSORs. </p>
|
||
|
||
<p>For examples of usage of PrepareSP( ), see InParameter( ) below. </p>
|
||
|
||
<p>Note: in the mssql driver, preparing stored procedures requires a special
|
||
function call, mssql_init( ), which is called by this function. PrepareSP( ) is
|
||
available in all other drivers, and is emulated by calling Prepare( ). </p>
|
||
|
||
<p><b>InParameter<a name=inparameter></a>($stmt, $var, $name, $maxLen = 4000,
|
||
$type = false )</b></p>
|
||
|
||
<p class=MsoNormal>Binds a PHP variable as input to a stored procedure
|
||
variable. The parameter <i>$stmt</i> is the value returned by PrepareSP(), <i>$var</i>
|
||
is the PHP variable you want to bind, $name is the name of the stored procedure
|
||
variable. Optional is <i>$maxLen</i>, the maximum length of the data to bind,
|
||
and $type which is database dependant. Consult <a
|
||
href="http://php.net/mssql_bind">mssql_bind</a> and <a
|
||
href="http://php.net/ocibindbyname">ocibindbyname</a> docs at php.net for more
|
||
info on legal values for $type. </p>
|
||
|
||
<p>InParameter() is a wrapper function that calls Parameter() with
|
||
$isOutput=false. The advantage of this function is that it is self-documenting,
|
||
because the $isOutput parameter is no longer needed. Only for mssql and oci8
|
||
currently. </p>
|
||
|
||
<p>Here is an example using oci8: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='color:green'># For oracle, Prepare and PrepareSP are identical</span></pre><pre>$stmt = $db->PrepareSP(</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span
|
||
style='color:#993300'>"declare RETVAL integer; <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>begin<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>:RETVAL := SP_RUNSOMETHING(:myid,:group);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>end;"</span>);<br>
|
||
$db->InParameter($stmt,$id,'myid');<br>
|
||
$db->InParameter($stmt,$group,'group',64);<br>
|
||
$db->OutParameter($stmt,$ret,'RETVAL');<br>
|
||
$db->Execute($stmt);</pre></div>
|
||
|
||
<p>The same example using mssql:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='color:green'># @RETVAL = SP_RUNSOMETHING @myid,@group</span></pre><pre>$stmt = $db->PrepareSP(<span
|
||
style='color:#993333'>'</span><span style='color:#993300'>SP_RUNSOMETHING</span><span
|
||
style='color:#993333'>'</span>); <br>
|
||
<span style='color:green'># note that the parameter name does not have @ in front!</span></pre><pre>$db->InParameter($stmt,$id,'myid');</pre><pre>$db->InParameter($stmt,$group,'group',64);</pre><pre
|
||
style='background:#EEEEEE'><span style='color:green'># return value in mssql - RETVAL is hard-coded name</span> <br>
|
||
$db->OutParameter($stmt,$ret,'RETVAL');<br>
|
||
$db->Execute($stmt); </pre></div>
|
||
|
||
<p>Note that the only difference between the oci8 and mssql implementations is
|
||
$sql.</p>
|
||
|
||
<p>If $type parameter is set to false, in mssql, $type will be dynamicly
|
||
determined based on the type of the PHP variable passed <span style='font-family:
|
||
"Courier New"'>(string => SQLCHAR, boolean =>SQLINT1, integer
|
||
=>SQLINT4 or float/double=>SQLFLT8)</span>. </p>
|
||
|
||
<p>In oci8, $type can be set to OCI_B_FILE (Binary-File), OCI_B_CFILE
|
||
(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and
|
||
OCI_B_ROWID (ROWID). To pass in a null, use<span style='font-family:"Courier New"'>
|
||
$db->Parameter($stmt, $null=null, 'param')</span>. </p>
|
||
|
||
<p><b>OutParameter<a name=outparameter></a>($stmt, $var, $name, $maxLen = 4000,
|
||
$type = false )</b></p>
|
||
|
||
<p class=MsoNormal>Binds a PHP variable as output from a stored procedure
|
||
variable. The parameter <i>$stmt</i> is the value returned by PrepareSP(), <i>$var</i>
|
||
is the PHP variable you want to bind, <i>$name</i> is the name of the stored
|
||
procedure variable. Optional is <i>$maxLen</i>, the maximum length of the data
|
||
to bind, and <i>$type</i> which is database dependant. </p>
|
||
|
||
<p>OutParameter() is a wrapper function that calls Parameter() with
|
||
$isOutput=true. The advantage of this function is that it is self-documenting,
|
||
because the $isOutput parameter is no longer needed. Only for mssql and oci8
|
||
currently. </p>
|
||
|
||
<p>For an example, see <a href="#inparameter">InParameter</a>. </p>
|
||
|
||
<p><b>Parameter<a name=parameter></a>($stmt, $var, $name, $isOutput=false,
|
||
$maxLen = 4000, $type = false )</b></p>
|
||
|
||
<p>Note: This function is deprecated, because of the new InParameter() and
|
||
OutParameter() functions. These are superior because they are self-documenting,
|
||
unlike Parameter(). </p>
|
||
|
||
<p>Adds a bind parameter suitable for return values or special data handling
|
||
(eg. LOBs) after a statement has been prepared using PrepareSP(). Only for
|
||
mssql and oci8 currently. The parameters are:<br>
|
||
<br>
|
||
$<b><i>stmt</i></b> Statement returned by Prepare() or PrepareSP().<br>
|
||
$<b><i>var</i></b> PHP variable to bind to. Make sure you pre-initialize it!<br>
|
||
$<b><i>name</i></b> Name of stored procedure variable name to bind to.<br>
|
||
[$<b><i>isOutput</i></b>] Indicates direction of parameter 0/false=IN 1=OUT 2=
|
||
IN/OUT. This is ignored in oci8 as this driver auto-detects the direction.<br>
|
||
[$<b>maxLen</b>] Maximum length of the parameter variable.<br>
|
||
[$<b>type</b>] Consult <a href="http://php.net/mssql_bind">mssql_bind</a> and <a
|
||
href="http://php.net/ocibindbyname">ocibindbyname</a> docs at php.net for more
|
||
info on legal values for type.</p>
|
||
|
||
<p>Lastly, in oci8, bind parameters can be reused without calling PrepareSP( ) or
|
||
Parameters again. This is not possible with mssql. An oci8 example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre>$id = 0; $i = 0;<br>
|
||
$stmt = $db->PrepareSP( <span style='color:#993300'>"update table set val=:i where id=:id"</span>);<br>
|
||
$db->Parameter($stmt,$id,'id');<br>
|
||
$db->Parameter($stmt,$i, 'i');<br>
|
||
for ($cnt=0; $cnt < 1000; $cnt++) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$id = $cnt; <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$i = $cnt * $cnt; <span
|
||
style='color:green'># works with oci8!</span></pre><pre style='background:#EEEEEE'><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute($stmt); <br>
|
||
}</pre></div>
|
||
|
||
<p><b>Bind<a name=bind></a>($stmt, $var, $size=4001, $type=false, $name=false)</b></p>
|
||
|
||
<p>This is a low-level function supported only by the oci8 driver. <b>Avoid
|
||
using</b> unless you only want to support Oracle. The Parameter( ) function is
|
||
the recommended way to go with bind variables.</p>
|
||
|
||
<p>Bind( ) allows you to use bind variables in your sql statement. This binds a
|
||
PHP variable to a name defined in an Oracle sql statement that was previously
|
||
prepared using Prepare(). Oracle named variables begin with a colon, and ADOdb
|
||
requires the named variables be called :0, :1, :2, :3, etc. The first
|
||
invocation of Bind() will match :0, the second invocation will match :1, etc.
|
||
Binding can provide 100% speedups for insert, select and update statements. </p>
|
||
|
||
<p>The other variables, $size sets the buffer size for data storage, $type is
|
||
the optional descriptor type OCI_B_FILE (Binary-File), OCI_B_CFILE
|
||
(Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) and
|
||
OCI_B_ROWID (ROWID). Lastly, instead of using the default :0, :1, etc names,
|
||
you can define your own bind-name using $name. </p>
|
||
|
||
<p>The following example shows 3 bind variables being used: p1, p2 and p3.
|
||
These variables are bound to :0, :1 and :2.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");<br>
|
||
$DB->Bind($stmt, $p1);<br>
|
||
$DB->Bind($stmt, $p2);<br>
|
||
$DB->Bind($stmt, $p3);<br>
|
||
for ($i = 0; $i < $max; $i++) { <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$p1 = ?; $p2 = ?; $p3 = ?;<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$DB->Execute($stmt);<br>
|
||
}</pre></div>
|
||
|
||
<p>You can also use named variables:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:name0, :name1, :name2)");<br>
|
||
$DB->Bind($stmt, $p1, "name0");<br>
|
||
$DB->Bind($stmt, $p2, "name1");<br>
|
||
$DB->Bind($stmt, $p3, "name2");<br>
|
||
for ($i = 0; $i < $max; $i++) { <br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$p1 = ?; $p2 = ?; $p3 = ?;<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$DB->Execute($stmt);<br>
|
||
}</pre></div>
|
||
|
||
<p><b>LogSQL($enable=true)</b><a name=logsql></a></p>
|
||
|
||
<p class=MsoNormal>Call this method to install a SQL logging and timing
|
||
function (using fnExecute). Then all SQL statements are logged into an
|
||
adodb_logsql table in a database. If the adodb_logsql table does not exist,
|
||
ADOdb will create the table if you have the appropriate permissions. Returns
|
||
the previous logging value (true for enabled, false for disabled). Here are
|
||
samples of the DDL for selected databases: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>mysql:</b></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>CREATE TABLE adodb_logsql (</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>created datetime NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql1 text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>params text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>tracer text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>timer decimal(16,6) NOT NULL</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>)</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>postgres:</b></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>CREATE TABLE adodb_logsql (</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>created timestamp NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql1 text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>params text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>tracer text NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>timer decimal(16,6) NOT NULL</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>)</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>mssql:</b></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>CREATE TABLE adodb_logsql (</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>created datetime NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql1 varchar(4000) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>params varchar(3000) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>tracer varchar(500) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>timer decimal(16,6) NOT NULL</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>)</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><b>oci8:</b></pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>CREATE TABLE adodb_logsql (</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>created date NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>sql1 varchar(4000) NOT NULL,</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>params varchar(4000),</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>tracer varchar(4000),</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>timer decimal(16,6) NOT NULL</pre><pre><span
|
||
style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>)</pre></div>
|
||
|
||
<p class=MsoNormal>Usage: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->LogSQL(); // turn on logging<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>:<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->Execute(...);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD> </span>:<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn->LogSQL(false); // turn off logging<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span># output summary of SQL logging results<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$perf = NewPerfMonitor($conn);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo $perf->SuspiciousSQL();<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo $perf->ExpensiveSQL();</pre></div>
|
||
|
||
<p>One limitation of logging is that rollback also prevents SQL from being
|
||
logged. </p>
|
||
|
||
<p>If you prefer to use another name for the table used to store the SQL, you
|
||
can override it by calling adodb_perf::table($tablename), where $tablename is
|
||
the new table name (you will still need to manually create the table yourself).
|
||
An example: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>include('adodb.inc.php');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>include('adodb-perf.inc.php');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>adodb_perf::table('my_logsql_table');</pre></div>
|
||
|
||
<p class=MsoNormal>Also see <a href="docs-perf.htm">Performance Monitor</a>. </p>
|
||
|
||
<p><b>fnExecute and fnCacheExecute properties</b><a name=fnexecute
|
||
id=fnexecute></a></p>
|
||
|
||
<p>These two properties allow you to define bottleneck functions for all sql
|
||
statements processed by ADOdb. This allows you to perform statistical analysis
|
||
and query-rewriting of your sql. </p>
|
||
|
||
<p><b>Examples of fnExecute</b></p>
|
||
|
||
<p>Here is an example of using fnExecute, to count all cached queries and
|
||
non-cached queries, you can do this:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span
|
||
style='color:#006600'># $db is the connection object</span></pre><pre>function &CountExecs($db, $sql, $inputarray)</pre><pre>{</pre><pre>global $EXECS;</pre><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>if (!is_array(inputarray)) $EXECS++;</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='color:#006600'># handle 2-dimensional input arrays</span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>else $EXECS++;</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='color:#006600'># in PHP4.4 and PHP5, we need to return a value by reference</span></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$null = null;</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>return $null;</pre><pre>}</pre><pre><o:p> </o:p></pre><pre><span
|
||
style='color:#006600'># $db is the connection object</span></pre><pre>function CountCachedExecs($db, $secs2cache, $sql, $inputarray)</pre><pre
|
||
style='background:#EEEEEE'>{<br>
|
||
global $CACHED; $CACHED++;<br>
|
||
}<br>
|
||
<br>
|
||
$db = NewADOConnection('mysql');<br>
|
||
$db->Connect(...);<br>
|
||
$db-><strong><span style='font-family:"Courier New"'>fnExecute</span></strong> = 'CountExecs';<br>
|
||
$db-><strong><span style='font-family:"Courier New"'>fnCacheExecute</span></strong> = 'CountCachedExecs';<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>:<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>:<br>
|
||
<span style='color:#006600'># After many sql statements:</span>`<br>
|
||
printf("<p>Total queries=%d; total cached=%d</p>",$EXECS+$CACHED, $CACHED);</pre></div>
|
||
|
||
<p>The fnExecute function is called before the sql is parsed and executed, so
|
||
you can perform a query rewrite. If you are passing in a prepared statement,
|
||
then $sql is an array (see <a href="#prepare">Prepare</a>). The fnCacheExecute
|
||
function is only called if the recordset returned was cached. The function
|
||
parameters match the Execute and CacheExecute functions respectively, except
|
||
that $this (the connection object) is passed as the first parameter.</p>
|
||
|
||
<p>Since ADOdb 3.91, the behaviour of fnExecute varies depending on whether the
|
||
defined function returns a value. If it does not return a value, then the $sql
|
||
is executed as before. This is useful for query rewriting or counting sql
|
||
queries. </p>
|
||
|
||
<p>On the other hand, you might want to replace the Execute function with one
|
||
of your own design. If this is the case, then have your function return a
|
||
value. If a value is returned, that value is returned immediately, without any
|
||
further processing. This is used internally by ADOdb to implement LogSQL()
|
||
functionality. </p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h3>ADOConnection Utility Functions</h3>
|
||
|
||
<p><b>BlankRecordSet<a name=blankrecordset></a>([$queryid])</b></p>
|
||
|
||
<p>No longer available - removed since 1.99.</p>
|
||
|
||
<p><b>Concat<a name=concat></a>($s1,$s2,....)</b></p>
|
||
|
||
<p>Generates the sql string used to concatenate $s1, $s2, etc together. Uses
|
||
the string in the concat_operator field to generate the concatenation. Override
|
||
this function if a concatenation operator is not used, eg. MySQL.</p>
|
||
|
||
<p>Returns the concatenated string.</p>
|
||
|
||
<p><b>DBDate<a name=dbdate></a>($date)</b></p>
|
||
|
||
<p>Format the $<b>date</b> in the format the database accepts - the return
|
||
string is also quoted. This is used when you are sending dates to the database
|
||
(eg INSERT, UPDATE or where clause of SELECT statement). The $<b>date</b>
|
||
parameter can be a Unix integer timestamp or an ISO format Y-m-d. Uses the
|
||
fmtDate field, which holds the format to use. If null or false or '' is passed
|
||
in, it will be converted to an SQL null.</p>
|
||
|
||
<p>Returns the date as a quoted string.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ".$db->DBDate("$year-$month-$day");</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute($sql);</pre></div>
|
||
|
||
<p>Note to retrieve a date column in a specific format, use <a href="#sqldate">SQLDate</a>.
|
||
</p>
|
||
|
||
<p><b>BindDate<a name=binddate></a>($date)</b></p>
|
||
|
||
<p>Format the $<b>date</b> in the bind format the database accepts. Normally
|
||
this means that the date string is not quoted, unlike DBDate, which quotes the
|
||
string. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ".$db->Param('0');</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>// or</pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ?";</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute($sql,array($db->BindDate("$year-$month-$day"));</pre></div>
|
||
|
||
<p><b>DBTimeStamp<a name=dbtimestamp></a>($ts)</b></p>
|
||
|
||
<p>Format the timestamp $<b>ts</b> in the format the database accepts; this can
|
||
be a Unix integer timestamp or an ISO format Y-m-d H:i:s. Uses the fmtTimeStamp
|
||
field, which holds the format to use. If null or false or '' is passed in, it
|
||
will be converted to an SQL null.</p>
|
||
|
||
<p>Returns the timestamp as a quoted string.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ".$db->DBTimeStamp("$year-$month-$day $hr:$min:$secs");</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute($sql);</pre></div>
|
||
|
||
<p><b>BindTimeStamp<a name=bindtimestamp></a>($ts)</b></p>
|
||
|
||
<p>Format the timestamp $<b>ts</b> in the bind format the database accepts.
|
||
Normally this means that the timestamp string is not quoted, unlike
|
||
DBTimeStamp, which quotes the string. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ".$db->Param('0');</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>// or</pre><pre><span style='mso-tab-count:
|
||
1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "select * from atable where created > ?";</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$db->Execute($sql,array($db->BindTimeStamp("$year-$month-$day $hr:$min:$secs"));</pre></div>
|
||
|
||
<p><b>qstr<a name=qstr></a>($s,[$magic_quotes_enabled</b>=false]<b>)</b></p>
|
||
|
||
<p>Quotes a string to be sent to the database. The $<b>magic_quotes_enabled</b>
|
||
parameter may look funny, but the idea is if you are quoting a string extracted
|
||
from a POST/GET variable, then pass get_magic_quotes_gpc() as the second
|
||
parameter. This will ensure that the variable is not quoted twice, once by <i>qstr</i>
|
||
and once by the <i>magic_quotes_gpc</i>.</p>
|
||
|
||
<p>Eg.<span style='font-family:"Courier New"'> $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());</span></p>
|
||
|
||
<p>Returns the quoted string.</p>
|
||
|
||
<p><b>Quote<a name=quote></a>($s)</b></p>
|
||
|
||
<p>Quotes the string $s, escaping the database specific quote character as
|
||
appropriate. Formerly checked magic quotes setting, but this was disabled since
|
||
3.31 for compatibility with PEAR DB. </p>
|
||
|
||
<p><b>Affected_Rows<a name="affected_rows"></a>( )</b></p>
|
||
|
||
<p>Returns the number of rows affected by a update or delete statement. Returns
|
||
false if function not supported.</p>
|
||
|
||
<p>Not supported by interbase/firebird currently. </p>
|
||
|
||
<p><b>Insert_ID<a name="inserted_id"></a>( )</b></p>
|
||
|
||
<p>Returns the last autonumbering ID inserted. Returns false if function not
|
||
supported. </p>
|
||
|
||
<p>Only supported by databases that support auto-increment or object id's, such
|
||
as PostgreSQL, MySQL and MS SQL Server currently. PostgreSQL returns the OID,
|
||
which can change on a database reload.</p>
|
||
|
||
<p><b>RowLock<a name=rowlock></a>($table,$where)</b></p>
|
||
|
||
<p>Lock a table row for the duration of a transaction. For example to lock
|
||
record $id in table1: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->StartTrans();<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->RowLock("table1","rowid=$id");<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->Execute($sql1);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->Execute($sql2);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$DB->CompleteTrans();</pre></div>
|
||
|
||
<p>Supported in db2, interbase, informix, mssql, oci8, postgres, sybase. </p>
|
||
|
||
<p><b>MetaDatabases<a name=metadatabases></a>()</b></p>
|
||
|
||
<p>Returns a list of databases available on the server as an array. You have to
|
||
connect to the server first. Only available for ODBC, MySQL and ADO.</p>
|
||
|
||
<p><b>MetaTables<a name=metatables></a>($ttype = false, $showSchema = false,
|
||
$mask=false)</b></p>
|
||
|
||
<p>Returns an array of tables and views for the current database as an array.
|
||
The array should exclude system catalog tables if possible. To only show
|
||
tables, use $db->MetaTables('TABLES'). To show only views, use
|
||
$db->MetaTables('VIEWS'). The $showSchema parameter currently works only for
|
||
DB2, and when set to true, will add the schema name to the table, eg.
|
||
"SCHEMA.TABLE". </p>
|
||
|
||
<p>You can define a mask for matching. For example, setting $mask = 'TMP%' will
|
||
match all tables that begin with 'TMP'. Currently only mssql, oci8, odbc_mssql
|
||
and postgres* support $mask. </p>
|
||
|
||
<p><b>MetaColumns<a name=metacolumns></a>($table,$notcasesensitive=true)</b></p>
|
||
|
||
<p>Returns an array of ADOFieldObject's, one field object for every column of
|
||
$table. A field object is a class instance with (name, type, max_length)
|
||
defined. Currently Sybase does not recognise date types, and ADO cannot
|
||
identify the correct data type (so we default to varchar). </p>
|
||
|
||
<p>The $notcasesensitive parameter determines whether we uppercase or lowercase
|
||
the table name to normalize it (required for some databases). Does not work
|
||
with MySQL ISAM tables. </p>
|
||
|
||
<p>For schema support, pass in the $table parameter,
|
||
"$schema.$tablename". This is only supported for selected databases. </p>
|
||
|
||
<p><b>MetaColumnNames<a name=metacolumnames></a>($table,$numericIndex=false)</b></p>
|
||
|
||
<p>Returns an array of column names for $table. Since ADOdb 4.22, this is an
|
||
associative array, with the keys in uppercase. Set $numericIndex=true if you
|
||
want the old behaviour of numeric indexes (since 4.23). </p>
|
||
|
||
<p>e.g. array('FIELD1' => 'Field1', 'FIELD2'=>'Field2') </p>
|
||
|
||
<p><b>MetaPrimaryKeys<a name=metaprimarykeys></a>($table, $owner=false)</b> </p>
|
||
|
||
<p>Returns an array containing column names that are the primary keys of
|
||
$table. Supported by mysql, odbc (including db2, odbc_mssql, etc), mssql,
|
||
postgres, interbase/firebird, oci8 currently. </p>
|
||
|
||
<p>Views (and some tables) have primary keys, but sometimes this information is
|
||
not available from the database. You can define a function
|
||
ADODB_View_PrimaryKeys($databaseType, $database, $view, $owner) that should
|
||
return an array containing the fields that make up the primary key. If that
|
||
function exists, it will be called when MetaPrimaryKeys() cannot find a primary
|
||
key for a table or view. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>// In this example: dbtype = 'oci8', $db = 'mydb', $view = 'dataView', $owner = false <br>
|
||
function ADODB_View_PrimaryKeys($dbtype,$db,$view,$owner)<br>
|
||
{<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>switch(strtoupper($view)) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>case 'DATAVIEW': return array('DATAID');<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>default: return false;<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}<br>
|
||
}<br>
|
||
<br>
|
||
$db = NewADOConnection('oci8');<br>
|
||
$db->Connect('localhost','root','','mydb'); <br>
|
||
$db->MetaPrimaryKeys('dataView');</pre></div>
|
||
|
||
<p><b>ServerInfo<a name=serverinfo id=serverinfo></a>()</b> </p>
|
||
|
||
<p>Returns an array of containing two elements 'description' and 'version'. The
|
||
'description' element contains the string description of the database. The
|
||
'version' naturally holds the version number (which is also a string).</p>
|
||
|
||
<p><b>MetaForeignKeys<a name=metaforeignkeys></a>($table, $owner=false,
|
||
$upper=false)</b> </p>
|
||
|
||
<p>Returns an associate array of foreign keys, or false if not supported. For
|
||
example, if table employee has a foreign key where employee.deptkey points to
|
||
dept_table.deptid, and employee.posn=posn_table.postionid and
|
||
employee.poscategory=posn_table.category, then
|
||
$conn->MetaForeignKeys('employee') will return </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>array(<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'dept_table' => array('deptkey=deptid'),<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>'posn_table' => array('posn=positionid','poscategory=category')<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>)</pre></div>
|
||
|
||
<p>The optional schema or owner can be defined in $owner. If $upper is true,
|
||
then the table names (array keys) are upper-cased. </p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h2>ADORecordSet<a name=adorecordset></a></h2>
|
||
|
||
<p>When an SQL statement successfully is executed by <span style='font-family:
|
||
"Courier New"'>ADOConnection->Execute($sql),</span>an ADORecordSet object is
|
||
returned. This object contains a virtual cursor so we can move from row to row,
|
||
functions to obtain information about the columns and column types, and helper
|
||
functions to deal with formating the results to show to the user.</p>
|
||
|
||
<h3>ADORecordSet Fields</h3>
|
||
|
||
<p><b>fields: </b>Array containing the current row. This is not associative,
|
||
but is an indexed array from 0 to columns-1. See also the function <b><a
|
||
href="#fields">Fields</a></b>, which behaves like an associative array.</p>
|
||
|
||
<p><b>dataProvider</b>: The underlying mechanism used to connect to the
|
||
database. Normally set to <b>native</b>, unless using <b>odbc</b> or <b>ado</b>.</p>
|
||
|
||
<p><b>blobSize</b>: Maximum size of a char, string or varchar object before it
|
||
is treated as a Blob (Blob's should be shown with textarea's). See the <a
|
||
href="#metatype">MetaType</a> function.</p>
|
||
|
||
<p><b>sql</b>: Holds the sql statement used to generate this record set.</p>
|
||
|
||
<p><b>canSeek</b>: Set to true if Move( ) function works.</p>
|
||
|
||
<p><b>EOF</b>: True if we have scrolled the cursor past the last record.</p>
|
||
|
||
<h3>ADORecordSet Functions</h3>
|
||
|
||
<p><b>ADORecordSet( )</b></p>
|
||
|
||
<p>Constructer. Normally you never call this function yourself.</p>
|
||
|
||
<p><b>GetAssoc<a name=getassoc></a>([$force_array])</b></p>
|
||
|
||
<p>Generates an associative array from the recordset. Note that is this
|
||
function is also <a href="#getassoc1">available</a> in the connection object.
|
||
More details can be found there.</p>
|
||
|
||
<p><b>GetArray<a name=getarray></a>([$number_of_rows])</b></p>
|
||
|
||
<p>Generate a 2-dimensional array of records from the current cursor position,
|
||
indexed from 0 to $number_of_rows - 1. If $number_of_rows is undefined, till
|
||
EOF.</p>
|
||
|
||
<p><b>GetRows<a name=getrows></a>([$number_of_rows])</b></p>
|
||
|
||
<p class=MsoNormal>Generate a 2-dimensional array of records from the current
|
||
cursor position. Synonym for GetArray() for compatibility with Microsoft ADO. </p>
|
||
|
||
<p><b>GetMenu<a name=getmenu></a>($name, [$default_str=''],
|
||
[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></p>
|
||
|
||
<p>Generate a HTML menu
|
||
(<select><option><option></select>). The first column
|
||
of the recordset (fields[0]) will hold the string to display in the option
|
||
tags. If the recordset has more than 1 column, the second column (fields[1]) is
|
||
the value to send back to the web server.. The menu will be given the name $<i>name</i>.
|
||
</p>
|
||
|
||
<p>If $<i>default_str</i> is defined, then if $<i>default_str</i> == fields[0],
|
||
that field is selected. If $<i>blank1stItem</i> is true, the first option is
|
||
empty. You can also set the first option strings by setting $blank1stItem =
|
||
"$value:$text".</p>
|
||
|
||
<p>$<i>Default_str</i> can be array for a multiple select listbox.</p>
|
||
|
||
<p>To get a listbox, set the $<i>size</i> to a non-zero value (or pass
|
||
$default_str as an array). If $<i>multiple_select</i> is true then a listbox
|
||
will be generated with $<i>size</i> items (or if $size==0, then 5 items)
|
||
visible, and we will return an array to a server. Lastly use $<i>moreAttr </i>to
|
||
add additional attributes such as javascript or styles. </p>
|
||
|
||
<p>Menu Example 1: <code><span style='font-size:10.0pt'>GetMenu('menu1','A',true)</span></code>
|
||
will generate a menu: <SELECT NAME="menu1">
|
||
<OPTION>
|
||
<OPTION SELECTED VALUE="1">A
|
||
<OPTION VALUE="2">B
|
||
<OPTION VALUE="3">C
|
||
</SELECT>for
|
||
the data (A,1), (B,2), (C,3). Also see <a href="#ex5">example 5</a>.</p>
|
||
|
||
<p>Menu Example 2: For the same data, <code><span style='font-size:10.0pt'>GetMenu('menu1',array('A','B'),false)</span></code>
|
||
will generate a menu with both A and B selected: <br>
|
||
<SELECT MULTIPLE NAME="menu1" SIZE="3">
|
||
<OPTION SELECTED VALUE="1">A
|
||
<OPTION SELECTED VALUE="2">B
|
||
<OPTION VALUE="3">C
|
||
</SELECT></p>
|
||
|
||
<p><b>GetMenu2<a name=getmenu2></a>($name, [$default_str=''],
|
||
[$blank1stItem=true], [$multiple_select=false], [$size=0], [$moreAttr=''])</b></p>
|
||
|
||
<p>This is nearly identical to GetMenu, except that the $<i>default_str</i> is
|
||
matched to fields[1] (the option values).</p>
|
||
|
||
<p>Menu Example 3: Given the data in menu example 2, <code><span
|
||
style='font-size:10.0pt'>GetMenu2('menu1',array('1','2'),false)</span></code>
|
||
will generate a menu with both A and B selected in menu example 2, but this
|
||
time the selection is based on the 2nd column, which holds the values to return
|
||
to the Web server. </p>
|
||
|
||
<p><b>UserDate<a name=userdate></a>($str, [$fmt])</b></p>
|
||
|
||
<p>Converts the date string $<i>str</i> to another format. The date format is
|
||
Y-m-d, or Unix timestamp format. The default $<i>fmt</i> is Y-m-d.</p>
|
||
|
||
<p><b>UserTimeStamp<a name=usertimestamp></a>($str, [$fmt])</b></p>
|
||
|
||
<p>Converts the timestamp string $<b>str</b> to another format. The timestamp
|
||
format is Y-m-d H:i:s, as in '2002-02-28 23:00:12', or Unix timestamp format.
|
||
UserTimeStamp calls UnixTimeStamp to parse $<i>str</i>, and $<i>fmt</i>
|
||
defaults to Y-m-d H:i:s if not defined. </p>
|
||
|
||
<p><b>UnixDate<a name=unixdate></a>($str)</b></p>
|
||
|
||
<p>Parses the date string $<b>str</b> and returns it in unix mktime format (eg.
|
||
a number indicating the seconds after January 1st, 1970). Expects the date to
|
||
be in Y-m-d H:i:s format, except for Sybase and Microsoft SQL Server, where M d
|
||
Y is also accepted (the 3 letter month strings are controlled by a global
|
||
array, which might need localisation).</p>
|
||
|
||
<p>This function is available in both ADORecordSet and ADOConnection since
|
||
1.91.</p>
|
||
|
||
<p><b>UnixTimeStamp<a name=unixtimestamp></a>($str)</b></p>
|
||
|
||
<p>Parses the timestamp string $<b>str</b> and returns it in unix mktime format
|
||
(eg. a number indicating the seconds after January 1st, 1970). Expects the date
|
||
to be in "Y-m-d, H:i:s" (1970-12-24, 00:00:00) or "Y-m-d
|
||
H:i:s" (1970-12-24 00:00:00) or "YmdHis" (19701225000000)
|
||
format, except for Sybase and Microsoft SQL Server, where "M d Y
|
||
h:i:sA" (Dec 25 1970 00:00:00AM) is also accepted (the 3 letter month
|
||
strings are controlled by a global array, which might need localisation).</p>
|
||
|
||
<p>This function is available in both ADORecordSet and ADOConnection since
|
||
1.91. </p>
|
||
|
||
<p><b>OffsetDate<a name=OffsetDate></a>($dayFraction, $basedate=false)</b></p>
|
||
|
||
<p>Returns a string with the native SQL functions to calculate future and past
|
||
dates based on $basedate in a portable fashion. If $basedate is not defined,
|
||
then the current date (at 12 midnight) is used. Returns the SQL string that
|
||
performs the calculation when passed to Execute(). </p>
|
||
|
||
<p>For example, in Oracle, to find the date and time that is 2.5 days from
|
||
today, you can use:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'># get date one week from now<br>
|
||
$fld = $conn->OffsetDate(7); // returns "(trunc(sysdate)+7")</pre><pre># get date and time that is 60 hours from current date and time<br>
|
||
$fld = $conn->OffsetDate(2.5, $conn->sysTimeStamp);<span
|
||
style='mso-tab-count:1'> </span>// returns "(sysdate+2.5)"<br>
|
||
<br>
|
||
$conn->Execute("UPDATE TABLE SET dodate=$fld WHERE ID=$id");</pre></div>
|
||
|
||
<p>This function is available for mysql, mssql, oracle, oci8 and postgresql
|
||
drivers since 2.13. It might work with other drivers provided they allow
|
||
performing numeric day arithmetic on dates.</p>
|
||
|
||
<p><b>SQLDate<a name=sqldate></a>($dateFormat, $basedate=false)</b></p>
|
||
|
||
<p class=MsoNormal>Returns a string which contains the native SQL functions to
|
||
format a date or date column $basedate. This is used when retrieving date
|
||
columns in SELECT statements. For sending dates to the database (eg. in UPDATE,
|
||
INSERT or the where clause of SELECT statements) use <a href="#dbdate">DBDate</a>.
|
||
It uses a case-sensitive $dateFormat, which supports: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><span style='mso-spacerun:yes'><EFBFBD></span></pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>Y: 4-digit Year</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>Q: Quarter (1-4)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>M: Month (Jan-Dec)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>m: Month (01-12)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>d: Day (01-31)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>H: Hour (00-23)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>h: Hour (1-12)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>i: Minute (00-59)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>s: Second (00-60)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>A: AM/PM indicator</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>w: day of week (0-6 or 1-7 depending on DB)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>l: day of week (as string - lowercase L)</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>W: week in year (0..53 for MySQL, 1..53 for PostgreSQL and Oracle)</pre><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD> </span></pre></div>
|
||
|
||
<p>All other characters are treated as strings. You can also use \ to escape
|
||
characters. Available on selected databases, including mysql, postgresql,
|
||
mssql, oci8 and DB2. </p>
|
||
|
||
<p>This is useful in writing portable sql statements that GROUP BY on dates.
|
||
For example to display total cost of goods sold broken by quarter (dates are
|
||
stored in a field called postdate): </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>$sqlfn = $db->SQLDate('Y-\QQ','postdate'); # get sql that formats postdate to output 2002-Q1<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>$sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span></pre></div>
|
||
|
||
<p><b>MoveNext<a name=movenext></a>( )</b></p>
|
||
|
||
<p>Move the internal cursor to the next row. The <i>$this->fields</i> array
|
||
is automatically updated. Returns false if unable to do so (normally because
|
||
EOF has been reached), otherwise true. </p>
|
||
|
||
<p>If EOF is reached, then the $this->fields array is set to false (this was
|
||
only implemented consistently in ADOdb 3.30). For the pre-3.30 behaviour of
|
||
$this->fields (at EOF), set the global variable $ADODB_COMPAT_FETCH = true.</p>
|
||
|
||
<p>Example:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute($sql);<br>
|
||
if ($rs) <br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>while (!$rs->EOF) {<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span><span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>ProcessArray($rs->fields);<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs->MoveNext();<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>} </pre></div>
|
||
|
||
<p><b>Move<a name=move></a>($to)</b></p>
|
||
|
||
<p>Moves the internal cursor to a specific row $<b>to</b>. Rows are zero-based
|
||
eg. 0 is the first row. The <b>fields</b> array is automatically updated. For
|
||
databases that do not support scrolling internally, ADOdb will simulate forward
|
||
scrolling. Some databases do not support backward scrolling. If the $<b>to</b>
|
||
position is after the EOF, $<b>to</b> will move to the end of the RecordSet for
|
||
most databases. Some obscure databases using odbc might not behave this way.</p>
|
||
|
||
<p>Note: This function uses <i>absolute positioning</i>, unlike Microsoft's
|
||
ADO.</p>
|
||
|
||
<p>Returns true or false. If false, the internal cursor is not moved in most
|
||
implementations, so AbsolutePosition( ) will return the last cursor position
|
||
before the Move( ). </p>
|
||
|
||
<p><b>MoveFirst<a name=movefirst></a>()</b></p>
|
||
|
||
<p>Internally calls Move(0). Note that some databases do not support this function.</p>
|
||
|
||
<p><b>MoveLast<a name=movelast></a>()</b></p>
|
||
|
||
<p>Internally calls Move(RecordCount()-1). Note that some databases do not
|
||
support this function.</p>
|
||
|
||
<p><b>GetRowAssoc</b><a name=getrowassoc></a>($toUpper=true)</p>
|
||
|
||
<p>Returns an associative array containing the current row. The keys to the
|
||
array are the column names. The column names are upper-cased for easy access.
|
||
To get the next row, you will still need to call MoveNext(). </p>
|
||
|
||
<p>For example:<br>
|
||
Array ( [ID] => 1 [FIRSTNAME] => Caroline [LASTNAME] => Miranda
|
||
[CREATED] => 2001-07-05 ) </p>
|
||
|
||
<p>Note: do not use GetRowAssoc() with $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC.
|
||
Because they have the same functionality, they will interfere with each other.</p>
|
||
|
||
<p><b>AbsolutePage<a name=absolutepage></a>($page=-1) </b></p>
|
||
|
||
<p>Returns the current page. Requires PageExecute()/CachePageExecute() to be
|
||
called. See <a href="#ex8">Example 8</a>.</p>
|
||
|
||
<p><b>AtFirstPage<a name=atfirstpage>($status='')</a></b><span
|
||
style='mso-bookmark:atfirstpage'></span></p>
|
||
|
||
<p>Returns true if at first page (1-based). Requires
|
||
PageExecute()/CachePageExecute() to be called. See <a href="#ex8">Example 8</a>.</p>
|
||
|
||
<p><b>AtLastPage<a name=atlastpage>($status='')</a></b><span style='mso-bookmark:
|
||
atlastpage'></span></p>
|
||
|
||
<p>Returns true if at last page (1-based). Requires
|
||
PageExecute()/CachePageExecute() to be called. See <a href="#ex8">Example 8</a>.</p>
|
||
|
||
<p><b>Fields</b><a name=fields></a>(<b>$colname</b>)</p>
|
||
|
||
<p>Returns the value of the associated column $<b>colname</b> for the current
|
||
row. The column name is case-insensitive.</p>
|
||
|
||
<p>This is a convenience function. For higher performance, use <a
|
||
href="#adodb_fetch_mode">$ADODB_FETCH_MODE</a>. </p>
|
||
|
||
<p><b>FetchRow</b><a name=fetchrow></a>()</p>
|
||
|
||
<p>Returns array containing current row, or false if EOF. FetchRow( )
|
||
internally moves to the next record after returning the current row. </p>
|
||
|
||
<p>Warning: Do not mix using FetchRow() with MoveNext().</p>
|
||
|
||
<p>Usage:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute($sql);<br>
|
||
if ($rs)<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>while ($arr = $rs->FetchRow()) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span> # process $arr<span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}</pre></div>
|
||
|
||
<p><b>FetchInto</b><a name=fetchinto></a>(<b>&$array</b>)</p>
|
||
|
||
<p>Sets $array to the current row. Returns PEAR_Error object if EOF, 1 if ok
|
||
(DB_OK constant). If PEAR is undefined, false is returned when EOF. FetchInto(
|
||
) internally moves to the next record after returning the current row. </p>
|
||
|
||
<p>FetchRow() is easier to use. See above.</p>
|
||
|
||
<p><b>FetchField<a name=fetchfield></a>($column_number)</b></p>
|
||
|
||
<p>Returns an object containing the <b>name</b>, <b>type</b> and <b>max_length</b>
|
||
of the associated field. If the max_length cannot be determined reliably, it
|
||
will be set to -1. The column numbers are zero-based. See <a href="#ex2">example
|
||
2.</a></p>
|
||
|
||
<p><b>FieldCount<a name=fieldcount></a>( )</b></p>
|
||
|
||
<p>Returns the number of fields (columns) in the record set.</p>
|
||
|
||
<p><b>RecordCount<a name=recordcount></a>( )</b></p>
|
||
|
||
<p>Returns the number of rows in the record set. If the number of records
|
||
returned cannot be determined from the database driver API, we will buffer all
|
||
rows and return a count of the rows after all the records have been retrieved.
|
||
This buffering can be disabled (for performance reasons) by setting the global
|
||
variable $ADODB_COUNTRECS = false. When disabled, RecordCount( ) will return -1
|
||
for certain databases. See the supported databases list above for more details.
|
||
</p>
|
||
|
||
<p>RowCount is a synonym for RecordCount.</p>
|
||
|
||
<p><b>PO_RecordCount<a name="po_recordcount"></a>($table, $where)</b></p>
|
||
|
||
<p>Returns the number of rows in the record set. If the database does not
|
||
support this, it will perform a SELECT COUNT(*) on the table $table, with the
|
||
given $where condition to return an estimate of the recordset size.</p>
|
||
|
||
<p>$numrows = $rs->PO_RecordCount("articles_table",
|
||
"group=$group");</p>
|
||
|
||
<p class=MsoNormal><b>NextRecordSet<a name=nextrecordset id=nextrecordset></a>()</b>
|
||
</p>
|
||
|
||
<p>For databases that allow multiple recordsets to be returned in one query,
|
||
this function allows you to switch to the next recordset. Currently only
|
||
supported by mssql driver.</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute('execute return_multiple_rs');<br>
|
||
$arr1 = $rs->GetArray();<br>
|
||
$rs->NextRecordSet();<br>
|
||
$arr2 = $rs->GetArray();</pre></div>
|
||
|
||
<p><b>FetchObject<a name=fetchobject></a>($toupper=true)</b></p>
|
||
|
||
<p>Returns the current row as an object. If you set $toupper to true, then the
|
||
object fields are set to upper-case. Note: The newer FetchNextObject() is the
|
||
recommended way of accessing rows as objects. See below.</p>
|
||
|
||
<p><b>FetchNextObject<a name=fetchnextobject></a>($toupper=true)</b></p>
|
||
|
||
<p>Gets the current row as an object and moves to the next row automatically.
|
||
Returns false if at end-of-file. If you set $toupper to true, then the object
|
||
fields are set to upper-case. Note that for some drivers such as mssql, you
|
||
need to SetFetchMode(ADODB_FETCH_ASSOC) or SetFetchMode(ADODB_FETCH_BOTH).</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'>$rs = $db->Execute('select firstname,lastname from table');<br>
|
||
if ($rs) {<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>while ($o = $rs->FetchNextObject()) {<br>
|
||
<span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>print "$o->FIRSTNAME, $o->LASTNAME<BR>";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}<br>
|
||
}</pre></div>
|
||
|
||
<p>There is some trade-off in speed in using FetchNextObject(). If performance
|
||
is important, you should access rows with the <code><span style='font-size:
|
||
10.0pt'>fields[]</span></code> array. <b>FetchObj<a name=fetchobj id=fetchobj></a>()</b>
|
||
</p>
|
||
|
||
<p>Returns the current record as an object. Fields are not upper-cased, unlike
|
||
FetchObject. </p>
|
||
|
||
<p><b>FetchNextObj<a name=fetchnextobj id=fetchnextobj></a>()</b> </p>
|
||
|
||
<p>Returns the current record as an object and moves to the next record. If
|
||
EOF, false is returned. Fields are not upper-cased, unlike FetctNextObject. </p>
|
||
|
||
<p><b>CurrentRow<a name=currentrow></a>( )</b></p>
|
||
|
||
<p>Returns the current row of the record set. 0 is the first row.</p>
|
||
|
||
<p><b>AbsolutePosition<a name=abspos></a>( )</b></p>
|
||
|
||
<p>Synonym for <b>CurrentRow</b> for compatibility with ADO. Returns the
|
||
current row of the record set. 0 is the first row.</p>
|
||
|
||
<p><b>MetaType<a name=metatype></a>($nativeDBType[,$field_max_length],[$fieldobj])</b></p>
|
||
|
||
<p>Determine what <i>generic</i> meta type a database field type is given its
|
||
native type $<b>nativeDBType</b> as a string and the length of the field $<b>field_max_length</b>.
|
||
Note that field_max_length can be -1 if it is not known. The field object
|
||
returned by FetchField() can be passed in $<b>fieldobj</b> or as the 1st
|
||
parameter <b>$nativeDBType</b>. This is useful for databases such as <i>mysql</i>
|
||
which has additional properties in the field object such as <i>primary_key</i>.
|
||
</p>
|
||
|
||
<p>Uses the field <b>blobSize</b> and compares it with $<b>field_max_length</b>
|
||
to determine whether the character field is actually a blob.</p>
|
||
|
||
<p class=MsoNormal>For example, $db->MetaType('char') will return 'C'. </p>
|
||
|
||
<p>Returns:</p>
|
||
|
||
<ul type=disc>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>C</b>: Character fields
|
||
that should be shown in a <input type="text"> tag. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>X</b>: Clob (character
|
||
large objects), or large text fields that should be shown in a
|
||
<textarea></li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>D</b>: Date field</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>T</b>: Timestamp field</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>L</b>: Logical field
|
||
(boolean or bit-field)</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>N</b>: Numeric field.
|
||
Includes decimal, numeric, floating point, and real. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>I</b>: Integer
|
||
field. </li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>R</b>: Counter or
|
||
Autoincrement field. Must be numeric.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l7 level1 lfo11;tab-stops:list 36.0pt'><b>B</b>: Blob, or binary
|
||
large objects. </li>
|
||
</ul>
|
||
|
||
<p>Since ADOdb 3.0, MetaType accepts $fieldobj as the first parameter, instead
|
||
of $nativeDBType. </p>
|
||
|
||
<p><b>Close( )</b><a name=rsclose></a></p>
|
||
|
||
<p>Closes the recordset, cleaning all memory and resources associated with the
|
||
recordset. </p>
|
||
|
||
<p>If memory management is not an issue, you do not need to call this function
|
||
as recordsets are closed for you by PHP at the end of the script. SQL
|
||
statements such as INSERT/UPDATE/DELETE do not really return a recordset, so you
|
||
do not have to call Close() for such SQL statements.</p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h3>function rs2html<a name=rs2html></a>($adorecordset,[$tableheader_attributes],
|
||
[$col_titles])</h3>
|
||
|
||
<p>This is a standalone function (rs2html = recordset to html) that is similar
|
||
to PHP's <i>odbc_result_all</i> function, it prints a ADORecordSet, $<b>adorecordset</b>
|
||
as a HTML table. $<b>tableheader_attributes</b> allow you to control the table <i>cellpadding</i>,
|
||
<i>cellspacing</i> and <i>border</i> attributes. Lastly you can replace the
|
||
database column names with your own column titles with the array $<b>col_titles</b>.
|
||
This is designed more as a quick debugging mechanism, not a production table
|
||
recordset viewer.</p>
|
||
|
||
<p>You will need to include the file <i>tohtml.inc.php</i>.</p>
|
||
|
||
<p>Example of rs2html:<a name=exrs2html></a></p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><b><span style='color:#336600'><?<br>
|
||
include('tohtml.inc.php')</span></b>; # load code common to ADOdb <br>
|
||
<b>include</b>('adodb.inc.php'); # load code common to ADOdb <br>
|
||
$<span style='color:#663300'>conn</span> = &ADONewConnection('mysql');<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span># create a connection <br>
|
||
$<span style='color:#663300'>conn</span>->PConnect('localhost','userid','','agora');# connect to MySQL, agora db<br>
|
||
$<span style='color:#663300'>sql</span> = 'select CustomerName, CustomerID from customers'; <br>
|
||
$<span style='color:#663300'>rs</span><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>= $<span
|
||
style='color:#663300'>conn</span>->Execute($sql); <br>
|
||
<b><span style='color:#336600'>rs2html</span>($</b><b><span style='color:#663300'>rs</span>,'<i>border=2 cellpadding=3</i>',array('<i>Customer Name','Customer ID</i>'));<br>
|
||
?></b></pre></div>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h3>Differences between this ADOdb library and Microsoft ADO<a name=adodiff></a></h3>
|
||
|
||
<ol start=1 type=1>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADOdb only supports
|
||
recordsets created by a connection object. Recordsets cannot be created
|
||
independently.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADO properties are implemented
|
||
as functions in ADOdb. This makes it easier to implement any enhanced ADO
|
||
functionality in the future.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADOdb's <span
|
||
style='font-family:"Courier New"'>ADORecordSet->Move()</span> uses
|
||
absolute positioning, not relative. Bookmarks are not supported.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'><span style='font-family:
|
||
"Courier New"'>ADORecordSet->AbsolutePosition() </span>cannot be used
|
||
to move the record cursor.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>ADO Parameter objects are
|
||
not supported. Instead we have the ADOConnection::<a href="#parameter">Parameter</a>(
|
||
) function, which provides a simpler interface for calling preparing
|
||
parameters and calling stored procedures.</li>
|
||
<li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
|
||
mso-list:l10 level1 lfo12;tab-stops:list 36.0pt'>Recordset properties for
|
||
paging records are available, but implemented as in <a href="#ex8">Example
|
||
8</a>.</li>
|
||
</ol>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<h1>Database Driver Guide<a name=driverguide></a></h1>
|
||
|
||
<p>This describes how to create a class to connect to a new database. To ensure
|
||
there is no duplication of work, kindly email me at jlim#natsoft.com if you
|
||
decide to create such a class.</p>
|
||
|
||
<p>First decide on a name in lower case to call the database type. Let's say we
|
||
call it xbase. </p>
|
||
|
||
<p>Then we need to create two classes ADODB_xbase and ADORecordSet_xbase in the
|
||
file adodb-xbase.inc.php.</p>
|
||
|
||
<p>The simplest form of database driver is an adaptation of an existing ODBC
|
||
driver. Then we just need to create the class <i>ADODB_xbase extends ADODB_odbc</i>
|
||
to support the new <b>date</b> and <b>timestamp</b> formats, the <b>concatenation</b>
|
||
operator used, <b>true</b> and <b>false</b>. For the<i> ADORecordSet_xbase
|
||
extends ADORecordSet_odbc </i>we need to change the <b>MetaType</b> function.
|
||
See<b> adodb-vfp.inc.php</b> as an example.</p>
|
||
|
||
<p>More complicated is a totally new database driver that connects to a new PHP
|
||
extension. Then you will need to implement several functions. Fortunately, you
|
||
do not have to modify most of the complex code. You only need to override a few
|
||
stub functions. See <b>adodb-mysql.inc.php</b> for example.</p>
|
||
|
||
<p>The default date format of ADOdb internally is YYYY-MM-DD (Ansi-92). All
|
||
dates should be converted to that format when passing to an ADOdb date
|
||
function. See Oracle for an example how we use ALTER SESSION to change the
|
||
default date format in _pconnect _connect.</p>
|
||
|
||
<p><b>ADOConnection Functions to Override</b></p>
|
||
|
||
<p>Defining a constructor for your ADOConnection derived function is optional.
|
||
There is no need to call the base class constructor.</p>
|
||
|
||
<p>_<b>connect</b>: Low level implementation of Connect. Returns true or false.
|
||
Should set the _<b>connectionID</b>.</p>
|
||
|
||
<p>_<b>pconnect:</b> Low level implemention of PConnect. Returns true or false.
|
||
Should set the _<b>connectionID</b>.</p>
|
||
|
||
<p>_<b>query</b>: Execute a query. Returns the queryID, or false.</p>
|
||
|
||
<p>_<b>close: </b>Close the connection -- PHP should clean up all recordsets. </p>
|
||
|
||
<p><b>ErrorMsg</b>: Stores the error message in the private variable _errorMsg.
|
||
</p>
|
||
|
||
<p><b>ADOConnection Fields to Set</b></p>
|
||
|
||
<p>_<b>bindInputArray</b>: Set to true if binding of parameters for SQL inserts
|
||
and updates is allowed using ?, eg. as with ODBC.</p>
|
||
|
||
<p><b>fmtDate</b></p>
|
||
|
||
<p><b>fmtTimeStamp</b></p>
|
||
|
||
<p><b>true</b></p>
|
||
|
||
<p><b>false</b></p>
|
||
|
||
<p><b>concat_operator</b></p>
|
||
|
||
<p><b>replaceQuote</b></p>
|
||
|
||
<p><b>hasLimit</b> support SELECT * FROM TABLE LIMIT 10 of MySQL.</p>
|
||
|
||
<p><b>hasTop</b> support Microsoft style SELECT TOP 10 * FROM TABLE.</p>
|
||
|
||
<p><b>ADORecordSet Functions to Override</b></p>
|
||
|
||
<p>You will need to define a constructor for your ADORecordSet derived class
|
||
that calls the parent class constructor.</p>
|
||
|
||
<p><b>FetchField: </b>as documented above in ADORecordSet</p>
|
||
|
||
<p>_<b>initrs</b>: low level initialization of the recordset: setup the _<b>numOfRows</b>
|
||
and _<b>numOfFields</b> fields -- called by the constructor.</p>
|
||
|
||
<p>_<b>seek</b>: seek to a particular row. Do not load the data into the fields
|
||
array. This is done by _fetch. Returns true or false. Note that some
|
||
implementations such as Interbase do not support seek. Set canSeek to false.</p>
|
||
|
||
<p>_<b>fetch</b>: fetch a row using the database extension function and then
|
||
move to the next row. Sets the <b>fields</b> array. If the parameter
|
||
$ignore_fields is true then there is no need to populate the <b>fields</b>
|
||
array, just move to the next row. then Returns true or false.</p>
|
||
|
||
<p>_<b>close</b>: close the recordset</p>
|
||
|
||
<p><b>Fields</b>: If the array row returned by the PHP extension is not an
|
||
associative one, you will have to override this. See adodb-odbc.inc.php for an
|
||
example. For databases such as MySQL and MSSQL where an associative array is
|
||
returned, there is no need to override this function.</p>
|
||
|
||
<p><b>ADOConnection Fields to Set</b></p>
|
||
|
||
<p>canSeek: Set to true if the _seek function works.</p>
|
||
|
||
<h2>Optimizing PHP</h2>
|
||
|
||
<p class=MsoNormal>For info on tuning PHP, read this article on <a
|
||
href="http://phplens.com/lens/php-book/optimizing-debugging-php.php">Optimizing
|
||
PHP</a>. </p>
|
||
|
||
<h2>Change Log<a name=changes></a><a name=changelog></a></h2>
|
||
|
||
<p><a name=5.08a></a><b>5.08a 17 Apr 2009</b> </p>
|
||
<p>Fixes wrong version number string.
|
||
<p>Incorrect + in adodb-datadict.inc.php removed.
|
||
<p>Fixes missing OffsetDate() function in pdo. Thx paul#mantisforge.org.
|
||
<p><a name=5.08></a><b>5.08 17 Apr 2009</b> </p>
|
||
<p>adodb-sybase.inc.php driver. Added $conn->charSet support. Thx Luis Henrique Mulinari (luis.mulinari#gmail.com)
|
||
<p>adodb-ado5.inc.php. Fixed some bind param issues. Thx Jirka Novak.
|
||
<p>adodb-ado5.inc.php. Now has improved error handling.
|
||
<p>Fixed typo in adodb-xmlschema03.inc.php. See XMLS_EXISTING_DATA, line 1501. Thx james johnson.
|
||
<p>Made $inputarr optional for _query() in all drivers.
|
||
<p>Fixed spelling mistake in flushall() in adodb.inc.ophp.
|
||
<p>Fixed handling of quotes in adodb_active_record::doquote. Thx Jonathan Hohle (jhohle#godaddy.com).
|
||
<p>Added new index parameter to adodb_active_record::setdatabaseadaptor. Thx Jonathan Hohle
|
||
<p>Fixed & readcache() reference compat problem with php 5.3 in adodb.Thx Jonathan Hohle.
|
||
<p>Some minor $ADODB_CACHE_CLASS definition issues in adodb.inc.php.
|
||
<p>Added Reset() function to adodb_active_record. Thx marcus.
|
||
<p>Minor dsn fix for pdo_sqlite in adodb.inc.php. Thx Sergey Chvalyuk.
|
||
<p>Fixed adodb-datadict _CreateSuffix() inconsistencies. Thx Chris Miller.
|
||
<p>Option to delete old fields $dropOldFlds in datadict ChangeTableSQL($table, $flds, $tableOptions, $dropOldFlds=false) added. Thx Philipp Niethammer.
|
||
<p>Memcache caching did not expire properly. Fixed.
|
||
<p>MetaForeignKeys for postgres7 driver changed from adodb_movenext to $rs->MoveNext (also in 4.99)
|
||
<p>Added support for ldap and ldaps url format in ldap driver. E.g. ldap://host:port/dn?attributes?scope?filter?extensions
|
||
<p><a name=5.07></a><b>5.07 26 Dec 2008</b> </p>
|
||
|
||
<p>BeginTrans/CommitTrans/RollbackTrans return true/false correctly on
|
||
success/failure now for mssql, odbc, oci8, mysqlt, mysqli, postgres, pdo. </p>
|
||
|
||
<p>Replace() now quotes all non-null values including numeric ones. </p>
|
||
|
||
<p>Postgresql qstr() now returns booleans as <b>true</b> and <b>false</b>
|
||
without quotes. </p>
|
||
|
||
<p>MetaForeignKeys in mysql and mysqli drivers had this problem: A table can
|
||
have two foreign keys pointing to the same column in the same table. The
|
||
original code will incorrectly report only the last column. Fixed.
|
||
https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
|
||
</p>
|
||
|
||
<p>Passing in full ado connection string in $argHostname with ado drivers was
|
||
failing in adodb5 due to bug. Fixed. </p>
|
||
|
||
<p>Fixed memcachelib flushcache and flushall bugs. Also fixed possible
|
||
timeCreated = 0 problem in readcache. (Also in adodb 4.992). Thanks AlexB_UK
|
||
(alexbarnes#hotmail.com). </p>
|
||
|
||
<p>Fixed a notice in adodb-sessions2.inc.php, in _conn(). Thx bober
|
||
m.derlukiewicz#rocktech.remove_me.pl; </p>
|
||
|
||
<p>ADOdb Active Record: Fixed some issues with incompatible fetch modes
|
||
(ADODB_FETCH_ASSOC) causing problems in UpdateActiveTable(). </p>
|
||
|
||
<p>ADOdb Active Record: Added support for functions that support predefining
|
||
one-to-many relationships:<br>
|
||
<i>ClassHasMany ClassBelongsTo TableHasMany TableBelongsTo
|
||
TableKeyHasMany TableKeyBelongsTo</i>. <br>
|
||
You can also define your child/parent class in these functions, instead of the
|
||
default ADODB_Active_Record. Thx Arialdo Martini & Chris R for idea. </p>
|
||
|
||
<p>ADOdb Active Record: HasMany hardcoded primary key to "id". Fixed.
|
||
</p>
|
||
|
||
<p>Many pdo and pdo-sqlite fixes from Sid Dunayer [sdunayer#interserv.com]. </p>
|
||
|
||
<p>CacheSelectLimit not working for mssql. Fixed. Thx AlexB. </p>
|
||
|
||
<p>The rs2html function did not display hours in timestamps correctly. Now 24hr
|
||
clock used.</p>
|
||
|
||
<p>Changed ereg* functions to use preg* functions as ereg* is deprecated in PHP 5.3. Modified sybase and postgresql drivers.</p>
|
||
|
||
<p><a name=5.06></a><b>5.06 16 Oct 2008</b> </p>
|
||
|
||
<p>Added driver adodb-pdo_sqlite.inc.php. Thanks Diogo Toscano
|
||
(diogo#scriptcase.net) for the code. </p>
|
||
|
||
<p>Added support for <a href="docs-active-record.htm#onetomany">one-to-many relationships</a>
|
||
with BelongsTo() and HasMany() in adodb_active_record. </p>
|
||
|
||
<p>Added BINARY type to mysql.inc.php (also in 4.991). </p>
|
||
|
||
<p>Added support for SelectLimit($sql,-1,100) in oci8. (also in 4.991). </p>
|
||
|
||
<p>New $conn->GetMedian($table, $field, $where='') to get median account no.
|
||
(also in 4.991) </p>
|
||
|
||
<p>The rs2html() function in tohtml.inc.php did not handle dates with ':' in it
|
||
properly. Fixed. (also in 4.991) </p>
|
||
|
||
<p>Added support for connecting to oci8 using $DB->Connect($ip, $user, $pwd,
|
||
"SID=$sid"); (also in 4.991) </p>
|
||
|
||
<p>Added mysql type 'VAR_STRING' to MetaType(). (also in 4.991) </p>
|
||
|
||
<p>The session and session2 code supports setfetchmode assoc properly now (also
|
||
in 4.991). </p>
|
||
|
||
<p>Added concat support to pdo. Thx Andrea Baron. </p>
|
||
|
||
<p>Changed db2 driver to use format "Y-m-d H-i-s" for datetime
|
||
instead of "Y-m-d-H-i-s" which was legacy from odbc_db2 conversion. </p>
|
||
|
||
<p>Removed vestigal break on adodb_tz_offset in adodb-time.inc.php. </p>
|
||
|
||
<p>MetaForeignKeys did not work for views in MySQL 5. Fixed. </p>
|
||
|
||
<p>Changed error handling in GetActiveRecordsClass. </p>
|
||
|
||
<p>Added better support for using existing driver when $ADODB_NEWCONNECTION
|
||
function returns false. </p>
|
||
|
||
<p>In _CreateSuffix in adodb-datadict.inc.php, adding unsigned variable for
|
||
mysql. </p>
|
||
|
||
<p>In adodb-xmlschema03.inc.php, changed addTableOpt to include db name. </p>
|
||
|
||
<p>If bytea blob in postgresql is null, empty string was formerly returned. Now
|
||
null is returned. </p>
|
||
|
||
<p>Changed db2 driver CreateSequence to support $start parameter. </p>
|
||
|
||
<p>rs2html() now does not add nbsp to end if length of string > 0 </p>
|
||
|
||
<p>The oci8po FetchField() now only lowercases field names if ADODB_ASSOC_CASE
|
||
is set to 0. </p>
|
||
|
||
<p>New mssqlnative drivers for php. TQ Garrett Serack of M'soft. <a
|
||
href="http://www.microsoft.com/downloads/details.aspx?FamilyId=61BF87E0-D031-466B-B09A-6597C21A2E2A&displaylang=en">Download</a>
|
||
mssqlnative extension. Note that this is still in beta. </p>
|
||
|
||
<p>Fixed bugs in memcache support. </p>
|
||
|
||
<p>You can now change the return value of GetOne if no records are found using
|
||
the global variable $ADODB_GETONE_EOF. The default is null. To change it back
|
||
to the pre-4.99/5.00 behaviour of false, set $ADODB_GETONE_EOF = false; </p>
|
||
|
||
<p>In Postgresql 8.2/8.3 MetaForeignkeys did not work. Fixed William Kolodny
|
||
William.Kolodny#gt-t.net </p>
|
||
|
||
<p><a name=5.05></a><b>4.990/5.05 11 Jul 2008</b> </p>
|
||
|
||
<p>Added support for multiple recordsets in mysqli "Geisel Sierote"
|
||
geisel#4up.com.br. See http://phplens.com/lens/lensforum/msgs.php?id=15917 </p>
|
||
|
||
<p>Malcolm Cook added new Reload() function to Active Record. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=17474 </p>
|
||
|
||
<p>Thanks Zoltan Monori [monzol#fotoprizma.hu] for bug fixes in iterator,
|
||
SelectLimit, GetRandRow, etc. </p>
|
||
|
||
<p>Under heavy loads, the performance monitor for oci8 disables Ixora views. </p>
|
||
|
||
<p>Fixed sybase driver SQLDate to use str_replace(). Also for adodb5, changed
|
||
sybase driver UnixDate and UnixTimeStamp calls to static. </p>
|
||
|
||
<p>Changed oci8 lob handler to use & reference
|
||
$this->_refLOBs[$numlob]['VAR'] = &$var. </p>
|
||
|
||
<p>We now strtolower the get_class() function in PEAR::isError() for php5
|
||
compat. </p>
|
||
|
||
<p>CacheExecute did not retrieve cache recordsets properly for 5.04 (worked in
|
||
4.98). Fixed. </p>
|
||
|
||
<p>New ADODB_Cache_File class for file caching defined in adodb.inc.php. </p>
|
||
|
||
<p>Farsi language file contribution by Peyman Hooshmandi Raad
|
||
(phooshmand#gmail.com) </p>
|
||
|
||
<p>New API for creating your custom caching class which is stored in
|
||
$ADODB_CACHE: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>include "/path/to/adodb.inc.php";</pre><pre>$ADODB_CACHE_CLASS = 'MyCacheClass';</pre><pre><o:p> </o:p></pre><pre>class MyCacheClass extends ADODB_Cache_File</pre><pre>{</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>function writecache($filename, $contents,$debug=false){...}</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>function &readcache($filename, &$err, $secs2cache, $rsClass){ ...}</pre><pre><span
|
||
style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span> :</pre><pre>}</pre><pre><o:p> </o:p></pre><pre>$DB = NewADOConnection($driver);</pre><pre>$DB->Connect(...);<span style='mso-spacerun:yes'><EFBFBD> </span>## MyCacheClass created here and stored in $ADODB_CACHE global variable.</pre><pre><o:p> </o:p></pre><pre>$data = $rs->CacheGetOne($sql); ## MyCacheClass is used here for caching...</pre></div>
|
||
|
||
<p>Memcache supports multiple pooled hosts now. Only if none of the pooled
|
||
servers can be contacted will a connect error be generated. Usage example
|
||
below: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$db = NewADOConnection($driver);</pre><pre>$db->memCache = true; /// should we use memCache instead of caching in files</pre><pre>$db->memCacheHost = array($ip1, $ip2, $ip3); /// $db->memCacheHost = $ip1; still works</pre><pre>$db->memCachePort = 11211; /// this is default memCache port</pre><pre>$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</pre><pre><o:p> </o:p></pre><pre>$db->Connect(...);</pre><pre>$db->CacheExecute($sql);</pre></div>
|
||
|
||
<p><a name=4.98></a><b>4.98/5.04 13 Feb 2008</b> </p>
|
||
|
||
<p>Fixed adodb_mktime problem which causes a performance bottleneck in $hrs. </p>
|
||
|
||
<p>Added mysqli support to adodb_getcount(). </p>
|
||
|
||
<p>Removed MYSQLI_TYPE_CHAR from MetaType(). </p>
|
||
|
||
<p><a name=4.97></a><b>4.97/5.03 22 Jan 2008</b> </p>
|
||
|
||
<p>Active Record: $ADODB_ASSOC_CASE=1 did not work properly. Fixed. </p>
|
||
|
||
<p>Modified Fields() in recordset class to support display null fields in
|
||
FetchNextObject(). </p>
|
||
|
||
<p>In ADOdb5, active record implementation, we now support column names with
|
||
spaces in them - we autoconvert the spaces to _ using __set(). Thx Daniel Cook.
|
||
http://phplens.com/lens/lensforum/msgs.php?id=17200 </p>
|
||
|
||
<p>Removed $arg3 from mysqli SelectLimit. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=16243. Thx Zsolt Szeberenyi. </p>
|
||
|
||
<p>Changed oci8 FetchField, which returns the max_length of BLOB/CLOB/NCLOB as
|
||
4000 (incorrectly) to -1. </p>
|
||
|
||
<p>CacheExecute would sometimes return an error on Windows if it was unable to
|
||
lock the cache file. This is harmless and has been changed to a warning that
|
||
can be ignored. Also adodb_write_file() code revised. </p>
|
||
|
||
<p>ADOdb perf code changed to only log sql if execution time >= 0.05
|
||
seconds. New $ADODB_PERF_MIN variable holds min sql timing. Any SQL with timing
|
||
value below this and is not causing an error is not logged. </p>
|
||
|
||
<p>Also adodb_backtrace() now traces 1 level deeper as sometimes actual culprit
|
||
function is not displayed. </p>
|
||
|
||
<p>Fixed a group by problem with adodb_getcount() for db's which are not
|
||
postgres/oci8 based. </p>
|
||
|
||
<p>Changed mssql driver Parameter() from SQLCHAR to SQLVARCHAR: case 'string':
|
||
$type = SQLVARCHAR; break. </p>
|
||
|
||
<p>Problem with mssql driver in php5 (for adodb 5.03) because some functions
|
||
are not static. Fixed. </p>
|
||
|
||
<p><a name=4.96></a><b>4.96/5.02 24 Sept 2007</b> </p>
|
||
|
||
<p>ADOdb perf for oci8 now has non-table-locking code when clearing the sql.
|
||
Slower but better transparency. Added in 4.96a and 5.02a. </p>
|
||
|
||
<p>Fix adodb count optimisation. Preg_match did not work properly. Also rewrote
|
||
the ORDER BY stripping code in _adodb_getcount(), adodb-lib.inc.php. </p>
|
||
|
||
<p>SelectLimit for oci8 not optimal for large recordsets when offset=0. Changed
|
||
$nrows check. </p>
|
||
|
||
<p>Active record optimizations. Added support for assoc arrays in Set(). </p>
|
||
|
||
<p>Now GetOne returns null if EOF (no records found), and false if error
|
||
occurs. Use ErrorMsg()/ErrorNo() to get the error. </p>
|
||
|
||
<p>Also CacheGetRow and CacheGetCol will return false if error occurs, or empty
|
||
array() if EOF, just like GetRow and GetCol. </p>
|
||
|
||
<p>Datadict now allows changing of types which are not resizable, eg. VARCHAR
|
||
to TEXT in ChangeTableSQL. -- Mateo Tibaquir<69> </p>
|
||
|
||
<p>Added BIT data type support to adodb-ado.inc.php and adodb-ado5.inc.php. </p>
|
||
|
||
<p>Ldap driver did not return actual ldap error messages. Fixed. </p>
|
||
|
||
<p>Implemented GetRandRow($sql, $inputarr). Optimized for Oci8. </p>
|
||
|
||
<p>Changed adodb5 active record to use static SetDatabaseAdapter() and removed
|
||
php4 constructor. Bas van Beek bas.vanbeek#gmail.com. </p>
|
||
|
||
<p>Also in adodb5, changed adodb-session2 to use static function declarations
|
||
in class. Thx Daniel <st1:State w:st="on"><st1:place w:st="on">Berlin</st1:place></st1:State>.
|
||
</p>
|
||
|
||
<p>Added "Clear SQL Log" to bottom of Performance screen. </p>
|
||
|
||
<p>Sessions2 code echo'ed directly to the screen in debug mode. Now uses
|
||
ADOConnection::outp(). </p>
|
||
|
||
<p>In mysql/mysqli, qstr(null) will return the string "null" instead
|
||
of empty quoted string "''". </p>
|
||
|
||
<p>postgresql optimizeTable in perf-postgres.inc.php added by Daniel Berlin
|
||
(mail#daniel-berlin.de) </p>
|
||
|
||
<p>Added 5.2.1 compat code for oci8. </p>
|
||
|
||
<p>Changed @@identity to SCOPE_IDENTITY() for multiple mssql drivers. Thx
|
||
Stefano Nari. </p>
|
||
|
||
<p>Code sanitization introduced in 4.95 caused problems in European locales (as
|
||
float 3.2 was typecast to 3,2). Now we only sanitize if is_numeric fails. </p>
|
||
|
||
<p>Added support for customizing ADORecordset_empty using
|
||
$this->rsPrefix.'empty'. By Josh Truwin. </p>
|
||
|
||
<p>Added proper support for ALterColumnSQL for Postgresql in datadict code.
|
||
Thx. Josh Truwin. </p>
|
||
|
||
<p>Added better support for MetaType() in mysqli when using an array recordset.
|
||
</p>
|
||
|
||
<p>Changed parser for pgsql error messages in adodb-error.inc.php to
|
||
case-insensitive regex. </p>
|
||
|
||
<p><a name=4.95></a><b>4.95/5.01 17 May 2007</b> </p>
|
||
|
||
<p>CacheFlush debug outp() passed in invalid parameters. Fixed. </p>
|
||
|
||
<p>Added Thai language file for adodb. Thx Trirat Petchsingh rosskouk#gmail.com
|
||
and Marcos Pont</p>
|
||
|
||
<p>Added zerofill checking support to MetaColumns for mysql and mysqli. </p>
|
||
|
||
<p>CacheFlush no longer deletes all files/directories. Only *.cache files
|
||
deleted.</p>
|
||
|
||
<p>DB2 timestamp format changed to var $fmtTimeStamp =
|
||
"'Y-m-d-H:i:s'";</p>
|
||
|
||
<p>Added some code sanitization to AutoExecute in adodb-lib.inc.php.</p>
|
||
|
||
<p>Due to typo, all connections in adodb-oracle.inc.php would become
|
||
persistent, even non-persistent ones. Fixed.</p>
|
||
|
||
<p>Oci8 DBTimeStamp uses 24 hour time for input now, so you can perform string
|
||
comparisons between 2 DBTimeStamp values.</p>
|
||
|
||
<p>Some PHP4.4 compat issues fixed in adodb-session2.inc.php</p>
|
||
|
||
<p>For ADOdb 5.01, fixed some adodb-datadict.inc.php MetaType compat issues
|
||
with PHP5. </p>
|
||
|
||
<p>The $argHostname was wiped out in adodb-ado5.inc.php. Fixed. </p>
|
||
|
||
<p>Adodb5 version, added iterator support for adodb_recordset_empty. </p>
|
||
|
||
<p>Adodb5 version,more error checking code now will use exceptions if
|
||
available. </p>
|
||
|
||
<p><a name=4.94></a><b>4.94 23 Jan 2007</b> </p>
|
||
|
||
<p>Active Record: $ADODB_ASSOC_CASE=2 did not work properly. Fixed. Thx
|
||
gmane#auxbuss.com. </p>
|
||
|
||
<p>mysqli had bugs in BeginTrans() and EndTrans(). Fixed.</p>
|
||
|
||
<p>Improved error handling when no database is connected for oci8. Thx Andy
|
||
Hassall.</p>
|
||
|
||
<p>Names longer than 30 chars in oci8 datadict will be changed to random name.
|
||
Thx Eugenio. http://phplens.com/lens/lensforum/msgs.php?id=16182 </p>
|
||
|
||
<p>Added var $upperCase = 'ucase' to access and ado_access drivers. Thx Renato
|
||
De Giovanni renato#cria.org.br</p>
|
||
|
||
<p>Postgres64 driver, if preparing plan failed in _query, did not handle error
|
||
properly. Fixed. See http://phplens.com/lens/lensforum/msgs.php?id=16131. </p>
|
||
|
||
<p>Fixed GetActiveRecordsClass() reference bug. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=16120 </p>
|
||
|
||
<p>Added handling of nulls in adodb-ado_mssql.inc.php for qstr(). Thx to Felix
|
||
Rabinovich. </p>
|
||
|
||
<p>Adodb-dict contributions by Gaetano: <br>
|
||
+ Support for INDEX in data-dict. Example: idx_ev1. The ability to define
|
||
indexes using the INDEX keyword was added in ADOdb 4.94. The following example
|
||
features mutiple indexes, including a compound index idx_ev1. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_id I(11) NOTNULL AUTOINCREMENT PRIMARY,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_type I(4) NOTNULL<span style='mso-spacerun:yes'><EFBFBD> </span><b>INDEX idx_evt</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_start_date T DEFAULT NULL <b>INDEX id_esd</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_end_date T DEFAULT '0000-00-00 00:00:00' <b>INDEX id_eted</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_parent I(11) UNSIGNED NOTNULL DEFAULT 0 <b>INDEX id_evp</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_owner I(11) DEFAULT 0 <b>INDEX idx_ev1</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_project I(11) DEFAULT 0 <b>INDEX idx_ev1</b>,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_times_recuring I(11) UNSIGNED NOTNULL DEFAULT 0,</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_icon C(20) DEFAULT 'obj/event',</pre><pre><span style='mso-spacerun:yes'><EFBFBD> </span>event_description X</pre></div>
|
||
|
||
<p class=MsoNormal><br>
|
||
+ Prevents the generated SQL from including double drop-sequence statements for
|
||
REPLACE case of tables with autoincrement columns (on those dbs that emulate it
|
||
via sequences) <br>
|
||
+ makes any date defined as DEFAULT value for D and T columns work
|
||
cross-database, not just the "sysdate" value (as long as it is
|
||
specified using adodb standard format). See above example. </p>
|
||
|
||
<p>Fixed pdo's GetInsertID() support. Thx Ricky Su. </p>
|
||
|
||
<p>oci8 Prepare() now sets error messages if an error occurs. </p>
|
||
|
||
<p>Added 'PT_BR' to SetDateLocale() -- brazilian portugese. </p>
|
||
|
||
<p>charset in oci8 was not set correctly on *Connect() </p>
|
||
|
||
<p>ADOConnection::Transpose() now appends as first column the field names. </p>
|
||
|
||
<p>Added $ADODB_QUOTE_FIELDNAMES. If set to true, will autoquote field names in
|
||
AutoExecute(),GetInsertSQL(), GetUpdateSQL(). </p>
|
||
|
||
<p>Transpose now adds the field names as the first column after transposition. </p>
|
||
|
||
<p>Added === check in ADODB_SetDatabaseAdapter for $db,
|
||
adodb-active-record.inc.php. Thx Christian Affolter. </p>
|
||
|
||
<p>Added ErrorNo() to adodb-active-record.inc.php. Thx ante#novisplet.com. </p>
|
||
|
||
<p><a name=4.93></a><b>4.93 10 Oct 2006</b> </p>
|
||
|
||
<p>Added support for multiple database connections in performance monitoring
|
||
code (adodb-perf.inc.php). Now all sql in multiple database connections can be
|
||
saved into one database ($ADODB_LOG_CONN). </p>
|
||
|
||
<p>Added MetaIndexes() to odbc_mssql. </p>
|
||
|
||
<p>Added connection property $db->null2null = 'null'. In
|
||
autoexecute/getinsertsql/getupdatesql, this value will be converted to a null.
|
||
Set this to a funny invalid value if you do not want null conversion. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=15902. </p>
|
||
|
||
<p>Path disclosure problem in mysqli fixed. Thx Andy. </p>
|
||
|
||
<p>Fixed typo in session_schema2.xml. </p>
|
||
|
||
<p>Changed INT in oci8 to return correct precision in $fld->max_length,
|
||
MetaColumns(). <st1:place w:st="on"><st1:PlaceName w:st="on">Thx</st1:PlaceName>
|
||
<st1:PlaceName w:st="on">Eloy</st1:PlaceName> <st1:PlaceName w:st="on">Lafuente</st1:PlaceName>
|
||
<st1:PlaceType w:st="on">Plaza</st1:PlaceType></st1:place>. </p>
|
||
|
||
<p>Patched postgres64 _connect to handle serverinfo(). see http://phplens.com/lens/lensforum/msgs.php?id=15887.
|
||
</p>
|
||
|
||
<p>Added pdo fix for null columns. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=15889 </p>
|
||
|
||
<p>For stored procedures, missing connection id now passed into mssql_query().
|
||
Thx Ecsy (ecsy#freemail.hu). </p>
|
||
|
||
<p><a name=4.92a></a><b>4.92a 30 Aug 2006</b> </p>
|
||
|
||
<p>Syntax error in postgres7 driver. <st1:place w:st="on"><st1:PlaceName w:st="on">Thx</st1:PlaceName>
|
||
<st1:PlaceName w:st="on">Eloy</st1:PlaceName> <st1:PlaceName w:st="on">Lafuente</st1:PlaceName>
|
||
<st1:PlaceType w:st="on">Plaza</st1:PlaceType></st1:place>. </p>
|
||
|
||
<p>Minor bug fixes - adodb informix 10 types added to adodb.inc.php. Thx
|
||
Fernando Ortiz. </p>
|
||
|
||
<p><a name=4.92></a><b>4.92 29 Aug 2006</b> </p>
|
||
|
||
<p>Better odbtp date support. </p>
|
||
|
||
<p>Added IgnoreErrors() to bypass default error handling. </p>
|
||
|
||
<p>The _adodb_getcount() function in adodb-lib.inc.php, some ORDER BY bug
|
||
fixes. </p>
|
||
|
||
<p>For ibase and firebird, set $sysTimeStamp = "CURRENT_TIMESTAMP". </p>
|
||
|
||
<p>Fixed postgres connection bug:
|
||
http://phplens.com/lens/lensforum/msgs.php?id=11057. </p>
|
||
|
||
<p>Changed CacheSelectLimit() to flush cache when $secs2cache==-1 due to
|
||
complaints from other users. </p>
|
||
|
||
<p>Added support for using memcached with CacheExecute/CacheSelectLimit.
|
||
Requires memcache module PECL extension. Usage: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$db = NewADOConnection($driver);</pre><pre>$db->memCache = true; /// should we use memCache instead of caching in files</pre><pre>$db->memCacheHost = "126.0.1.1"; /// memCache host</pre><pre>$db->memCachePort = 11211; /// this is default memCache port</pre><pre>$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)</pre><pre><o:p> </o:p></pre><pre>$db->Connect(...);</pre><pre>$db->CacheExecute($sql);</pre></div>
|
||
|
||
<p>Implemented Transpose() for recordsets. Recordset must be retrieved using
|
||
ADODB_FETCH_NUM. First column becomes the column name. </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>$DB = NewADOConnection('mysql');</pre><pre>$DB->Connect(...);</pre><pre>$DB->SetFetchMode(ADODB_FETCH_NUM);</pre><pre>$rs = $DB->Execute('select productname,productid,unitprice from products limit 10');</pre><pre>$rs2 = $DB->Transpose($rs);</pre><pre>rs2html($rs2);</pre></div>
|
||
|
||
<p><a name=4.91></a><b>4.91 2 Aug 2006</b> </p>
|
||
|
||
<p>Major session code rewrite .... See session docs. </p>
|
||
|
||
<p>PDO bindinputarray was not set properly for MySQL (changed from true to
|
||
false). </p>
|
||
|
||
<p>Changed CacheSelectLimit() to re-cache when $secs2cache==0. This is one way
|
||
to flush the cache when SelectLimit is called. </p>
|
||
|
||
<p>Added to quotes to mysql and mysqli: "SHOW COLUMNS FROM `%s`"; </p>
|
||
|
||
<p>Removed accidental optgroup handling in GetMenu(). Fixed ibase _BlobDecode
|
||
for php5 compat, and also mem alloc issues for small blobs, thx
|
||
salvatori#interia.pl </p>
|
||
|
||
<p>Mysql driver OffsetDate() speedup, useful for adodb-sessions. </p>
|
||
|
||
<p>Fix for GetAssoc() PHP5 compat. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=15425 </p>
|
||
|
||
<p>Active Record - If inserting a record and the value of a primary key field
|
||
is null, then we do not insert that field in as we assume it is an
|
||
auto-increment field. Needed by mssql. </p>
|
||
|
||
<p>Changed postgres7 MetaForeignKeys() see http://phplens.com/lens/lensforum/msgs.php?id=15531
|
||
</p>
|
||
|
||
<p>DB2 will now return db2_conn_errormsg() when it is a connection error. </p>
|
||
|
||
<p><a name=4.90></a><b>4.90 8 June 2006</b> </p>
|
||
|
||
<p>Changed adodb_countrec() in adodb-lib.inc.php to allow LIMIT to be used as a
|
||
speedup to reduce no of records counted. </p>
|
||
|
||
<p>Added support for transaction modes for postgres and oci8 with
|
||
SetTransactionMode(). These transaction modes affect all subsequent
|
||
transactions of that connection. </p>
|
||
|
||
<p>Thanks to Halmai Csongor for suggestion. </p>
|
||
|
||
<p>Removed $off = $fieldOffset - 1 line in db2 driver, FetchField(). Tx Larry
|
||
Menard. </p>
|
||
|
||
<p>Added support for PHP5 objects as Execute() bind parameters using __toString
|
||
(eg. Simple-XML). Thx Carl-Christian Salvesen. </p>
|
||
|
||
<p>Rounding in tohtml.inc.php did not work properly. Fixed. </p>
|
||
|
||
<p>MetaIndexes in postgres fails when fields are deleted then added in again
|
||
because the attnum has gaps in it. See
|
||
http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976.
|
||
Fixed. </p>
|
||
|
||
<p>MetaForeignkeys in mysql and mysqli did not work when
|
||
fetchMode==ADODB_FETCH_ASSOC used. Fixed. </p>
|
||
|
||
<p>Reference error in AutoExecute() fixed. </p>
|
||
|
||
<p>Added macaddr postgres type to MetaType. Maps to 'C'. </p>
|
||
|
||
<p>Added to _connect() in adodb-ado5.inc.php support for $database and
|
||
$dataProvider parameters. Thx Larry Menard. </p>
|
||
|
||
<p>Added support for sequences in adodb-ado_mssql.inc.php. Thx Larry Menard. </p>
|
||
|
||
<p>Added ADODB_SESSION_READONLY. </p>
|
||
|
||
<p>Added session expiryref support to crc32 mode, and in LOB code. </p>
|
||
|
||
<p>Clear _errorMsg in postgres7 driver, so that ErrorMsg() displays properly
|
||
when no error occurs. </p>
|
||
|
||
<p>Added BindDate and BindTimeStamp </p>
|
||
|
||
<p><a name=4.81></a><b>4.81 3 May 2006</b> </p>
|
||
|
||
<p>Fixed variable ref errors in adodb-ado5.inc.php in _query(). </p>
|
||
|
||
<p>Mysqli setcharset fix using method_exists(). </p>
|
||
|
||
<p>The adodb-perf.inc.php CreateLogTable() code now works for user-defined
|
||
table names. </p>
|
||
|
||
<p>Error in ibase_blob_open() fixed. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=14997 </p>
|
||
|
||
<p><a name=4.80></a><b>4.80 8 Mar 2006</b> </p>
|
||
|
||
<p>Added activerecord support. </p>
|
||
|
||
<p>Added mysql $conn->compat323 = true if you want MySQL 3.23 compat
|
||
enabled. Fixes GetOne() Select-Limit problems. </p>
|
||
|
||
<p>Added adodb-xmlschema03.inc.php to support XML Schema version 3 and updated
|
||
adodb-datadict.htm docs. </p>
|
||
|
||
<p>Better memory management in Execute. Thx Mike Fedyk. </p>
|
||
|
||
<p><a name=4.72></a><b>4.72 21 Feb 2006</b> </p>
|
||
|
||
<p>Added 'new' DSN parameter for NConnect(). </p>
|
||
|
||
<p>Pager now sanitizes $PHP_SELF to protect against XSS. Thx to James Bercegay
|
||
and others. </p>
|
||
|
||
<p>ADOConnection::MetaType changed to setup $rs->connection correctly. </p>
|
||
|
||
<p>New native DB2 driver contributed by Larry Menard, Dan Scott, Andy
|
||
Staudacher, Bharat Mediratta. </p>
|
||
|
||
<p>The mssql CreateSequence() did not BEGIN TRANSACTION correctly. Fixed. Thx
|
||
Sean Lee. </p>
|
||
|
||
<p>The _adodb_countrecs() function in adodb-lib.inc.php has been revised to
|
||
handle more ORDER BY variations. </p>
|
||
|
||
<p><a name=4.71></a><b>4.71 24 Jan 2006</b> </p>
|
||
|
||
<p>Fixes postgresql security issue related to binary strings. Thx to Andy
|
||
Staudacher. </p>
|
||
|
||
<p>Several DSN bugs found: </p>
|
||
|
||
<p>1. Fix bugs in DSN connections introduced in 4.70 when underscores are found
|
||
in the DSN. </p>
|
||
|
||
<p>2. DSN with _ did not work properly in PHP5 (fine in PHP4). Fixed. </p>
|
||
|
||
<p>3. Added support for PDO DSN connections in NewADOConnection(), and database
|
||
parameter in PDO::Connect(). </p>
|
||
|
||
<p>The oci8 datetime flag not correctly implemented in ADORecordSet_array.
|
||
Fixed. </p>
|
||
|
||
<p>Added BlobDelete() to postgres, as a counterpoint to UpdateBlobFile(). </p>
|
||
|
||
<p>Fixed GetInsertSQL() to support oci8po. </p>
|
||
|
||
<p>Fixed qstr() issue with postgresql with \0 in strings. </p>
|
||
|
||
<p>Fixed some datadict driver loading issues in _adodb_getdriver(). </p>
|
||
|
||
<p>Added register shutdown function session_write_close in
|
||
adodb-session.inc.php for PHP 5 compat. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=14200. </p>
|
||
|
||
<p><a name=4.70></a><b>4.70 6 Jan 2006</b> </p>
|
||
|
||
<p>Many fixes from Danila Ulyanov to ibase, oci8, postgres, mssql, odbc_oracle,
|
||
odbtp, etc drivers. </p>
|
||
|
||
<p>Changed usage of binary hint in adodb-session.inc.php for mysql. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=14160 </p>
|
||
|
||
<p>Fixed invalid variable reference problem in undomq(), adodb-perf.inc.php. </p>
|
||
|
||
<p>Fixed http://phplens.com/lens/lensforum/msgs.php?id=14254 in
|
||
adodb-perf.inc.php, _DBParameter() settings of fetchmode was wrong. </p>
|
||
|
||
<p>Fixed security issues in server.php and tmssql.php discussed by Andreas
|
||
Sandblad in a Secunia security advisory. Added $ACCEPTIP = 127.0.0.1 and
|
||
changed suggested root password to something more secure. </p>
|
||
|
||
<p>Changed pager to close recordset after RenderLayout(). </p>
|
||
|
||
<p><a name=4.68></a><b>4.68 25 Nov 2005</b> </p>
|
||
|
||
<p>PHP 5 compat for mysqli. MetaForeignKeys repeated twice and
|
||
MYSQLI_BINARY_FLAG missing. </p>
|
||
|
||
<p>PHP 5.1 support for postgresql bind parameters using ? did not work if >=
|
||
10 parameters. Fixed. Thx to Stanislav Shramko. </p>
|
||
|
||
<p>Lots of PDO improvements. </p>
|
||
|
||
<p>Spelling error fixed in mysql MetaForeignKeys, $associative parameter. </p>
|
||
|
||
<p><a name=4.67></a><b>4.67 16 Nov 2005</b> </p>
|
||
|
||
<p>Postgresql not_null flag not set to false correctly. Thx Cristian MARIN. </p>
|
||
|
||
<p>We now check in Replace() if key is in fieldArray. Thx S<>bastien Vanvelthem.
|
||
</p>
|
||
|
||
<p>_file_get_contents() function was missing in xmlschema. fixed. </p>
|
||
|
||
<p>Added week in year support to SQLDate(), using 'W' flag. Thx Spider. </p>
|
||
|
||
<p>In sqlite metacolumns was repeated twice, causing PHP 5 problems. Fixed. </p>
|
||
|
||
<p>Made debug output XHTML compliant. </p>
|
||
|
||
<p><a name=4.66></a><b>4.66 28 Sept 2005</b> </p>
|
||
|
||
<p>ExecuteCursor() in oci8 did not clean up properly on failure. Fixed. </p>
|
||
|
||
<p>Updated xmlschema.dtd, by "Alec Smecher" asmecher#smecher.bc.ca </p>
|
||
|
||
<p>Hardened SelectLimit, typecasting nrows and offset to integer. </p>
|
||
|
||
<p>Fixed misc bugs in AutoExecute() and GetInsertSQL(). </p>
|
||
|
||
<p>Added $conn->database as the property holding the database name. The
|
||
older $conn->databaseName is retained for backward compat. </p>
|
||
|
||
<p>Changed _adodb_backtrace() compat check to use function_exists(). </p>
|
||
|
||
<p>Bug in postgresql MetaIndexes fixed. Thx Kevin Jamieson. </p>
|
||
|
||
<p>Improved OffsetDate for MySQL, reducing rounding error. </p>
|
||
|
||
<p>Metacolumns added to sqlite. Thx Mark Newnham. </p>
|
||
|
||
<p>PHP 4.4 compat fixes for GetAssoc(). </p>
|
||
|
||
<p>Added postgresql bind support for php 5.1. Thx Cristiano da Cunha Duarte </p>
|
||
|
||
<p>OffsetDate() fixes for postgresql, typecasting strings to date or timestamp.
|
||
</p>
|
||
|
||
<p>DBTimeStamp formats for mssql, odbc_mssql and postgresql made to conform
|
||
with other db's. </p>
|
||
|
||
<p>Changed PDO constants from PDO_ to PDO:: to support latest spec. </p>
|
||
|
||
<p><a name=4.65></a><b>4.65 22 July 2005</b> </p>
|
||
|
||
<p>Reverted 'X' in mssql datadict to 'TEXT' to be compat with mssql driver.
|
||
However now you can set $datadict->typeX = 'varchar(4000)' or 'TEXT' or
|
||
'CLOB' for mssql and oci8 drivers. </p>
|
||
|
||
<p>Added charset support when using DSN for Oracle. </p>
|
||
|
||
<p>_adodb_getmenu did not use fieldcount() to get number of fields. Fixed. </p>
|
||
|
||
<p>MetaForeignKeys() for mysql/mysqli contributed by Juan Carlos Gonzalez. </p>
|
||
|
||
<p>MetaDatabases() now correctly returns an array for mysqli driver. Thx
|
||
Cristian MARIN. </p>
|
||
|
||
<p>CompleteTrans(false) did not return false. Fixed. Thx to JMF. </p>
|
||
|
||
<p>AutoExecute() did not work with Oracle. Fixed. Thx Jos<6F> Moreira. </p>
|
||
|
||
<p>MetaType() added to connection object. </p>
|
||
|
||
<p>More PHP 4.4 reference return fixes. Thx Ryan C Bonham and others. </p>
|
||
|
||
<p><a name=4.64></a><b>4.64 20 June 2005</b> </p>
|
||
|
||
<p>In datadict, if the default field value is set to '', then it is not applied
|
||
when the field is created. Fixed by Eugenio. </p>
|
||
|
||
<p>MetaPrimaryKeys for postgres did not work because of true/false change in
|
||
4.63. Fixed. </p>
|
||
|
||
<p>Tested ocifetchstatement in oci8. Rejected at the end. </p>
|
||
|
||
<p>Added port to dsn handling. Supported in postgres, mysql, mysqli,ldap. </p>
|
||
|
||
<p>Added 'w' and 'l' to mysqli SQLDate(). </p>
|
||
|
||
<p>Fixed error handling in ldap _connect() to be more consistent. Also added
|
||
ErrorMsg() handling to ldap. </p>
|
||
|
||
<p>Added support for union in _adodb_getcount, adodb-lib.inc.php for postgres
|
||
and oci8. </p>
|
||
|
||
<p>rs2html() did not work with null dates properly. </p>
|
||
|
||
<p>PHP 4.4 reference return fixes. </p>
|
||
|
||
<p><a name=4.63></a><b>4.63 18 May 2005</b> </p>
|
||
|
||
<p>Added $nrows<0 check to mysqli's SelectLimit().
|
||
<p>Added OptimizeTable() and OptimizeTables() in adodb-perf.inc.php. By Markus Staab.
|
||
<p>PostgreSQL inconsistencies fixed. true and false set to TRUE and FALSE, and boolean type in datadict-postgres.inc.php set
|
||
to 'L' => 'BOOLEAN'. Thx Kevin Jamieson.
|
||
<p>New adodb_session_create_table() function in adodb-session.inc.php. By Markus Staab.
|
||
<p>Added null check to UserTimeStamp().
|
||
<p>Fixed typo in mysqlt driver in adorecordset. Thx to Andy Staudacher.
|
||
<p>GenID() had a bug in the raiseErrorFn handling. Fixed. Thx Marcos Pont.
|
||
<p>Datadict name quoting now handles ( ) in index fields correctly - they aren't part of the index field. ></p>
|
||
|
||
<p>Performance monitoring: (1) oci8 Ixora checks moved down; (2) expensive sql
|
||
changed so that only those sql with count(*)>1 are shown; (3) changed sql1
|
||
field to a length+crc32 checksum - this breaks backward compat. </p>
|
||
|
||
<p>We remap firebird15 to firebird in data dictionary. </p>
|
||
|
||
<p><a name=4.62></a><b>4.62 2 Apr 2005</b> </p>
|
||
|
||
<p>Added 'w' (dow as 0-6 or 1-7) and 'l' (dow as string) for SQLDate for oci8,
|
||
postgres and mysql. </p>
|
||
|
||
<p>Rolled back MetaType() changes for mysqli done in prev version. </p>
|
||
|
||
<p>Datadict change by chris, cblin#tennaxia.com data mappings from: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>oci8:<span style='mso-spacerun:yes'><EFBFBD> </span>X->varchar(4000) XL->CLOB</pre><pre>mssql: X->XL->TEXT</pre><pre>mysql: X->XL->LONGTEXT</pre><pre>fbird: X->XL->varchar(4000)</pre></div>
|
||
|
||
<p>to: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre><o:p> </o:p></pre><pre>oci8:<span style='mso-spacerun:yes'><EFBFBD> </span>X->varchar(4000) XL->CLOB</pre><pre>mssql: X->VARCHAR(4000) XL->TEXT</pre><pre>mysql: X->TEXT<span style='mso-spacerun:yes'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>XL->LONGTEXT</pre><pre>fbird: X->VARCHAR(4000) XL->VARCHAR(32000)</pre></div>
|
||
|
||
<p>Added $connection->disableBlobs to postgresql to improve performance when
|
||
no bytea is used (2-5% improvement). </p>
|
||
|
||
<p>Removed all HTTP_* vars. </p>
|
||
|
||
<p>Added $rs->tableName to be set before calling AutoExecute(). </p>
|
||
|
||
<p>Alex Rootoff rootoff#pisem.net contributed ukrainian language file. </p>
|
||
|
||
<p>Added new mysql_option() support using $conn->optionFlags array. </p>
|
||
|
||
<p>Added support for ldap_set_option() using the $LDAP_CONNECT_OPTIONS global
|
||
variable. Contributed by Josh Eldridge. </p>
|
||
|
||
<p>Added LDAP_* constant definitions to ldap. </p>
|
||
|
||
<p>Added support for boolean bind variables. We use $conn->false and
|
||
$conn->true to hold values to set false/true to. </p>
|
||
|
||
<p>We now do not close the session connection in adodb-session.inc.php as other
|
||
objects could be using this connection. </p>
|
||
|
||
<p>We now strip off \0 at end of Ixora SQL strings in $perf->tohtml() for
|
||
oci8. </p>
|
||
|
||
<p><a name=4.61></a><b>4.61 23 Feb 2005</b> </p>
|
||
|
||
<p>MySQLi added support for mysqli_connect_errno() and mysqli_connect_error(). </p>
|
||
|
||
<p>Massive improvements to alpha PDO driver. </p>
|
||
|
||
<p>Quote string bind parameters logged by performance monitor for easy type
|
||
checking. Thx Jason Judge. </p>
|
||
|
||
<p>Added support for $role when connecting with Interbase/firebird. </p>
|
||
|
||
<p>Added support for enum recognition in MetaColumns() mysql and mysqli. Thx
|
||
Amedeo Petrella. </p>
|
||
|
||
<p>The sybase_ase driver contributed by Interakt Online. Thx Cristian Marin
|
||
cristic#interaktonline.com. </p>
|
||
|
||
<p>Removed not_null, has_default, and default_value from ADOFieldObject. </p>
|
||
|
||
<p>Sessions code, fixed quoting of keys when handling LOBs in session write()
|
||
function. </p>
|
||
|
||
<p>Sessions code, added adodb_session_regenerate_id(), to reduce risk of
|
||
session hijacking by changing session cookie dynamically. Thx Joe Li. </p>
|
||
|
||
<p>Perf monitor, polling for CPU did not work for PHP 4.3.10 and 5.0.0-5.0.3
|
||
due to PHP bugs, so we special case these versions. </p>
|
||
|
||
<p>Postgresql, UpdateBlob() added code to handle type==CLOB. </p>
|
||
|
||
<p><a name=4.60></a><b>4.60 24 Jan 2005</b> </p>
|
||
|
||
<p>Implemented PEAR DB's autoExecute(). Simplified design because I don't like
|
||
using constants when strings work fine. </p>
|
||
|
||
<p>_rs2serialize will now update $rs->sql and $rs->oldProvider. </p>
|
||
|
||
<p>Added autoExecute(). </p>
|
||
|
||
<p>Added support for postgres8 driver. Currently just remapped to postgres7
|
||
driver. </p>
|
||
|
||
<p>Changed oci8 _query(), so that OCIBindByName() sets the length to -1 if
|
||
element size is > 4000. This provides better support for LONGs. </p>
|
||
|
||
<p>Added SetDateLocale() support for <st1:country-region w:st="on"><st1:place
|
||
w:st="on">netherlands</st1:place></st1:country-region> (Nl). </p>
|
||
|
||
<p>Spelling error in pivot code ($iff should be $iif). </p>
|
||
|
||
<p>mysql insert_id() did not work with mysql 3.x. Fixed. </p>
|
||
|
||
<p>"\r\n" not converted to spaces correctly in exporting data. Fixed.
|
||
</p>
|
||
|
||
<p>_nconnect() in mysqli did not return value correctly. Fixed. </p>
|
||
|
||
<p>Arne Eckmann contributed danish language file. </p>
|
||
|
||
<p>Added clone() support to FetchObject() for PHP5.</p>
|
||
|
||
<p>Removed SQL_CUR_USE_ODBC from odbc_mssql.</p>
|
||
|
||
<p><a name=4.55></a><b>4.55 5 Jan 2005</b> </p>
|
||
|
||
<p>Found bug in Execute() with bind params for db's that do not support binding
|
||
natively. </p>
|
||
|
||
<p>DropSequence() now correctly uses default parameter. </p>
|
||
|
||
<p>Now Execute() ignores locale for floats, so 1.23 is NEVER converted to 1,23.
|
||
</p>
|
||
|
||
<p>SetFetchMode() not properly saved in adodb-perf, suspicious sql and
|
||
expensive sql. Fixed. </p>
|
||
|
||
<p>Added INET to postgresql metatypes. Thx motzel. </p>
|
||
|
||
<p>Allow oracle hints to work when counting with _adodb_getcount in
|
||
adodb-lib.inc.php. Thx Chris Wrye. </p>
|
||
|
||
<p>Changed mysql insert_id() to use SELECT LAST_INSERT_ID(). </p>
|
||
|
||
<p>If alter col in datadict does not modify col type/size of actual col, then
|
||
it is removed from alter col code. By Mark Newham. Not perfect as MetaType()
|
||
!== ActualType(). </p>
|
||
|
||
<p>Added handling of view fields in metacolumns() for postgresql. Thx Renato De
|
||
Giovanni. </p>
|
||
|
||
<p>Added to informix MetaPrimaryKeys and MetaColumns fixes for null bit. Thx to
|
||
Cecilio Albero. </p>
|
||
|
||
<p>Removed obsolete connection_timeout() from perf code. </p>
|
||
|
||
<p>Added support for arrayClass in adodb-csv.inc.php. </p>
|
||
|
||
<p>RSFilter now accepts methods of the form $array($obj, 'methodname'). Thx to
|
||
blake#near-time.com. </p>
|
||
|
||
<p>Changed CacheFlush to $cmd = 'rm -rf
|
||
'.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/'; </p>
|
||
|
||
<p>For better cursor concurrency, added code to free ref cursors in oci8 when
|
||
$rs->Close() is called. Note that CLose() is called internally by the Get*
|
||
functions too. </p>
|
||
|
||
<p>Added IIF support for access when pivoting. Thx Volodia Krupach. </p>
|
||
|
||
<p>Added mssql datadict support for timestamp. Thx Alexios. </p>
|
||
|
||
<p>Informix pager fix. By Mario Ramirez. </p>
|
||
|
||
<p>ADODB_TABLE_REGEX now includes ':'. By Mario Ramirez. </p>
|
||
|
||
<p>Mark Newnham contributed MetaIndexes for oci8 and db2. </p>
|
||
|
||
<p><a name=4.54></a><b>4.54 5 Nov 2004</b> </p>
|
||
|
||
<p>Now you can set $db->charSet = ?? before doing a Connect() in oci8. </p>
|
||
|
||
<p>Added adodbFetchMode to sqlite. </p>
|
||
|
||
<p>Perf code, added a string typecast to substr in adodb_log_sql(). </p>
|
||
|
||
<p>Postgres: Changed BlobDecode() to use po_loread, added new $maxblobsize
|
||
parameter, and now it returns the blob instead of sending it to stdout - make
|
||
sure to mention that as a compat warning. Also added $db->IsOID($oid)
|
||
function; uses a heuristic, not guaranteed to work 100%. </p>
|
||
|
||
<p>Contributed arabic language file by "El-Shamaa, Khaled"
|
||
k.el-shamaa#cgiar.org </p>
|
||
|
||
<p>PHP5 exceptions did not handle @ protocol properly. Fixed. </p>
|
||
|
||
<p>Added ifnull handling for postgresql (using coalesce). </p>
|
||
|
||
<p>Added metatables() support for Postgresql 8.0 (no longer uses pg_%
|
||
dictionary tables). </p>
|
||
|
||
<p>Improved Sybase ErrorMsg() function. By Gaetano Giunta. </p>
|
||
|
||
<p>Improved oci8 SelectLimit() to use Prepare(). By Cristiano Duarte. </p>
|
||
|
||
<p>Type-cast $row parameter in ifx_fetch_row() to int. Thx stefan bodgan. </p>
|
||
|
||
<p>Ralf becker contributed improvements in postgresql, sapdb, mysql data
|
||
dictionary handling:<br>
|
||
- MySql and Postgres MetaType was reporting every int column which was part of
|
||
a primary key and unique as serial<br>
|
||
- Postgres was not reporting the scale of decimal types<br>
|
||
- MaxDB was padding the defaults of none-string types with spaces<br>
|
||
- MySql now correctly converts enum columns to varchar </p>
|
||
|
||
<p>Ralf also changed Postgresql datadict:<br>
|
||
- you cant add NOT NULL columns in postgres in one go, they need to be added as
|
||
NULL and then altered to NOT NULL<br>
|
||
- AlterColumnSQL could not change a varchar column with numbers into an integer
|
||
column, postgres need an explicit conversation<br>
|
||
- a re-created sequence was not set to the correct value, if the name was the
|
||
old name (no implicit sequence), now always the new name of the implicit
|
||
sequence is used</p>
|
||
|
||
<p>Sergio Strampelli added extra $intoken check to Lens_ParseArgs() in datadict
|
||
code. </p>
|
||
|
||
<p><a name=4.53></a><b>4.53 28 Sept 2004</b> </p>
|
||
|
||
<p>FetchMode cached in recordset is sometimes mapped to native db fetchMode.
|
||
Normally this does not matter, but when using cached recordsets, we need to
|
||
switch back to using adodb fetchmode. So we cache this in
|
||
$rs->adodbFetchMode if it differs from the db's fetchMode. </p>
|
||
|
||
<p>For informix we now set canSeek = false driver because stefan bodgan tells
|
||
me that seeking doesn't work. </p>
|
||
|
||
<p>SetDateLocale() never worked till now ;-) Thx david#tomato.it </p>
|
||
|
||
<p>Set $_bindInputArray = true in sapdb driver. Required for clob support. </p>
|
||
|
||
<p>Fixed some PEAR::DB emulation issues with isError() and isWarning. Thx to
|
||
Gert-Rainer Bitterlich. </p>
|
||
|
||
<p>Empty() used in getupdatesql without strlen() check. Fixed.</p>
|
||
|
||
<p>Added unsigned detection to mysql and mysqli drivers. Thx to dan cech. </p>
|
||
|
||
<p>Added hungarian language file. Thx to Hal<61>szv<7A>ri G<>bor. </p>
|
||
|
||
<p>Improved fieldname-type formatting of datadict SQL generated (adding
|
||
$widespacing parameter to _GenField). </p>
|
||
|
||
<p>Datadict oci8 DROP CONSTRAINTS misspelt. Fixed. Thx Mark Newnham. </p>
|
||
|
||
<p>Changed odbtp to dynamically change databaseType based on connection, eg.
|
||
from 'odbtp' to 'odbtp_mssql' when connecting to mssql database. </p>
|
||
|
||
<p>In datadict, MySQL I4 was wrongly mapped to MEDIUMINT, which is actually I3.
|
||
Fixed. </p>
|
||
|
||
<p>Fixed mysqli MetaType() recognition. Mysqli returns numeric types unlike
|
||
mysql extension. Thx Francesco Riosa. </p>
|
||
|
||
<p>VFP odbc driver curmode set wrongly, causing problems with memo fields.
|
||
Fixed. </p>
|
||
|
||
<p>Odbc driver did not recognize odbc version 2 driver date types properly.
|
||
Fixed. Thx Bostjan. </p>
|
||
|
||
<p>ChangeTableSQL() fixes to datadict-db2.inc.php by Mark Newnham. </p>
|
||
|
||
<p>Perf monitoring with odbc improved. Now we try in perf code to manually set
|
||
the sysTimeStamp using date() if sysTimeStamp is empty. </p>
|
||
|
||
<p>All <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>
|
||
errors are thrown as exceptions in PHP5. So we added exception handling to ado
|
||
in PHP5 by creating new adodb-ado5.inc.php driver. </p>
|
||
|
||
<p>Added IsConnected(). Returns true if connection object connected. By
|
||
Luca.Gioppo. </p>
|
||
|
||
<p>"Ralf Becker" RalfBecker#digitalROCK.de contributed new sapdb
|
||
data-dictionary driver and a large patch that implements field and table
|
||
renaming for oracle, mssql, postgresql, mysql and sapdb. See the new RenameTableSQL()
|
||
and RenameColumnSQL() functions. </p>
|
||
|
||
<p>We now check ExecuteCursor to see if PrepareSP was initially called. </p>
|
||
|
||
<p>Changed oci8 datadict to use MODIFY for $dd->alterCol. Thx Mark Newnham. </p>
|
||
|
||
<p><a name=4.52></a><b>4.52 10 Aug 2004</b> </p>
|
||
|
||
<p>Bug found in Replace() when performance logging enabled, introduced in ADOdb
|
||
4.50. Fixed. </p>
|
||
|
||
<p>Replace() checks update stmt. If update stmt fails, we now return
|
||
immediately. Thx to alex. </p>
|
||
|
||
<p>Added support for $ADODB_FORCE_TYPE in GetUpdateSQL/GetInsertSQL. Thx to
|
||
niko. </p>
|
||
|
||
<p>Added ADODB_ASSOC_CASE support to postgres/postgres7 driver. </p>
|
||
|
||
<p>Support for DECLARE stmt in oci8. Thx Lochbrunner. </p>
|
||
|
||
<p><a name=4.51></a><b>4.51 29 July 2004</b> </p>
|
||
|
||
<p>Added adodb-xmlschema 1.0.2. Thx dan and richard. </p>
|
||
|
||
<p>Added new adorecordset_ext_* classes. If ADOdb extension installed for
|
||
mysql, mysqlt and oci8 (but not oci8po), we use the superfast ADOdb extension
|
||
code for movenext. </p>
|
||
|
||
<p>Added schema support to mssql and odbc_mssql MetaPrimaryKeys(). </p>
|
||
|
||
<p>Patched MSSQL driver to support PHP NULL and Boolean values while binding
|
||
the input array parameters in the _query() function. By Stephen Farmer. </p>
|
||
|
||
<p>Added support for clob's for mssql, UpdateBlob(). Thx to
|
||
gfran#directa.com.br </p>
|
||
|
||
<p>Added normalize support for postgresql (true=lowercase table name, or
|
||
false=case-sensitive table names) to MetaColumns($table, $normalize=true). </p>
|
||
|
||
<p>PHP5 variant dates in <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>
|
||
not working. Fixed in adodb-ado.inc.php. </p>
|
||
|
||
<p>Constant ADODB_FORCE_NULLS was not working properly for many releases (for
|
||
GetUpdateSQL). Fixed. Also GetUpdateSQL strips off ORDER BY now - thx Elieser
|
||
Le<EFBFBD>o. </p>
|
||
|
||
<p>Perf Monitor for oci8 now dynamically highlights optimizer_* params if too
|
||
high/low. </p>
|
||
|
||
<p>Added dsn support to NewADOConnection/ADONewConnection. </p>
|
||
|
||
<p>Fixed out of page bounds bug in _adodb_pageexecute_all_rows() Thx to
|
||
"Sergio Strampelli" sergio#rir.it </p>
|
||
|
||
<p>Speedup of movenext for mysql and oci8 drivers. </p>
|
||
|
||
<p>Moved debugging code _adodb_debug_execute() to adodb-lib.inc.php. </p>
|
||
|
||
<p>Fixed postgresql bytea detection bug. See
|
||
http://phplens.com/lens/lensforum/msgs.php?id=9849. </p>
|
||
|
||
<p>Fixed ibase datetimestamp typo in PHP5. Thx stefan. </p>
|
||
|
||
<p>Removed whitespace at end of odbtp drivers. </p>
|
||
|
||
<p>Added db2 metaprimarykeys fix. </p>
|
||
|
||
<p>Optimizations to MoveNext() for mysql and oci8. Misc speedups to Get*
|
||
functions. </p>
|
||
|
||
<p><a name=4.50></a><b>4.50 6 July 2004</b> </p>
|
||
|
||
<p>Bumped it to 4.50 to avoid confusion with PHP 4.3.x series. </p>
|
||
|
||
<p>Added db2 metatables and metacolumns extensions. </p>
|
||
|
||
<p>Added alpha PDO driver. Very buggy, only works with odbc. </p>
|
||
|
||
<p>Tested mysqli. Set poorAffectedRows = true. Cleaned up movenext() and
|
||
_fetch(). </p>
|
||
|
||
<p>PageExecute does not work properly with php5 (return val not a variable).
|
||
Reported Dmytro Sychevsky sych#php.com.ua. Fixed. </p>
|
||
|
||
<p>MetaTables() for mysql, $showschema parameter was not backward compatible
|
||
with older versions of adodb. Fixed. </p>
|
||
|
||
<p>Changed mysql GetOne() to work with mysql 3.23 when using with non-select
|
||
stmts (e.g. SHOW TABLES). </p>
|
||
|
||
<p>Changed TRIG_ prefix to a variable in datadict-oci8.inc.php. Thx to
|
||
Luca.Gioppo#csi.it. </p>
|
||
|
||
<p>New to adodb-time code. We allow you to define your own daylights savings
|
||
function, adodb_daylight_sv for pre-1970 dates. If the function is defined
|
||
(somewhere in an include), then you can correct for daylights savings. See
|
||
http://phplens.com/phpeverywhere/node/view/16#daylightsavings for more info. </p>
|
||
|
||
<p>New sqlitepo driver. This is because assoc mode does not work like other
|
||
drivers in sqlite. Namely, when selecting (joining) multiple tables, in assoc
|
||
mode the table names are included in the assoc keys in the "sqlite"
|
||
driver. In "sqlitepo" driver, the table names are stripped from the
|
||
returned column names. When this results in a conflict, the first field get
|
||
preference. Contributed by Herman Kuiper herman#ozuzo.net </p>
|
||
|
||
<p>Added $forcenull parameter to GetInsertSQL/GetUpdateSQL. Idea by Marco
|
||
Aurelio Silva. </p>
|
||
|
||
<p>More XHTML changes for GetMenu. By Jeremy Evans. </p>
|
||
|
||
<p>Fixes some ibase date issues. Thx to stefan bogdan. </p>
|
||
|
||
<p>Improvements to mysqli driver to support $ADODB_COUNTRECS. </p>
|
||
|
||
<p>Fixed adodb-csvlib.inc.php problem when reading stream from socket. We need
|
||
to poll stream continiously. </p>
|
||
|
||
<p><a name=4.23></a><b>4.23 16 June 2004</b> </p>
|
||
|
||
<p>New interbase/firebird fixes thx to Lester Caine. Driver fixes a problem
|
||
with getting field names in the result array, and corrects a couple of data
|
||
conversions. Also we default to dialect3 for firebird. Also ibase sysDate
|
||
property was wrong. Changed to cast as timestamp. </p>
|
||
|
||
<p>The datadict driver is set up to give quoted tables and fields as this was
|
||
the only way round reserved words being used as field names in TikiWiki.
|
||
TikiPro is tidying that up, and I hope to be able to produce a build of THAT
|
||
which uses what I consider proper UPPERCASE field and table names. The
|
||
conversion of TikiWiki to ADOdb helped in that, but until the database is
|
||
completely tidied up in TikiPro ... </p>
|
||
|
||
<p>Modified _gencachename() to include fetchmode in name hash. This means you
|
||
should clear your cache directory after installing this release as the cache
|
||
name algorithm has changed. </p>
|
||
|
||
<p>Now Cache* functions work in safe mode, because we do not create
|
||
sub-directories in the $ADODB_CACHE_DIR in safe mode. In non-safe mode we still
|
||
create sub-directories. Done by modifying _gencachename(). </p>
|
||
|
||
<p>Added $gmt parameter (true/false) to UserDate and UserTimeStamp in
|
||
connection class, to force conversion of input (in local time) to be converted
|
||
to UTC/GMT. </p>
|
||
|
||
<p>Mssql datadict did not support INT types properly (no size param allowed).
|
||
Added _GetSize() to datadict-mssql.inc.php. </p>
|
||
|
||
<p>For borland_ibase, BeginTrans(), changed:</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$this->_transactionID = $this->_connectionID;</pre></div>
|
||
|
||
<p class=MsoNormal>to</p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);</pre></div>
|
||
|
||
<p>Fixed typo in mysqi_field_seek(). Thx to Sh4dow (sh4dow#php.pl). </p>
|
||
|
||
<p>LogSQL did not work with Firebird/Interbase. Fixed. </p>
|
||
|
||
<p>Postgres: made errorno() handling more consistent. Thx to Michael Jahn,
|
||
Michael.Jahn#mailbox.tu-dresden.de. </p>
|
||
|
||
<p>Added informix patch to better support metatables, metacolumns by
|
||
"Cecilio Albero" c-albero#eos-i.com </p>
|
||
|
||
<p>Cyril Malevanov contributed patch to oci8 to support passing of LOB
|
||
parameters: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$text = 'test test test';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$sql = "declare rs clob; begin :rs := lobinout(:sa0); end;";<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$stmt = $conn -> PrepareSP($sql);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn -> InParameter($stmt,$text,'sa0', -1, OCI_B_CLOB);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$rs = '';<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn -> OutParameter($stmt,$rs,'rs', -1, OCI_B_CLOB);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>$conn -> Execute($stmt);<br>
|
||
<span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>echo "return = ".$rs."<br>";</pre></div>
|
||
|
||
<p class=MsoNormal>As he says, the LOBs limitations are: </p>
|
||
|
||
<div style='mso-element:para-border-div;border:solid #DDDDDD 1.0pt;mso-border-alt:
|
||
solid #DDDDDD .75pt;padding:9.0pt 18.0pt 9.0pt 18.0pt;background:#EEEEEE'><pre
|
||
style='background:#EEEEEE'><span style='mso-spacerun:yes'><EFBFBD></span>- use OCINewDescriptor before binding<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>- if Param is IN, uses save() before each execute. This is done automatically for you.<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>- if Param is OUT, uses load() after each execute. This is done automatically for you.<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>- when we bind $var as LOB, we create new descriptor and return it as a<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD> </span><span style='mso-spacerun:yes'><EFBFBD></span>Bind Result, so if we want to use OUT parameters, we have to store<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD><EFBFBD> </span>somewhere &$var to load() data from LOB to it.<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>- IN OUT params are not working now (should not be a big problem to fix it)<br>
|
||
<span style='mso-spacerun:yes'><EFBFBD></span>- now mass binding not working too (I've wrote about it before)</pre></div>
|
||
|
||
<p>Simplified Connect() and PConnect() error handling. </p>
|
||
|
||
<p>When extension not loaded, Connect() and PConnect() will return null. On
|
||
connect error, the fns will return false. </p>
|
||
|
||
<p>CacheGetArray() added to code. </p>
|
||
|
||
<p>Added Init() to adorecordset_empty(). </p>
|
||
|
||
<p>Changed postgres64 driver, MetaColumns() to not strip off quotes in default
|
||
value if :: detected (type-casting of default). </p>
|
||
|
||
<p>Added test: if (!defined('ADODB_DIR')) die(). Useful to prevent hackers from
|
||
detecting file paths. </p>
|
||
|
||
<p>Changed metaTablesSQL to ignore Postgres 7.4 information schemas (sql_*). </p>
|
||
|
||
<p>New polish language file by Grzegorz Pacan </p>
|
||
|
||
<p>Added support for <st1:place w:st="on">UNION</st1:place> in
|
||
_adodb_getcount(). </p>
|
||
|
||
<p>Added security check for ADODB_DIR to limit path disclosure issues.
|
||
Requested by postnuke team. </p>
|
||
|
||
<p>Added better error message support to oracle driver. Thx to Gaetano Giunta. </p>
|
||
|
||
<p>Added showSchema support to mysql. </p>
|
||
|
||
<p>Bind in oci8 did not handle $name=false properly. Fixed. </p>
|
||
|
||
<p>If extension not loaded, Connect(), PConnect(), NConnect() will return null.
|
||
</p>
|
||
|
||
<p><b>4.22 15 Apr 2004</b> </p>
|
||
|
||
<p>Moved docs to own adodb/docs folder. </p>
|
||
|
||
<p>Fixed session bug when quoting compressed/encrypted data in Replace(). </p>
|
||
|
||
<p>Netezza Driver and LDAP drivers contributed by Josh Eldridge. </p>
|
||
|
||
<p>GetMenu now uses rtrim() on values instead of trim(). </p>
|
||
|
||
<p>Changed MetaColumnNames to return an associative array, keys being the field
|
||
names in uppercase. </p>
|
||
|
||
<p>Suggested fix to adodb-ado.inc.php affected_rows to support PHP5 variants.
|
||
Thx to Alexios Fakos. </p>
|
||
|
||
<p>Contributed bulgarian language file by Valentin Sheiretsky
|
||
valio#valio.eu.org. </p>
|
||
|
||
<p>Contributed romanian language file by stefan bogdan. </p>
|
||
|
||
<p>GetInsertSQL now checks for table name (string) in $rs, and will create a
|
||
recordset for that table automatically. Contributed by Walt Boring. Also added
|
||
OCI_B_BLOB in bind on Walt's request - hope it doesn't break anything :-) </p>
|
||
|
||
<p>Some minor postgres speedups in _initrs(). </p>
|
||
|
||
<p>ChangeTableSQL checks now if MetaColumns returns empty. Thx Jason Judge. </p>
|
||
|
||
<p>Added ADOConnection::Time(), returns current database time in unix timestamp
|
||
format, or false. </p>
|
||
|
||
<p><b>4.21 20 Mar 2004</b> </p>
|
||
|
||
<p>We no longer in SelectLimit for VFP driver add SELECT TOP X unless an ORDER
|
||
BY exists. </p>
|
||
|
||
<p>Pim Koeman contributed dutch language file adodb-nl.inc.php. </p>
|
||
|
||
<p>Rick Hickerson added CLOB support to db2 datadict. </p>
|
||
|
||
<p>Added odbtp driver. Thx to "stefan bogdan" sbogdan#rsb.ro. </p>
|
||
|
||
<p>Changed PrepareSP() 2nd parameter, $cursor, to default to true (formerly
|
||
false). Fixes oci8 backward compat problems with OUT params. </p>
|
||
|
||
<p>Fixed month calculation error in adodb-time.inc.php. 2102-June-01 appeared
|
||
as 2102-May-32. </p>
|
||
|
||
<p>Updated PHP5 RC1 iterator support. API changed, hasMore() renamed to
|
||
valid(). </p>
|
||
|
||
<p>Changed internal format of serialized cache recordsets. As we store a
|
||
version number, this should be backward compatible. </p>
|
||
|
||
<p>Error handling when driver file not found was flawed in ADOLoadCode().
|
||
Fixed. </p>
|
||
|
||
<p><b>4.20 27 Feb 2004</b> </p>
|
||
|
||
<p>Updated to AXMLS 1.01. </p>
|
||
|
||
<p>MetaForeignKeys for postgres7 modified by Edward Jaramilla, works on pg 7.4.
|
||
</p>
|
||
|
||
<p>Now numbers accepts function calls or sequences for
|
||
GetInsertSQL/GetUpdateSQL numeric fields. </p>
|
||
|
||
<p>Changed quotes of 'delete from $perf_table' to "". Thx Kehui
|
||
(webmaster#kehui.net) </p>
|
||
|
||
<p>Added ServerInfo() for ifx, and putenv trim fix. Thx Fernando Ortiz. </p>
|
||
|
||
<p>Added addq(), which is analogous to addslashes(). </p>
|
||
|
||
<p>Tested with php5b4. Fix some php5 compat problems with exceptions and
|
||
sybase. </p>
|
||
|
||
<p>Carl-Christian Salvesen added patch to mssql _query to support binds greater
|
||
than 4000 chars. </p>
|
||
|
||
<p>Mike suggested patch to PHP5 exception handler. $errno must be numeric. </p>
|
||
|
||
<p>Added double quotes (") to ADODB_TABLE_REGEX. </p>
|
||
|
||
<p>For oci8, Prepare(...,$cursor), $cursor's meaning was accidentally inverted
|
||
in 4.11. This causes problems with ExecuteCursor() too, which calls Prepare()
|
||
internally. Thx to William Lovaton. </p>
|
||
|
||
<p>Now dateHasTime property in connection object renamed to datetime for
|
||
consistency. This could break bc. </p>
|
||
|
||
<p>Csongor Halmai reports that db2 SelectLimit with input array is not working.
|
||
Fixed.. </p>
|
||
|
||
<p><b>4.11 27 Jan 2004</b> </p>
|
||
|
||
<p>Csongor Halmai reports db2 binding not working. Reverted back to emulated
|
||
binding. </p>
|
||
|
||
<p>Dan Cech modifies datadict code. Adds support for DropIndex. Minor cleanups.
|
||
</p>
|
||
|
||
<p>Table misspelt in perf-oci8.inc.php. Changed v$conn_cache_advice to
|
||
v$db_cache_advice. Reported by Steve W. </p>
|
||
|
||
<p>UserTimeStamp and DBTimeStamp did not handle YYYYMMDDHHMMSS format properly.
|
||
Reported by Mike Muir. Fixed. </p>
|
||
|
||
<p>Changed oci8 Prepare(). Does not auto-allocate OCINewCursor automatically,
|
||
unless 2nd param is set to true. This will break backward compat, if
|
||
Prepare/Execute is used instead of ExecuteCursor. Reported by Chris Jones. </p>
|
||
|
||
<p>Added InParameter() and OutParameter(). Wrapper functions to Parameter(),
|
||
but nicer because they are self-documenting. </p>
|
||
|
||
<p>Added 'R' handling in ActualType() to datadict-mysql.inc.php </p>
|
||
|
||
<p>Added ADOConnection::SerializableRS($rs). Returns a recordset that can be
|
||
serialized in a session. </p>
|
||
|
||
<p>Added "Run SQL" to performance UI(). </p>
|
||
|
||
<p>Misc spelling corrections in adodb-mysqli.inc.php, adodb-oci8.inc.php and
|
||
datadict-oci8.inc.php, from Heinz Hombergs. </p>
|
||
|
||
<p>MetaIndexes() for ibase contributed by Heinz Hombergs. </p>
|
||
|
||
<p><b>4.10 12 Jan 2004</b> </p>
|
||
|
||
<p>Dan Cech contributed extensive changes to data dictionary to support name
|
||
quoting (with `), and drop table/index. </p>
|
||
|
||
<p>Informix added cursorType property. Default remains IFX_SCROLL, but you can
|
||
change to 0 (non-scrollable cursor) for performance. </p>
|
||
|
||
<p>Added ADODB_View_PrimaryKeys() for returning view primary keys to
|
||
MetaPrimaryKeys(). </p>
|
||
|
||
<p>Simplified chinese file, adodb-cn.inc.php from cysoft. </p>
|
||
|
||
<p>Added check for ctype_alnum in adodb-datadict.inc.php. Thx to Jason Judge. </p>
|
||
|
||
<p>Added connection parameter to ibase Prepare(). Fix by Daniel Hassan. </p>
|
||
|
||
<p>Added nameQuote for quoting identifiers and names to connection obj.
|
||
Requested by Jason Judge. Also the data dictionary parser now detects `field
|
||
name` and generates column names with spaces correctly. </p>
|
||
|
||
<p>BOOL type not recognised correctly as L. Fixed. </p>
|
||
|
||
<p>Fixed paths in ADODB_DIR for session files, and back-ported it to 4.05 (15
|
||
Dec 2003) </p>
|
||
|
||
<p>Added Schema to postgresql MetaTables. Thx to col#gear.hu </p>
|
||
|
||
<p>Empty postgresql recordsets that had blob fields did not set EOF properly.
|
||
Fixed. </p>
|
||
|
||
<p>CacheSelectLimit internal parameters to SelectLimit were wrong. Thx to Nio. </p>
|
||
|
||
<p>Modified adodb_pr() and adodb_backtrace() to support command-line usage (eg.
|
||
no html). </p>
|
||
|
||
<p>Fixed some fr and it lang errors. Thx to Gaetano G. </p>
|
||
|
||
<p>Added contrib directory, with adodb rs to xmlrpc convertor by Gaetano G. </p>
|
||
|
||
<p>Fixed array recordset bugs when _skiprow1 is true. Thx to Gaetano G. </p>
|
||
|
||
<p>Fixed pivot table code when count is false. </p>
|
||
|
||
<p><b>4.05 13 Dec 2003 </b></p>
|
||
|
||
<p>Added MetaIndexes to data-dict code - thx to Dan Cech. </p>
|
||
|
||
<p>Rewritten session code by Ross Smith. Moved code to adodb/session directory.
|
||
</p>
|
||
|
||
<p>Added function exists check on connecting to most drivers, so we don't crash
|
||
with the unknown function error. </p>
|
||
|
||
<p>Smart Transactions failed with GenID() when it no seq table has been created
|
||
because the sql statement fails. Fix by Mark Newnham. </p>
|
||
|
||
<p>Added $db->length, which holds name of function that returns strlen. </p>
|
||
|
||
<p>Fixed error handling for bad driver in ADONewConnection - passed too few
|
||
params to error-handler. </p>
|
||
|
||
<p>Datadict did not handle types like 16.0 properly in _GetSize. Fixed. </p>
|
||
|
||
<p>Oci8 driver SelectLimit() bug &= instead of =& used. Thx to Swen
|
||
Th<EFBFBD>mmler. </p>
|
||
|
||
<p>Jesse Mullan suggested not flushing outp when output buffering enabled. Due
|
||
to Apache 2.0 bug. Added. </p>
|
||
|
||
<p>MetaTables/MetaColumns return ref bug with PHP5 fixed in
|
||
adodb-datadict.inc.php. </p>
|
||
|
||
<p>New mysqli driver contributed by Arjen de Rijke. Based on adodb 3.40 driver.
|
||
Then jlim added BeginTrans, CommitTrans, RollbackTrans, IfNull, SQLDate. Also
|
||
fixed return ref bug. </p>
|
||
|
||
<p>$ADODB_FLUSH added, if true then force flush in debugging outp. Default is
|
||
false. In earlier versions, outp defaulted to flush, which is not compat with
|
||
apache 2.0. </p>
|
||
|
||
<p>Mysql driver's GenID() function did not work when when sql logging is on.
|
||
Fixed. </p>
|
||
|
||
<p>$ADODB_SESSION_TBL not declared as global var. Not available if
|
||
adodb-session.inc.php included in function. Fixed. </p>
|
||
|
||
<p>The input array not passed to Execute() in _adodb_getcount(). Fixed. </p>
|
||
|
||
<p><b>4.04 13 Nov 2003 </b></p>
|
||
|
||
<p>Switched back to foreach - faster than list-each. </p>
|
||
|
||
<p>Fixed bug in ado driver - wiping out $this->fields with date fields. </p>
|
||
|
||
<p>Performance Monitor, View SQL, Explain Plan did not work if
|
||
strlen($SQL)>max($_GET length). Fixed. </p>
|
||
|
||
<p>Performance monitor, oci8 driver added memory sort ratio. </p>
|
||
|
||
<p>Added random property, returns SQL to generate a floating point number
|
||
between 0 and 1; </p>
|
||
|
||
<p><b>4.03 6 Nov 2003 </b></p>
|
||
|
||
<p>The path to adodb-php4.inc.php and adodb-iterators.inc.php was not setup
|
||
properly. </p>
|
||
|
||
<p>Patched SQLDate in interbase to support hours/mins/secs. Thx to ari
|
||
kuorikoski. </p>
|
||
|
||
<p>Force autorollback for pgsql persistent connections - apparently pgsql did
|
||
not autorollback properly before 4.3.4. See http://bugs.php.net/bug.php?id=25404
|
||
</p>
|
||
|
||
<p><b>4.02 5 Nov 2003 </b></p>
|
||
|
||
<p>Some errors in adodb_error_pg() fixed. Thx to Styve. </p>
|
||
|
||
<p>Spurious Insert_ID() error was generated by LogSQL(). Fixed. </p>
|
||
|
||
<p>Insert_ID was interfering with Affected_Rows() and Replace() when LogSQL()
|
||
enabled. Fixed. </p>
|
||
|
||
<p>More foreach loops optimized with list/each. </p>
|
||
|
||
<p>Null dates not handled properly in <st1:City w:st="on"><st1:place w:st="on">ADO</st1:place></st1:City>
|
||
driver (it becomes 31 Dec 1969!). </p>
|
||
|
||
<p>Heinz Hombergs contributed patches for mysql MetaColumns - adding scale,
|
||
made interbase MetaColumns work with firebird/interbase, and added
|
||
lang/adodb-de.inc.php. </p>
|
||
|
||
<p>Added INFORMIXSERVER environment variable. </p>
|
||
|
||
<p>Added $ADODB_ANSI_PADDING_OFF for interbase/firebird. </p>
|
||
|
||
<p>PHP 5 beta 2 compat check. Foreach (Iterator) support. Exceptions support. </p>
|
||
|
||
<p><b>4.01 23 Oct 2003 </b></p>
|
||
|
||
<p>Fixed bug in rs2html(), tohtml.inc.php, that generated blank table cells. </p>
|
||
|
||
<p>Fixed insert_id() incorrectly generated when logsql() enabled. </p>
|
||
|
||
<p>Modified PostgreSQL _fixblobs to use list/each instead of foreach. </p>
|
||
|
||
<p>Informix ErrorNo() implemented correctly. </p>
|
||
|
||
<p>Modified several places to use list/each, including GetRowAssoc(). </p>
|
||
|
||
<p>Added UserTimeStamp() to connection class. </p>
|
||
|
||
<p>Added $ADODB_ANSI_PADDING_OFF for oci8po. </p>
|
||
|
||
<p><b>4.00 20 Oct 2003 </b></p>
|
||
|
||
<p>Upgraded adodb-xmlschema to 1 Oct 2003 snapshot. </p>
|
||
|
||
<p>Fix to rs2html warning message. Thx to Filo. </p>
|
||
|
||
<p>Fix for odbc_mssql/mssql SQLDate(), hours was wrong. </p>
|
||
|
||
<p>Added MetaColumns and MetaPrimaryKeys for sybase. Thx to Chris Phillipson. </p>
|
||
|
||
<p>Added autoquoting to datadict for MySQL and PostgreSQL. Suggestion by
|
||
Karsten Dambekalns </p>
|
||
|
||
<p><b>3.94 11 Oct 2003 </b></p>
|
||
|
||
<p>Create trigger in datadict-oci8.inc.php did not work, because all cr/lf's
|
||
must be removed. </p>
|
||
|
||
<p>ErrorMsg()/ErrorNo() did not work for many databases when logging enabled.
|
||
Fixed. </p>
|
||
|
||
<p>Removed global variable $ADODB_LOGSQL as it does not work properly with
|
||
multiple connections. </p>
|
||
|
||
<p>Added SQLDate support for sybase. Thx to Chris Phillipson </p>
|
||
|
||
<p>Postgresql checking of pgsql resultset resource was incorrect. Fix by Bharat
|
||
Mediratta bharat#menalto.com. Same patch applied to _insertid and _affectedrows
|
||
for adodb-postgres64.inc.php. </p>
|
||
|
||
<p>Added support for NConnect for postgresql. </p>
|
||
|
||
<p>Added Sybase data dict support. Thx to Chris Phillipson </p>
|
||
|
||
<p>Extensive improvements in $perf->UI(), eg. Explain now opens in new
|
||
window, we show scripts which call sql, etc. </p>
|
||
|
||
<p>Perf Monitor UI works with magic quotes enabled. </p>
|
||
|
||
<p>rsPrefix was declared twice. Removed. </p>
|
||
|
||
<p>Oci8 stored procedure support, eg. "begin func(); end;" was
|
||
incorrect in _query. Fixed. </p>
|
||
|
||
<p>Tiraboschi Massimiliano contributed italian language file. </p>
|
||
|
||
<p>Fernando Ortiz, fortiz#lacorona.com.mx, contributed informix performance
|
||
monitor. </p>
|
||
|
||
<p>Added _varchar (varchar arrays) support for postgresql. Reported by PREVOT
|
||
St<EFBFBD>phane.</p>
|
||
|
||
<div class=MsoNormal align=center style='text-align:center'>
|
||
|
||
<hr size=2 width="100%" align=center>
|
||
|
||
</div>
|
||
|
||
<p><strong>0.10 Sept 9 2000</strong> First release </p>
|
||
|
||
<h3><strong>Old change log history moved to <a href="old-changelog.htm">old-changelog.htm</a>.
|
||
</strong></h3>
|
||
|
||
<p> </p>
|
||
|
||
</div>
|
||
|
||
</body>
|
||
|
||
</html>
|