| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178 |
- <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.20.3 01-Jan-2016<br>
- © 2000-2013 John Lim (jlim#natsoft.com)<br>
- © 2014 Damien Regad, Mark Newnham and the ADOdb community</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> <a href="#setcharset">SetCharSet</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://adodb.sourceforge.net/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</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.interaktonline.com/Products/Free-Products/PHAkt/EOL/">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/user/rdanyliw/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.escio.no/index.php?page_id=3&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://www.nolapro.com/nolapro.html">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 should be submitted on
- <a href="https://github.com/ADOdb/ADOdb/issues">Github</a>.
- </p>
- <p>Bug fixes and enhancements can be submitted as
- <a href="https://github.com/ADOdb/ADOdb/pulls">Pull Requests</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'> </span>include('adodb/adodb.inc.php');<br>
- <span style='mso-tab-count:1'> </span>$db = <a href="#adonewconnection">ADONewConnection</a>($dbdriver); # eg 'mysql' or 'postgres'<br>
- <span style='mso-tab-count:1'> </span>$db->debug = true;<br>
- <span style='mso-tab-count:1'> </span>$db-><a href="#connect">Connect</a>($server, $user, $password, $database);<br>
- <span style='mso-tab-count:1'> </span>$rs = $db-><a href="#execute">Execute</a>('select * from some_small_table');<br>
- <span style='mso-tab-count:1'> </span>print "<pre>";<br>
- <span style='mso-tab-count:1'> </span>print_r($rs-><a href="#getrows">GetRows</a>());<br>
- <span style='mso-tab-count:1'> </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'> </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'> </span><span style='color:green'># non-persistent connection</span></pre><pre><span
- style='mso-tab-count:1'> </span>$dsn = 'mysql://root:pwd@localhost/mydb'; </pre><pre><span
- style='mso-tab-count:1'> </span>$db = NewADOConnection($dsn);</pre><pre><span
- style='mso-tab-count:1'> </span>if (!$db) die("Connection failed");<span style='mso-spacerun:yes'> </span></pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </span><span style='color:green'># no need to call connect/pconnect!</span></pre><pre><span
- style='mso-tab-count:1'> </span>$arr = $db->GetArray("select * from table");</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </span><span style='color:green'># persistent connection</span></pre>
- <pre><span
- style='mso-tab-count:1'> </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'> </span>$pwd = rawurlencode($pwd);<br>
- <span style='mso-tab-count:1'> </span>$dsn = "mysql://root:$pwd@localhost/mydb";</pre><pre
- style='background:#EEEEEE'><span style='mso-tab-count:1'> </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' , 'cachesecs', 'memcache'</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>Since ADOdb 5.09, we added 2 new parameters:</p>
- <ul>
- <li class=MsoNormal><i>cachesecs</i> which globally determines how many seconds to cache recordsets (default is 3600 secs if not defined) when
- CacheExecute() and CacheSelectLimit() are called and no cache-time parameter is passed into these functions.
- <li class=MsoNormal><i>memcache</i> which defines the memcache host, port and whether to use compression. For example:
- <pre>
- # we have a memcache server at 10.1.1.22 using default port 11211, no compression
- $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22';
- # we have a memcache server 10.1.1.22 port 8888, compression=on
- $dsn = 'mysql://user:pwd@localhost/mydb?memcache=10.1.1.22:8888:1';
- # we have a memcache servers mem1,mem2 on port 8888, compression=off
- $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0';
- # we have a memcache servers mem1,mem2 on port 8888, compression=off and cachesecs=120
- $dsn = 'mysql://user:pwd@localhost/mydb?memcache=mem1,mem2:8888:0&cachesecs=120';
- </pre>
- </ul>
- <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'> </span>$conn = &ADONewConnection('mysql'); <br>
- <span style='mso-tab-count:1'> </span>$conn->PConnect('localhost','userid','password','database');<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </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'> </span>$dsn = 'mysql://user:pwd@localhost/mydb'; </span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </span># no need for Connect()</span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </span></span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </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'> </span>$dsn = 'mysql://user:pwd@localhost/mydb?persist'; </span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </span># no need for PConnect()</span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </span></span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </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'> </span>$pwd = urlencode($pwd);</span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </span>$flags =<span style='mso-spacerun:yes'> </span>MYSQL_CLIENT_COMPRESS;</span></pre><pre><span
- style='mso-bookmark:connect_ex'><span style='mso-tab-count:1'> </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'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </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'> </span>$conn =& NewADConnection('pdo');</span></pre><pre><span
- style='mso-bookmark:pdo'><span style='mso-tab-count:1'> </span>$conn->Connect('mysql:host=localhost',$user,$pwd,$mydb);</span></pre><pre><span
- style='mso-bookmark:pdo'><span style='mso-tab-count:1'> </span>$conn->Connect('mysql:host=localhost;dbname=mydb',$user,$pwd);</span></pre><pre><span
- style='mso-bookmark:pdo'><span style='mso-tab-count:1'> </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'> </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'> </span>$conn = &ADONewConnection('postgres');<span style='mso-spacerun:yes'> </span><br>
- <span style='mso-tab-count:1'> </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'> </span>$conn->PConnect('localhost','userid','password','database');<br>
- <span style='mso-spacerun:yes'> </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'> </span>$dsn = 'postgres://user:pwd@localhost/mydb?persist';<span style='mso-spacerun:yes'> </span># persist is optional</span></pre><pre
- style='background:#EEEEEE'><span style='mso-bookmark:pdo'><span
- style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </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'> </span>Array ("OPTION_NAME"=>LDAP_OPT_DEREF, "OPTION_VALUE"=>2),</pre><pre><span
- style='mso-tab-count:1'> </span>Array ("OPTION_NAME"=>LDAP_OPT_SIZELIMIT,"OPTION_VALUE"=>100),</pre><pre><span
- style='mso-tab-count:1'> </span>Array ("OPTION_NAME"=>LDAP_OPT_TIMELIMIT,"OPTION_VALUE"=>30),</pre><pre><span
- style='mso-tab-count:1'> </span>Array ("OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,"OPTION_VALUE"=>3),</pre><pre><span
- style='mso-tab-count:1'> </span>Array ("OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,"OPTION_VALUE"=>13),</pre><pre><span
- style='mso-tab-count:1'> </span>Array ("OPTION_NAME"=>LDAP_OPT_REFERRALS,"OPTION_VALUE"=>FALSE),</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>while ($arr = $rs->FetchRow()) {</pre><pre><span
- style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'> </span>print_r($arr);<span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </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'> </span>while (!$rs->EOF) {</pre><pre> <span
- style='mso-tab-count:2'> </span>print_r($rs->fields);<span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:2'> </span>$rs->MoveNext();</pre><pre><span
- style='mso-tab-count:1'> </span>} </pre><pre><span style='mso-tab-count:
- 1'> </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'> </span>$conn = &ADONewConnection('ibase'); <br>
- <span style='mso-tab-count:1'> </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'> </span>$dsn = 'firebird://user:pwd@localhost/mydb?persist&dialect=3';<span style='mso-spacerun:yes'> </span># persist is optional<br>
- <span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </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'> </span>$conn = &ADONewConnection('sqlite');</pre><pre
- style='background:#EEEEEE'><span style='mso-tab-count:1'> </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'> </span>$path = urlencode('c:\path\to\sqlite.db');</pre><pre><span
- style='mso-tab-count:1'> </span>$dsn = "sqlite://$path/?persist";<span style='mso-spacerun:yes'> </span># persist is optional</pre><pre
- style='background:#EEEEEE'><span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </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'> </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'> </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'> </span><span
- style='mso-tab-count:1'> </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'> </span># with adodb 5.06 or 4.991 and later</pre><pre><span
- style='mso-tab-count:1'> </span>$conn->Connect('192.168.0.1', 'scott', 'tiger', "SID=$SID");</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </span># OR with all versions of ADOdb</pre><pre><span
- style='mso-tab-count:1'> </span>$conn->connectSID = true;</pre><pre><span
- style='mso-tab-count:1'> </span>$conn->Connect('192.168.0.1', 'scott', 'tiger', $SID);</pre><pre
- style='background:#EEEEEE'><span style='mso-tab-count:1'> </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'> </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'> </span>$cstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$host)(PORT=$port))<br>
- <span style='mso-tab-count:3'> </span>(CONNECT_DATA=(SID=$sid)))";<br>
- <span style='mso-tab-count:1'> </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'> </span>$dsn = 'oci8://user:pwd@tnsname/?persist';<span style='mso-spacerun:yes'> </span># persist is optional<br>
- <span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<span style='mso-spacerun:yes'> </span># no need for Connect/PConnect<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span>$dsn = 'oci8://user:pwd@host/sid';<br>
- <span style='mso-tab-count:1'> </span>$conn = ADONewConnection($dsn);<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span>$dsn = 'oci8://user:pwd@/';<span style='mso-spacerun:yes'> </span># oracle on local machine<br>
- <span style='mso-tab-count:1'> </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'> </span>$conn->charSet = 'we8iso8859p1';<br>
- <span style='mso-tab-count:1'> </span>$conn->Connect(...);<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span># or<br>
- <span style='mso-tab-count:1'> </span>$dsn = 'oci8://user:pwd@tnsname/?charset=WE8MSWIN1252';<br>
- <span style='mso-tab-count:1'> </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'> </span>$db =& ADONewConnection('access');<br>
- <span style='mso-tab-count:1'> </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'> </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'> </span>$db =& ADONewConnection('odbc_mssql');<br>
- <span style='mso-tab-count:1'> </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'> </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'> </span>$db =& ADONewConnection('mssql');<br>
- <span style='mso-tab-count:1'> </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'> </span>$dbms = 'db2'; # or 'odbc_db2' if db2 extension not available</pre><pre><span
- style='mso-tab-count:1'> </span>$db =& ADONewConnection($dbms);</pre><pre><span
- style='mso-tab-count:1'> </span>$dsn = "driver={IBM db2 odbc DRIVER};Database=sample;hostname=localhost;port=50000;protocol=TCPIP;".</pre><pre><span
- style='mso-tab-count:4'> </span>"uid=root; pwd=secret";<br>
- <span style='mso-tab-count:1'> </span>$db->Connect($dsn);<br>
- # or connect and set schema
- $db->Connect($dsn,null,null,$schema);</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'> </span>include('adodb.inc.php'); <br>
- <span style='mso-tab-count:1'> </span>$db = &ADONewConnection("ado_mssql");<br>
- <span style='mso-tab-count:1'> </span>print "<h1>Connecting DSN-less $db->databaseType...</h1>";<br>
- <span style='mso-tab-count:2'> </span><br>
- <span style='mso-tab-count:1'> </span><b>$myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};"<br>
- <span style='mso-tab-count:2'> </span>. "SERVER=flipper;DATABASE=ai;UID=sa;PWD=;"<span style='mso-spacerun:yes'> </span>;</b></pre><pre><span
- style='mso-tab-count:1'> </span>$db->Connect($myDSN);</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </span>$rs = $db->Execute("select * from table");</pre><pre><span
- style='mso-tab-count:1'> </span>$arr = $rs->GetArray();</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>var_dump($rs->fields);<br>
- <span style='mso-tab-count:1'> </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'> </span>/* Your mods here */<br>
- }<br>
- <br>
- class hack_rs_mysql extends ADORecordSet_mysql {<br>
- <span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'> </span>/* Your mods here */<br>
- }<br>
- <br>
- class hack_postgres7 extends adodb_postgres7 {<br>
- var $rsPrefix = 'hack_rs_';<br>
- <span style='mso-spacerun:yes'> </span>/* Your mods here */<br>
- }<br>
- <br>
- class hack_rs_postgres7 extends ADORecordSet_postgres7 {<br>
- <span style='mso-spacerun:yes'> </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'> </span>if ($driver !== 'mysql' && $driver !== 'postgres7') return false;<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span>$driver = 'hack_'.$driver;<br>
- <span style='mso-tab-count:1'> </span>$obj = new $driver();<br>
- <span style='mso-tab-count:1'> </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'> </span>$ADODB_FETCH_MODE = ADODB_FETCH_NUM;<br>
- <span style='mso-tab-count:1'> </span>$rs = $db->Execute($sql);<br>
- <span style='mso-tab-count:1'> </span>foreach($rs as $k => $row) {<br>
- <span style='mso-tab-count:2'> </span>echo "r1=".$row[0]." r2=".$row[1]."<br>";<br>
- <span style='mso-tab-count:1'> </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'> </span><b>include("../adodb-exceptions.inc.php");</b> <br>
- <span style='mso-tab-count:1'> </span>include("../adodb.inc.php");<span
- style='mso-tab-count:1'> </span> <br>
- <span style='mso-tab-count:1'> </span>try { <br>
- <span style='mso-tab-count:2'> </span>$db = NewADOConnection("oci8"); <br>
- <span style='mso-tab-count:2'> </span>$db->Connect('','scott','bad-password'); <br>
- <span style='mso-tab-count:1'> </span>} catch (exception $e) { <br>
- <span style='mso-tab-count:2'> </span>var_dump($e); <br>
- <span style='mso-tab-count:2'> </span>adodb_backtrace($e->gettrace());<br>
- <span style='mso-tab-count:1'> </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'>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'>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: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'>db2oci</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'>Based on db2 driver. Allows use of oracle style :0, :1, :2 bind variables. Used with DB2 9.7 or later with PL/SQL mode turned on.</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://www.linuxjournal.com/article/6636">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. Use with PHP 5.3 or later. </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:35'>
- <td valign=top style='padding:.75pt .75pt .75pt .75pt'>
- <p class=MsoNormal><b><span style='font-size:10.0pt'>postgres9</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 9 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'> </span># load code common to ADOdb<br>
- $<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
- style='mso-tab-count:1'> </span># create a connection<br>
- $<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'> </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'> </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'> </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'> </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'> </span>$db->SetFetchMode(ADODB_FETCH_NUM);<br>
- <span style='mso-tab-count:1'> </span>$rs1 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>$db->SetFetchMode(ADODB_FETCH_ASSOC);<br>
- <span style='mso-tab-count:1'> </span>$rs2 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre><span
- style='mso-tab-count:1'> </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'> </span># load code common to ADOdb<br>
- $<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
- style='mso-tab-count:1'> </span># create a connection<br>
- $<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'> </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'> </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'> </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'> </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'> </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'> </span><b>print</b> $<span
- style='color:#660000'>recordSet</span>->fields[0].' '.<br>
- <span style='mso-tab-count:3'> </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'> </span><b>else </b></pre><pre><span
- style='mso-tab-count:2'> </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'> </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'> </span># load code common to ADOdb<br>
- $<span style='color:#660000'>conn</span> = &ADONewConnection('access');<span
- style='mso-tab-count:1'> </span># create a connection<br>
- <br>
- $<span style='color:#660000'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'> </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'> </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'> </span># load code common to ADOdb<br>
- $<span style='color:#663300'>conn</span> = &ADONewConnection('access');<span
- style='mso-tab-count:1'> </span># create a connection<br>
- $<span style='color:#663300'>conn</span>->PConnect('northwind');<span style='mso-spacerun:yes'> </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'> </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'> </span># create a mysql connection<br>
- $<span style='color:#663300'>conn2</span> = &ADONewConnection('oracle');<span style='mso-spacerun:yes'> </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'> </span>$record["firstname"] = "Bob"; </pre><pre><span style='mso-spacerun:yes'> </span>$record["lastname"] = "Smith"; </pre><pre><span style='mso-spacerun:yes'> </span>$record["created"] = time(); </pre><pre><span style='mso-spacerun:yes'> </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'> </span>$record["firstname"] = "Caroline"; </pre><pre><span style='mso-spacerun:yes'> </span>$record["lastname"] = "Smith"; # Update Caroline's lastname from Miranda to Smith </pre><pre><span style='mso-spacerun:yes'> </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'> </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'> </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'> </span><span style='mso-spacerun:yes'> </span>lastname as "Last Name", created as "Date Created" <br>
- <span style='mso-tab-count:2'> </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á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'> </span><span
- style='mso-spacerun:yes'> </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'> </span><b>rs2csvfile</b>($rs, $fp); # write to file (there is also an rs2tabfile function)<br>
- <span style='mso-spacerun:yes'> </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'> </span>foreach($arr as $k => $v) {<br>
- <span style='mso-tab-count:2'> </span>$arr[$k] = ucwords($v);<br>
- <span style='mso-tab-count:1'> </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'> </span>$conn-><strong><span
- style='font-family:"Courier New"'>StartTrans</span></strong>();<span style='mso-spacerun:yes'> </span><span
- style='color:#006600'># ignored</span></pre><pre><span style='mso-spacerun:yes'> </span>if (!CheckRecords()) $conn->FailTrans();</pre><pre><span style='mso-spacerun:yes'> </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'> </span><b>include("../adodb-exceptions.inc.php");</b> <br>
- <span style='mso-tab-count:1'> </span>include("../adodb.inc.php");<span
- style='mso-tab-count:1'> </span> <br>
- <span style='mso-tab-count:1'> </span>try { <br>
- <span style='mso-tab-count:2'> </span>$db = NewADOConnection("oci8://scott:bad-password@mytns/"); <br>
- <span style='mso-tab-count:1'> </span>} catch (exception $e) { <br>
- <span style='mso-tab-count:2'> </span>var_dump($e); <br>
- <span style='mso-tab-count:2'> </span>adodb_backtrace($e->gettrace());<br>
- <span style='mso-tab-count:1'> </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'> </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'> </span><b>$e = ADODB_Pear_Error();<br>
- <span style='mso-tab-count:1'> </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'> </span>$username = 'root';<br>
- <span style='mso-spacerun:yes'> </span>$password = '';<br>
- <span style='mso-spacerun:yes'> </span>$hostname = 'localhost';<br>
- <span style='mso-spacerun:yes'> </span>$databasename = 'xphplens';<br>
- <span style='mso-spacerun:yes'> </span>$driver = 'mysql';<br>
- <span style='mso-spacerun:yes'> </span>$dsn = "$driver://$username:$password@$hostname/$databasename"<br>
- <span style='mso-spacerun:yes'> </span>$db = NewADOConnection(); <br>
- <span style='mso-spacerun:yes'> </span># DB::Connect($dsn) also works if you include 'adodb/adodb-pear.inc.php' at the top<br>
- <span style='mso-spacerun:yes'> </span>$rs = $db->query('select firstname,lastname from adoxyz');<br>
- <span style='mso-spacerun:yes'> </span>$cnt = 0;<br>
- <span style='mso-spacerun:yes'> </span>while ($arr = $rs->fetchRow()) {<br>
- <span style='mso-tab-count:2'> </span>print_r($arr); print "<br>";<br>
- <span style='mso-spacerun:yes'> </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'> </span>DB_Common</b></pre><pre> <span
- style='mso-tab-count:1'> </span>query - returns PEAR_Error on error</pre><pre><span
- style='mso-tab-count:1'> </span>limitQuery - return PEAR_Error on error</pre><pre><span
- style='mso-tab-count:1'> </span>prepare - does not return PEAR_Error on error</pre><pre><span
- style='mso-tab-count:1'> </span>execute - does not return PEAR_Error on error</pre><pre><span
- style='mso-tab-count:1'> </span>setFetchMode - supports ASSOC and ORDERED</pre><pre><span
- style='mso-tab-count:1'> </span>errorNative</pre><pre><span
- style='mso-tab-count:1'> </span>quote</pre><pre><span style='mso-tab-count:
- 1'> </span>nextID</pre><pre><span style='mso-tab-count:1'> </span>disconnect</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </span>getOne</pre><pre><span style='mso-tab-count:1'> </span>getAssoc</pre><pre><span
- style='mso-tab-count:1'> </span>getRow</pre><pre><span
- style='mso-tab-count:1'> </span>getCol</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><b> DB_Result</b></pre><pre> <span
- style='mso-tab-count:1'> </span>numRows - returns -1 if not supported</pre><pre><span
- style='mso-tab-count:1'> </span>numCols</pre><pre><span
- style='mso-tab-count:1'> </span>fetchInto - does not support passing of fetchmode</pre><pre><span
- style='mso-tab-count:1'> </span>fetchRows - does not support passing of fetchmode</pre><pre><span
- style='mso-tab-count:1'> </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'> </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'> </span># (1)</pre><pre><span style='mso-spacerun:yes'> </span>$rs = $db->SelectLimit(30, 'select * from table', 10);</pre><pre><span style='mso-spacerun:yes'> </span></pre><pre><span style='mso-spacerun:yes'> </span># (2)</pre><pre><span style='mso-spacerun:yes'> </span>$db->cacheSsecs = 30;</pre><pre><span style='mso-spacerun:yes'> </span>$rs = $db->SelectLimit('select * from table', 10);</pre><pre
- style='background:#EEEEEE'><span style='mso-spacerun:yes'> </span></pre><pre><span
- style='mso-tab-count:1'> </span>$conn->Connect(...);<br>
- <span style='mso-tab-count:1'> </span>$conn->cacheSecs = 3600*24; # cache 24 hours<br>
- <span style='mso-tab-count:1'> </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'> </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'> </span>function writecache($filename, $contents,$debug=false){...}</span></pre><pre><span
- style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'> </span>function &readcache($filename, &$err, $secs2cache, $rsClass){ ...}</span></pre><pre><span
- style='mso-bookmark:cacheapi'><span style='mso-tab-count:1'> </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'> </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/c/a/MySQL/MySQL-wizardry/1/">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'> </span>include "adodb/pivottable.inc.php";<br>
- <span style='mso-spacerun:yes'> </span>$sql = PivotTableSQL(<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'> </span>$gDB,<span style='mso-spacerun:yes'> </span># adodb connection<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'> </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'> </span># tables<br>
- <span style='mso-tab-count:1'> </span>'SupplierName',<span style='mso-spacerun:yes'> </span># rows (multiple fields allowed)<br>
- <span style='mso-tab-count:1'> </span>'CategoryName',<span style='mso-spacerun:yes'> </span># column to pivot on <br>
- <span style='mso-tab-count:1'> </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'> </span>$sql = PivotTableSQL(<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'> </span>$gDB,<span style='mso-spacerun:yes'> </span># adodb connection<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'> </span>'products p ,categories c ,suppliers s',<span style='mso-spacerun:yes'> </span># tables<br>
- <span style='mso-tab-count:1'> </span>'SupplierName',<span style='mso-spacerun:yes'> </span># rows (multiple fields allowed)</pre><pre><span style='mso-spacerun:yes'> </span>array(<span style='mso-spacerun:yes'> </span><span style='mso-spacerun:yes'> </span># column ranges</pre><pre><span
- style='mso-tab-count:1'> </span>' 0 '<span style='mso-spacerun:yes'> </span>=> 'UnitsInStock <= 0',</pre><pre><span
- style='mso-tab-count:1'> </span>"1 to 5"<span style='mso-spacerun:yes'> </span>=> '0 < UnitsInStock and UnitsInStock <= 5',</pre><pre><span
- style='mso-tab-count:1'> </span>"6 to 10"<span style='mso-spacerun:yes'> </span>=> '5 < UnitsInStock and UnitsInStock <= 10',</pre><pre><span
- style='mso-tab-count:1'> </span>"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',</pre><pre><span
- style='mso-tab-count:1'> </span>"16+"<span style='mso-spacerun:yes'> </span>=> '15 < UnitsInStock'</pre><pre><span
- style='mso-tab-count:1'> </span>),</pre><pre><span style='mso-tab-count:
- 1'> </span>' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where</pre><pre><span
- style='mso-tab-count:1'> </span>'UnitsInStock',<span style='mso-spacerun:yes'> </span># sum this field</pre><pre><span
- style='mso-tab-count:1'> </span>'Sum '<span style='mso-spacerun:yes'> </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>
- <ul>
- <li>ADODB_FETCH_DEFAULT = 0</li>
- <li>ADODB_FETCH_NUM = 1</li>
- <li>ADODB_FETCH_ASSOC = 2</li>
- <li>ADODB_FETCH_BOTH = 3</li>
- </ul>
- <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'> </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_NUM;<br>
- <span style='mso-tab-count:1'> </span>$rs1 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>$ADODB_<b>FETCH_MODE</b> = ADODB_FETCH_ASSOC;<br>
- <span style='mso-tab-count:1'> </span>$rs2 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre><span
- style='mso-tab-count:1'> </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, it defaults to
- ADODB_FETCH_DEFAULT. The behaviour of this mode varies from driver to
- driver, so do for portability reasons it is discouraged to rely on
- ADODB_FETCH_DEFAULT; stick to ADODB_FETCH_NUM or ADODB_FETCH_ASSOC instead.
- Note that 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'> </span>$db->SetFetchMode(ADODB_FETCH_NUM);<br>
- <span style='mso-tab-count:1'> </span>$rs1 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>$db->SetFetchMode(ADODB_FETCH_ASSOC);<br>
- <span style='mso-tab-count:1'> </span>$rs2 = $db->Execute('select * from table');<br>
- <span style='mso-tab-count:1'> </span>print_r($rs1->fields); # shows <i>array([0]=>'v0',[1] =>'v1')</i></pre><pre
- style='background:#EEEEEE'><span style='mso-tab-count:1'> </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 <i>sybase, oci8, mssql, odbc and ibase</i> drivers (including
- all those derived from them). Define the ADODB_ASSOC_CASE constant as appropriate to
- change the case of the keys. The default is to use native case. Possible values are:</p>
- <ul>
- <li>ADODB_ASSOC_CASE_LOWER = 0 - $rs->fields['orderid']</li>
- <li>ADODB_ASSOC_CASE_UPPER = 1 - $rs->fields['ORDERID']</li>
- <li>ADODB_ASSOC_CASE_NATIVE = 2 - $rs->fields['OrderID'] (or whatever the RDBMS will return)</li>
- </ul>
- <p>Example: <pre>
- include('adodb.inc.php');
- define('ADODB_ASSOC_CASE', ADODB_ASSOC_CASE_LOWER);
- </pre></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>Since 5.13, if $ADODB_QUOTE_FIELDNAMES is set to:
- <ul>
- <li>'UPPER' or true: uppercase field names. This is the default.
- <li>'NATIVE' : use native case.
- <li>'LOWER': lowercase field names.
- </ul>
- <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. Set to -99 to only display errors. Set to 99 to display debug statements and add a backtrace.</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'> </span># $oraname in tnsnames.ora/ONAMES/HOSTNAMES<br>
- <span style='mso-spacerun:yes'> </span>$conn->Connect(false, 'scott', 'tiger', $oraname); <br>
- <span style='mso-spacerun:yes'> </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'> </span>$conn = &NewADOConnection('mysql');<br>
- <span style='mso-spacerun:yes'> </span>$conn->autoRollback = true; # default is false<br>
- <span style='mso-spacerun:yes'> </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'> </span>$conn->Execute("SELECT * FROM TABLE WHERE COND=:val", array('val'=> $val));<br>
- <span style='mso-spacerun:yes'> </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'> </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'> </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. And since ADOdb 5.11 this is
- disabled by default due to security issues. To enable, set $conn->bulkBind = true. </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'> </span>array('Ahmad',32),<br>
- <span style='mso-tab-count:1'> </span>array('Zulkifli', 24),<br>
- <span style='mso-tab-count:1'> </span>array('Rosnah', 21)<br>
- <span style='mso-tab-count:1'> </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'> </span>include('adodb.inc.php'); <br>
- <span style='mso-spacerun:yes'> </span>include('tohtml.inc.php');<br>
- <span style='mso-spacerun:yes'> </span>$ADODB_<b>CACHE_DIR</b> = '/usr/local/ADOdbcache';<br>
- <span style='mso-spacerun:yes'> </span>$conn = &ADONewConnection('mysql'); <br>
- <span style='mso-spacerun:yes'> </span>$conn->PConnect('localhost','userid','password','database');<br>
- <span style='mso-spacerun:yes'> </span>$rs = $conn-><b>CacheExecute</b>(15, 'select * from table'); # cache 15 secs<br>
- <span style='mso-spacerun:yes'> </span>rs2html($rs); /* recordset to html table */<span style='mso-spacerun:yes'> </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'> </span>$conn->Connect(...);<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:1'> </span>$conn->cacheSecs = 3600*24; // cache 24 hours<br>
- <span style='mso-tab-count:1'> </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'> </span>$db = ADONewConnection("oci8"); <br>
- <span style='mso-spacerun:yes'> </span>$db->Connect("foo.com:1521", "uid", "pwd", "FOO"); <br>
- <span style='mso-spacerun:yes'> </span>$rs = $db->ExecuteCursor("begin :cursorvar := getdata(:param1); end;", <br>
- <span style='mso-tab-count:5'> </span>'cursorvar',<br>
- <span style='mso-tab-count:5'> </span>array('param1'=>10)); <br>
- <span style='mso-spacerun:yes'> </span># $rs is now just like any other ADOdb recordset object<br>
- <span style='mso-spacerun:yes'> </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'> </span>$stmt = $db->Prepare("begin :cursorvar := getdata(:param1); end;", true); <br>
- <span style='mso-tab-count:1'> </span>$db->Parameter($stmt, $cur, 'cursorvar', false, -1, OCI_B_CURSOR);<br>
- <span style='mso-tab-count:1'> </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'> </span>$vv = 'A%';<br>
- <span style='mso-tab-count:1'> </span>$stmt = $db->PrepareSP("BEGIN list_tabs(:crsr,:tt); END;");<br>
- <span style='mso-tab-count:1'> </span>$db->OutParameter($stmt, $cur, 'crsr', -1, OCI_B_CURSOR);<br>
- <span style='mso-tab-count:1'> </span>$db->OutParameter($stmt, $vv, 'tt', 32); # return varchar(32)<br>
- <span style='mso-tab-count:1'> </span>$arr = $db->GetArray($stmt);<br>
- <span style='mso-tab-count:1'> </span>print_r($arr);<br>
- <span style='mso-tab-count:1'> </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'> </span>TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;<br>
- <br>
- <span style='mso-tab-count:1'> </span>PROCEDURE list_tabs(tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS<br>
- <span style='mso-tab-count:1'> </span>BEGIN<br>
- <span style='mso-tab-count:2'> </span>OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;<br>
- <span style='mso-tab-count:2'> </span>tablenames := 'TEST';<br>
- <span style='mso-tab-count:1'> </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'> </span>$conn->SelectLimit("SELECT * FROM TABLE WHERE COND=:val", 100,-1,array('val'=> $val));<br>
- <span style='mso-spacerun:yes'> </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'> </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'> </span>$conn->Connect(...);<br>
- <span style='mso-spacerun:yes'> </span>$conn->cacheSecs = 3600*24; // cache 24 hours<br>
- <span style='mso-tab-count:1'> </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'> </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.adminschoice.com/crontab-quick-reference">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'> </span># for oracle<br>
- <span style='mso-tab-count:1'> </span>$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, empty_blob())');<br>
- <span style='mso-tab-count:1'> </span>$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span># non oracle databases<br>
- <span style='mso-tab-count:1'> </span>$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');<br>
- <span style='mso-tab-count:1'> </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'> </span># for oracle<br>
- <span style='mso-tab-count:1'> </span>$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, empty_clob())');<br>
- <span style='mso-tab-count:1'> </span>$conn->UpdateBlob('clobtable','clobcol',$clobvalue,'id=1');<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span># non oracle databases<br>
- <span style='mso-tab-count:1'> </span>$conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');<br>
- <span style='mso-tab-count:1'> </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'> </span>array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'),<br>
- <span style='mso-tab-count:1'> </span>'id',$autoquote = true);<span
- style='mso-tab-count:1'> </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'> </span>array('firstname'=>'Harun','lastname'=>'Al-Rashid', 'age' => 33, 'birthday' => 'null'),<br>
- <span style='mso-tab-count:1'> </span>array('lastname','firstname'),<br>
- <span style='mso-tab-count:1'> </span>$autoquote = true);<br>
- <br>
- # no auto-quoting<br>
- $ret = $db->Replace('atable2', <br>
- <span style='mso-tab-count:1'> </span>array('firstname'=>"'Harun'",'lastname'=>"'Al-Rashid'", 'age' => 'null'),<br>
- <span style='mso-tab-count:1'> </span>array('lastname','firstname'));<span
- style='mso-tab-count:1'> </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>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->CommitTrans();</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://msdn.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'> </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'> </span>$sql = <span
- style='color:#993300'>"SELECT "</span>.$db->length.<span
- style='color:#993300'>"(field) from table"</span>;<br>
- <span style='mso-spacerun:yes'> </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'> </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'> </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'> </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'> </span><span
- style='color:#993300'>"declare RETVAL integer; <br>
- <span style='mso-tab-count:1'> </span>begin<br>
- <span style='mso-tab-count:1'> </span>:RETVAL := SP_RUNSOMETHING(:myid,:group);<br>
- <span style='mso-tab-count:1'> </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'> </span>$id = $cnt; <br>
- <span style='mso-tab-count:1'> </span>$i = $cnt * $cnt; <span
- style='color:green'># works with oci8!</span></pre><pre style='background:#EEEEEE'><span
- style='mso-tab-count:1'> </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'> </span>$p1 = ?; $p2 = ?; $p3 = ?;<br>
- <span style='mso-spacerun:yes'> </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'> </span>$p1 = ?; $p2 = ?; $p3 = ?;<br>
- <span style='mso-spacerun:yes'> </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'> </span><b>mysql:</b></pre><pre><span
- style='mso-tab-count:2'> </span>CREATE TABLE adodb_logsql (</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>created datetime NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql1 text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>params text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>tracer text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>timer decimal(16,6) NOT NULL</pre><pre><span
- style='mso-tab-count:2'> </span>)</pre><pre><span
- style='mso-tab-count:2'> </span></pre><pre><span
- style='mso-tab-count:2'> </span><b>postgres:</b></pre><pre><span
- style='mso-tab-count:2'> </span>CREATE TABLE adodb_logsql (</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>created timestamp NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql1 text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>params text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>tracer text NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>timer decimal(16,6) NOT NULL</pre><pre><span
- style='mso-tab-count:2'> </span>)</pre><pre><span
- style='mso-tab-count:2'> </span></pre><pre><span
- style='mso-tab-count:2'> </span><b>mssql:</b></pre><pre><span
- style='mso-tab-count:2'> </span>CREATE TABLE adodb_logsql (</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>created datetime NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql1 varchar(4000) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>params varchar(3000) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>tracer varchar(500) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>timer decimal(16,6) NOT NULL</pre><pre><span
- style='mso-tab-count:2'> </span>)</pre><pre><span
- style='mso-tab-count:2'> </span></pre><pre><span
- style='mso-tab-count:2'> </span><b>oci8:</b></pre><pre><span
- style='mso-tab-count:2'> </span>CREATE TABLE adodb_logsql (</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>created date NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql0 varchar(250) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>sql1 varchar(4000) NOT NULL,</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>params varchar(4000),</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>tracer varchar(4000),</pre><pre><span
- style='mso-tab-count:2'> </span><span style='mso-spacerun:yes'> </span>timer decimal(16,6) NOT NULL</pre><pre><span
- style='mso-tab-count:2'> </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'> </span>$conn->LogSQL(); // turn on logging<br>
- <span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'> </span>:<br>
- <span style='mso-tab-count:1'> </span>$conn->Execute(...);<br>
- <span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'> </span>:<br>
- <span style='mso-tab-count:1'> </span>$conn->LogSQL(false); // turn off logging<br>
- <span style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </span># output summary of SQL logging results<br>
- <span style='mso-tab-count:1'> </span>$perf = NewPerfMonitor($conn);<br>
- <span style='mso-tab-count:1'> </span>echo $perf->SuspiciousSQL();<br>
- <span style='mso-tab-count:1'> </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'> </span>include('adodb.inc.php');<br>
- <span style='mso-tab-count:1'> </span>include('adodb-perf.inc.php');<br>
- <span style='mso-tab-count:1'> </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'> </span>if (!is_array(inputarray)) $EXECS++;</pre><pre><span
- style='mso-tab-count:1'> </span><span style='color:#006600'># handle 2-dimensional input arrays</span></pre><pre><span
- style='mso-tab-count:1'> </span>else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);</pre><pre><span
- style='mso-tab-count:1'> </span>else $EXECS++;</pre><pre><span
- style='mso-tab-count:1'> </span></pre><pre><span style='mso-tab-count:
- 1'> </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'> </span>$null = null;</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>:<br>
- <span style='mso-spacerun:yes'> </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 PHP DateTime object (since ADOdb 5.09), 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'> </span>$sql = "select * from atable where created > ".$db->DBDate("$year-$month-$day");</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>$sql = "select * from atable where created > ".$db->Param('0');</pre><pre><span
- style='mso-tab-count:1'> </span>// or</pre><pre><span style='mso-tab-count:
- 1'> </span>$sql = "select * from atable where created > ?";</pre><pre><span
- style='mso-tab-count:1'> </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 PHP DateTime object (since ADOdb 5.09), 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'> </span>$sql = "select * from atable where created > ".$db->DBTimeStamp("$year-$month-$day $hr:$min:$secs");</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>$sql = "select * from atable where created > ".$db->Param('0');</pre><pre><span
- style='mso-tab-count:1'> </span>// or</pre><pre><span style='mso-tab-count:
- 1'> </span>$sql = "select * from atable where created > ?";</pre><pre><span
- style='mso-tab-count:1'> </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'> </span>$DB->StartTrans();<br>
- <span style='mso-tab-count:1'> </span>$DB->RowLock("table1","rowid=$id");<br>
- <span style='mso-tab-count:1'> </span>$DB->Execute($sql1);<br>
- <span style='mso-tab-count:1'> </span>$DB->Execute($sql2);<br>
- <span style='mso-tab-count:1'> </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'> </span>switch(strtoupper($view)) {<br>
- <span style='mso-tab-count:1'> </span>case 'DATAVIEW': return array('DATAID');<br>
- <span style='mso-tab-count:1'> </span>default: return false;<br>
- <span style='mso-tab-count:1'> </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>SetCharSet<a name=setcharset id=setcharset></a>($charset)</b> </p>
- <p>Set the charset of the connection. The parameter passed in is dependent on the actual database RDBMS. e.g.
- <pre>
- $DB->SetCharSet('utf8'); // for mysql
- </pre>
- This is database driver specific and only supported for mysql, mysqlt, mysqli, and also postgres7 and later.</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'> </span>array(<br>
- <span style='mso-tab-count:2'> </span>'dept_table' => array('deptkey=deptid'),<br>
- <span style='mso-tab-count:2'> </span>'posn_table' => array('posn=positionid','poscategory=category')<br>
- <span style='mso-tab-count:1'> </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'> </span></pre><pre><span style='mso-spacerun:yes'> </span>Y: 4-digit Year</pre><pre><span style='mso-spacerun:yes'> </span>Q: Quarter (1-4)</pre><pre><span style='mso-spacerun:yes'> </span>M: Month (Jan-Dec)</pre><pre><span style='mso-spacerun:yes'> </span>m: Month (01-12)</pre><pre><span style='mso-spacerun:yes'> </span>d: Day (01-31)</pre><pre><span style='mso-spacerun:yes'> </span>H: Hour (00-23)</pre><pre><span style='mso-spacerun:yes'> </span>h: Hour (1-12)</pre><pre><span style='mso-spacerun:yes'> </span>i: Minute (00-59)</pre><pre><span style='mso-spacerun:yes'> </span>s: Second (00-60)</pre><pre><span style='mso-spacerun:yes'> </span>A: AM/PM indicator</pre><pre><span style='mso-spacerun:yes'> </span>w: day of week (0-6 or 1-7 depending on DB)</pre><pre><span style='mso-spacerun:yes'> </span>l: day of week (as string - lowercase L)</pre><pre><span style='mso-spacerun:yes'> </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'> </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'> </span>$sqlfn = $db->SQLDate('Y-\QQ','postdate'); # get sql that formats postdate to output 2002-Q1<br>
- <span style='mso-spacerun:yes'> </span>$sql = "SELECT $sqlfn,SUM(cogs) FROM table GROUP BY $sqlfn ORDER BY 1 desc";<br>
- <span style='mso-spacerun:yes'> </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'> </span>while (!$rs->EOF) {<br>
- <span style='mso-spacerun:yes'> </span><span style='mso-tab-count:2'> </span>ProcessArray($rs->fields);<span
- style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:2'> </span>$rs->MoveNext();<br>
- <span style='mso-tab-count:1'> </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'> </span>while ($arr = $rs->FetchRow()) {<br>
- <span style='mso-tab-count:1'> </span><span style='mso-spacerun:yes'> </span> # process $arr<span
- style='mso-tab-count:1'> </span><br>
- <span style='mso-tab-count:1'> </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'> </span>while ($o = $rs->FetchNextObject()) {<br>
- <span style='mso-tab-count:2'> </span>print "$o->FIRSTNAME, $o->LASTNAME<BR>";<br>
- <span style='mso-tab-count:1'> </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'> </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'> </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>
- </div>
- </body>
- </html>
|