CopyrightIBMCorporation2006TrademarksBuildingPHP-basedUIsforIBMLotusDominoPage1of14BuildingPHP-basedUIsforIBMLotusDominoAndreiKouvchinnikovMay09,2006DiscoverhowyoucaninteractwithLotusDominodatabasesfromWebapplicationscreatedinthePHPprogramminglanguage.
LearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theLotusNotesAPI,andXML.
Inthisarticle,youlearnhowtointeractwithIBMLotusDominodatabasesfromWebapplicationscreatedwiththePHPprogramminglanguage.
YoualsolearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theIBMLotusNotesapplicationprogramminginterface(API),andXML.
CodeexamplesforeachmethodareincludedintheDownloadssection.
TheXMLmethodalsohasadownloadableexampleapplicationwithasimpleWebinterfacetoanIBMLotusDominomaildatabase(seefigure1).
Figure1.
ExampleofaPHPuserinterfacetoamaildatabasePHPisapowerfulembeddedscriptinglanguage.
ItisfreetouseandpopularfordevelopingdynamicWebapplications.
PHPcodeisn'tcompiled;rather,it'sinterpretedatruntime.
MuchofitssyntaxisborrowedfromtheC,Java,andPerlprogramminglanguages.
YoucanaddPHPasaCommonGatewayInterface(CGI)enginetomostWebservers.
ItevenworksintheMicrosoftWindowsandLinuxoperatingsystems.
Inaddition,morethan50percentofWebhostingcompanieshavePHP-enabledservers.
WithsuchwidespreadPHPtechnology,yousimplycannotaffordtoremainunfamiliarwithit.
WorkingwithPHPYouincludePHPcodeinWebpageswiththehelpofspecialtags.
AllPHPcodebeginswiththetag:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage2of14TheWebserverinterpretsthissimpleexampleandtranslatesittofollowingHTMLoutput:HelloWorld!
PHPWebpagescaninteractwithDominodatabasesinseveralways.
ThechoiceofintegrationmethoddependsonwhichoperatingsystemyouusetorunPHP,thesecurityrestrictionsinplacebetweenPHPandyourDominoservers,andwhatyouareallowedtoinstallonthePHPserver.
Themethodsdescribedinthisarticleare:COMobjectsTheNotesAPIXMLthroughtheWebRunningPHPcodeofflineAlthoughPHPisprimarilyintendedtorunonaWebserverandisnotforstandaloneapplications,youcanrunitfromthecommandlineasashellscriptingtoolsimilartoMicrosoftVisualBasicScriptingEdition(VBScript).
ThisfeaturecanbeusefulforofflinetestingbeforeputtingthefilesontheWebserver.
AccessingLotusDominoThreemethodsareavailableforaccessingaDominodatabase:throughCOMobjects,throughtheNotesAPI,andthroughXML.
AccessLotusDominousingDominoCOMobjectsTheeasiestandmostfast-forwardmethodofaccessinginformationstoredinDominodatabasesisthroughDominoCOMobjects.
UsingCOMfromPHPisn'tmuchmoredifficultthandoingsofromLotusScript.
Thefollowingcodeexampleshowshowtoprintthefieldvaluesofallthedocumentsinaview.
Initialize();//ShowthenameofthecurrentNotesuserprint"Currentuser:".
$session->CommonUserName.
"\n\n";//Getdatabasehandle$db=$session->getDatabase("","mailtest.
nsf");//Getviewhandleusingpreviouslyreceiveddatabasehandle.
//Notethatthereservedcharacterintheviewnamemustbe\-escaped$view=$db->getView("(\$Drafts)");ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage3of14//Getfirstdocumentinviewusingpreviouslyreceivedviewhandle$doc=$view->getFirstDocument();//Loopuntilalldocumentsinviewareprocessedwhile(is_object($doc)){//Gethandletoafieldcalled"Subject"$field=$doc->GetFirstItem("Subject");//Gettextvalueofthefield$fieldvalue=$field->text;//Showthevalueofthefieldprint"Subject:".
$fieldvalue.
"\n";//Getnextdocumentintheview$doc=$view->getNextDocument($doc);}//Releasethesessionobject$session=null;>Figure2showstheoutputfromrunningthisCOMobjectfromthecommandline.
Figure2.
ResultofrunningCOMobjectcodeatacommandpromptUsingCOMobjectsiseasy,buttherearesomedisadvantagesthatmakeCOMratherlimited.
ThemaindisadvantageisthatyoumusthaveLotusNotesclientsoftwareinstalledonthePHPserver.
Ifyou'reusingaWebhostingcompanyforyourPHPapplications,thereisn'tmuchyoucandotoconvincethehostingcompanytoinstallaNotesclientjustforpurposesofyourPHPWebsite.
IfyouhaveyourownPHPserverorperhapsPHPandDominoserversonthesamecomputer,youshouldhavenoproblemssettingupCOMaccesstotheDominoserver.
AnotherissuethatlimitsCOMuseisthatCOMobjectsaresupportedonlyontheWindowsplatform.
ConsideringthatmostPHPserversrunontheLinuxplatform,thisrequirementconsiderablyreducesthenumberofavailableserversthatcanhostyourCOMsolution,evenifyouhavefulladministrativecontrolforthoseservers.
AccessLotusDominothroughanAPIAnalternativetoCOMaccessistousetheLotusNotes/DominoCAPI.
Theoretically,youcanusethissolutiononoperatingsystemsotherthanWindows.
WerecommendthatonlydeveloperswhohavealotofexperienceinC/C++programminguseit(ifyouhaveareasonfornotusingaCOMinterfaceorXML).
ThefunctionalityprovidedinthesampleAPIsolutionislimited,andyoumustbasicallywriteyourowncodeintheCprogramminglanguagetoaccomplishmosttasks.
developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage4of14ThesamplelibraryprovidesagoodexampleforcreatingPHPextensions.
Itcomesonlyassourcecode,andyoumusthavetheVisualCcompilerandtheDominoCAPItoolkittocompilethecode.
Foryourconvenience,we'vecompiledthesourcecodeintoaDLLfileandincludeditintheDownloadssection.
YoucanactivatetheNotesextensionbyaddingthefollowinglinetothephp.
iniconfigurationfile:extension=php5_notes.
dllThefollowingcodeexampleshowshowtousethistechniqueafteryouproducetherequiredDLL.
Figure3showstheoutputfromrunningtheAPIcodefromthecommandline.
Figure3.
OutputoftheAPIcodeAccessLotusDominousingXMLUsingXMLtointeractwithDominodatabasesisthemostcompatiblesolution.
Itdoesn'trequireanyspecialadjustmentsorinstallationsonthePHPWebserver,anditworksonalloperatingsystems.
Inouropinion,it'sthebestapproachinmostcases.
IntheXMLsolutioninthisarticle,youusetechniquesthataremostlikelytoworkinthemajorityofconfigurations.
Asanexample,youcreateaPHPinterfacetoastandardDominomaildatabase.
TheonlymodificationmadeintheDominoenvironmentisaLotusScriptagentusedtoviewfieldsfromthemaildocuments.
YouusethesameagenttoparsetheXMLandtocreateandsendmail.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage5of14ToviewtheInboxfolderfromthemaildatabase,completethesesteps:1.
AsktheuserforhisorherNotesusernameandpassword.
2.
SendaloginrequesttotheDominodatabaseusingtheusernameandpasswordprovided(seefigure4).
Figure4.
LoginscreeninthePHPsampleapplication3.
Fromtheloginresponse,getasessioncookie.
(YouneedthiscookieforsubsequentrequeststotheDominodatabase.
)4.
MakearequesttotheDominoserverfortheXMLsourceoftheInboxfolder,usingtheReadViewEntriesURLcommand.
ThiscommandreturnsthecontentoftheviewpresentedinXMLforminsteadofreturningHTML.
YoutellDominoyouridentitybyappendingasessioncookietotherequestheaders.
5.
OnthereceivedXML-formattedviewcontent,usePHP'sXMLparsertofinddocumentsandfields.
6.
WhentheXMLparserhasprocessedthewholedocument,constructtheHTMLcode,andprinttothebrowser.
Tomakeamailmessageaclickablelink,usetheUNIDattributeofeachdocumentnode.
ToaccessDominodatabases,youneedfunctionalitybothtogetaWebpagefromtheDominoserverandtoparsetheXML.
Youmustalsoassumethefollowingforpurposesofthedemoapplication:TheDominoserverisversion6orlater;otherwise,youcan'tuseLotusScript'sXML-parsingfunctionality.
(ThisLotusScriptagentisdiscussedinmoredetaillater.
)ThePHPWebserverallowsoutgoingWebrequests.
TheDominoserverisaccessiblefromthePHPWebserverbyeithertheInternetoranintranet.
Note:Ifyoucan'taccesstheDominoserverfromtheInternet,youmayneedtoadjustyourfirewallconfigurationtoallowtrafficfromthePHPserver.
PHPfunctionsforreadingWeb-basedDominofilesPHPhasseveralfunctionsforretrievingWeb-basedcontent.
ThesefunctionswereincludedinPHPfromtheinception,butadministratorshaven'talwaysactivatedthem.
ThefollowingfunctionscanretrieveafilefromtheWeb:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage6of14file_get_contents().
Thisfunctioniseasytouse,anditsupportsboththeGETandPOSTrequesttypes.
Withfile_get_contents(),yougetthewholeWebfileatonceasastring.
fopen().
ThismethodreadstheWebfileinchunks.
file().
ThismethodreadsthewholeWebfileandseparatesthefile'scontentlinebyline.
It'sakindofcross-overbetweenfile_get_contents()andfopen().
fsockopen().
ThisfunctionhasthegreatestchanceofbeingactivatedonthehostingWebserver.
Themaindifferencebetweenthisandotherfunctionsisthatwithfsockopen(),youmustcreatethewholeWebrequestbyyourselfinsteadofsettingdifferentparameters.
CURL.
TheClientURLLibrary(CURL)hasthemostadvancedfunctionality.
UsingCURL,youcanconnecttoandcommunicatewithmanydifferenttypesofserverswithmanydifferenttypesofprotocols.
CURLcurrentlysupportsHTTP,HTTPS,FTP,Gopher,Telnet,DICT,File,andLDAP.
Italsosupportsproxies,cookies,andauthentication.
Unfortunately,CURLisoftendisabledbyWebhostingcompanies.
Note:Intheexampleapplicationinthisarticle,youusethefile_get_contents()functionexclusively.
ObtainingtheDominosessioncookieisanimportantpartoftheprocess,andyoucanusethesamecodeinotherDomino-relatedapplications.
Forexample,youcanretrieveacookieforloggingintotheIBMLotusSametimeserverusingSTLinks.
YougetthesessioncookiebysendingaPOSTrequesttotheDominoserver.
Inthatrequest,youincludeyourusernameandpassword.
TheresponsefromtheservercontainsacookiethatyouuseinsubsequentrequeststotheDominoserver.
Byincludingasessioncookie,theDominoserverthinksthatyourscriptisactuallyahumanuserwhorecentlyloggedinandisnowaccessingthedatabase.
YouusethePOSTmethodinsteadoftheGETmethodbecauseURLsoftheGETmethodareloggedintheDominolog,andanyonewhoaccessesthelogcanseetheusernameandpasswordinplaintext.
WiththePOSTmethod,usernamesandpasswordsaren'tpartoftheURL;therefore,theyaren'tvisibleinregularlogs.
YoucanfindtheDominosessioncookieintheSet-Cookieresponseheader.
ThesessioncookieiscalledeitherDomAuthSessIdorLtpaToken.
YouusethenameLtpaTokenwhentheDominoserverisconfiguredforsinglesign-on(SSO).
Youdon'tactuallycarewhatthecookienameis;yousimplysavethewholecookiestring.
Thefollowingcodeexampleshowshowtoretrievethecookie.
$req="username=john+doe&password=john123";$opts=array("http"=>array("method"=>"POST","content"=>$req,"header"=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n"));$context=stream_context_create($opts);if(!
($fp=fopen("http://server.
com/maildb.
nsflogin","r",false,$context))){ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage7of14die("CouldnotopenloginURL");}$meta=stream_get_meta_data($fp);for($j=0;isset($meta["wrapper_data"][$j]);$j++){if(strstr(strtolower($meta["wrapper_data"][$j]),'set-cookie')){$cookie=substr($meta["wrapper_data"][$j],12);break;}}fclose($fp);$_SESSION["DominoCookie"]=$cookie;Inthecodeline$req="username=john+doe&password=john123",youprovideavalidusernameandpasswordtobeusedforloggingintotheDominoserver.
Then,yousetupadditionaloptions,suchasthePOSTmethodtypeandotherheaders.
Afterthat,youapplyyouradditionaloptionstotheoutgoingHTTPrequest:fopen("http://server.
com/mydb.
nsflogin","r",false,$context)FromtheresponseyoureceivefromtheDominoserver,yougetalltheheadersusingthestream_get_meta_data($fp)functionandloopthroughtheheadersuntilyoufindtheonethatcontainstheSet-Cookiestring.
Afterthat,yousavethecookiebystoringitinsideasessionvariable:$_SESSION["DominoCookie"]=$cookie$_SESSIONholdsthecookievalueuntilyouclosetheWebbrowser.
Now,youapplythecookietoyournextrequest,whichretrievestheInboxview/folderfromaDominomaildatabase.
$opts=array('http'=>array('method'=>"GET",'header'=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n".
"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"));$context=stream_context_create($opts);$xml=file_get_contents("http://server.
com/maildb.
nsf/(\$Inbox)ReadViewEntries",false,$context);Thistime,youusetheGETmethodtodownloadaWebpageinsteadofthePOSTmethod.
Thismethodisspecifiedwiththe'method'=>"GET"lineintheHTTPoptionsarray.
Insteadofreadingonlyheaders,youreadthewholeresponseusingthefile_get_contents(URL,false,context)function.
TheresultofthisoperationisalongXMLstringcontainingallthecolumnsfromtheInboxview.
Youappendthesessioncookietotheheaderwith:"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage8of14AfteryoureceivetheXMLdata,youcanprocessitinthePHPXMLparser.
Then,youcreateyourownuserinterfacefortheInboxview.
PHPfunctionsforprocessingXMLInPHP,justasintheLotusScriptandJavaprogramminglanguages,therearetwowaysofprocessingXMLcode:theSimpleAPIforXML(SAX)andtheDocumentObjectModel(DOM).
SAXisanevent-basedprogrammingmodel,andit'sincludedandenabledbydefaultinmostPHPWebservers.
TheDOMextensionmustbeactivatedbytheWebserver'sadministrator.
AlthoughDOMismucheasiertoprogramwith,intheseexamples,youusetheSAXparserbecauseyouwanttoachievemaximumcompatibilitywithmostPHPconfigurations.
TechniquessimilartoprocessingDominoviewscan--withsmallmodifications--beusedforprocessingotherXMLsources,suchasRSSfeedsandevenWebservices.
ThefollowingcodeexampleshowstheXMLsourceoftheInboxviewcontainingonedocument.
00DonaldDuck17820060402T205929,52+0220060402T205929,52+028230seenMickeyAsyoucansee,documentsintheXMLsourcearepresentedwiththetag,andcolumns(fields)arepresentedwithtags.
Thedocument'sUniversalIDisavailableasanattributeofthenode.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage9of14Allyouneedtodoisdetermineawaytoprogrammaticallyfindthevaluesbetweenthosetagstogetallthedatayouneed.
Soundseasy,anditiseasytoaccomplish,too.
First,initiatetheXMLparserobjectusingthexml_parser_createfunction:$xml_parser=xml_parser_create();Then,setcallbackfunctions,whichareresponsibleforhandlingthestartandendofXMLelements.
Thesefunctionsareidentifiedtotheprocessorthroughtheuseofthexml_set_element_handlerandxml_set_character_data_handlerfunctions.
Eachfunctionacceptstheparserhandleandthenamesofthecallbackfunctions:xml_set_element_handler($xml_parser,"startElement","endElement");xml_set_character_data_handler($xml_parser,"textData");YoumustaddthestartElement,endElement,andtextDatafunctionstoyourPHPcode:functionstartElement($parser,$name,$attributes){switch($name){case"VIEWENTRY":$main="VIEWENTRY";if($attributes["UNID"]!
=""){$current_doc=$attributes["UNID"];$unids[$doc_counter]=$current_doc;}break;case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;case"DATETIME":$main="DATETIME";break;default:break;}}functionendElement($parser,$name){if($name=="VIEWENTRY"){$doc_counter++;//increasedocumentcounterby1}$current_column="";}functiontextData($parser,$data){switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;case"DATETIME":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main].
="$data";}else{$doc_coll[$current_doc][$main]="$data";developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage10of14}break;case"VIEWENTRY":break;}}So,let'sseehowitworks.
WhentheXMLparsergoesthroughtheXMLsourceandfindsthatanewelementisstarted,ittriggersthestartElementfunction,whichyouspecifiedasacallbackfunction.
Inthiscase,suchastartingelementnameis.
Nowyouknowthatthecurrentelementbeingprocessedisanewcolumn,soyoucansetthe$current_columnvariabletothenumberofthecolumn.
Inthiscase,columnsrepresentfields:case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;Afterthat,theparserfindsthetextinsidethenodeandsendsittothetextDatafunctionthatyouspecifiedasacallbackfunction.
Thepurposeofthisfunctionistoallowyoutopopulateanarraywithvaluesinsidethenode:switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;UsingtheXMLsourceexample,the$doc_coll[$current_doc][$main][$current_column]="$data"codelineis:$doc_coll["38B16601EC8B42BAC12571440068335C"]["ENTRYDATA"]["8"]="seenMickey"ThismeansthattheeighthcolumnintheInboxviewforthedocumentwithUniversalID38B16601EC8B42BAC12571440068335Cis"seenMickey",whichhappenstobethesubjectofthemailmessage.
TheXMLparseris"smart"andknowsthatifanelementisstarted,itmustbefinishedsomewhere.
So,whenitfindstheendoftheelement,itsignalsyoubytriggeringtheendElementfunction(that'sright:thesamefunctionnameyouspecifiedasyoursecondcallbackfunction).
Inthatfunction,youresetthecolumnnumberbecauseitisn'tneededanymore.
Youalsocheckwhetherthedocumentcountermustbeincreased.
Youusethe$doc_countervariableasacounterforthearraythatstoresUniversalIDs.
YoumuststoreUniversalIDsmainlyforthepurposeofaddinglinkstothemaildocuments.
WhenyouknowthattheVIEWENTRYelementhasended,itmeansthatanewUniversalIDiscomingnext,andibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage11of14youhadbetterincreasethecurrentarraynumberby1tokeepthe$doc_colland$unidsarraysintact:if($name=="VIEWENTRY"){$doc_counter++;}$current_column="";Ifyoudownloadthesampleapplicationandrunitonyourownserver,yourversionoftheDominomaildatabasemayhavedifferentplacementofcolumnsinthemailviews.
Ifso,youmustadjustthecolumnnumbersinthePHPcode(docfunctions.
php).
ThesamplePHPapplicationandtheLotusScriptagentThissectionisaboutaDominoagentcalledProcessDocWebAction,whichisincludedaspartofthesampleapplicationyoucandownloadwiththisarticle.
TheagentisprogrammedinLotusScriptandusestheDOMtoparseincomingXMLrequests.
BecauseitusesthenewXMLscriptclasses,youcanusetheapplicationonDominorelease6andrelease7servers,butnotonrelease5servers.
TherequeststhatthisagenthandlesareinitiatedfromthesamplePHPapplicationandcanbeofthefollowingtypes:CreateandsendamailmessageSaveanexistingmaildocumentSaveanewmaildocumentasdraftRequestinformationaboutthelocationofauser'sfileAdummyPingrequesttomakesurethatauserisstillloggedinTodeploytheagent,completethesesteps:1.
Copyallthetextfromthexmlagent.
lssfile.
2.
Createanewagentinadatabaseofyourchoice.
3.
Setthepropertiesoftheagentto"RunasWebuser"andthetargettoNone.
4.
Pastethecopiedcodeintothisnewagent.
5.
NametheagentProcessDocWebAction,andthensaveit.
6.
InthePHPfile(dominomail.
php),pointtotheURLlocationofthedatabaseinwhichtheagentresides.
OneofourmainprioritiesduringthecreationofthePHPsampleapplicationwastoensurethatitworkedonallstandardmaildatabaseswithoutdesignmodifications.
That'swhythisapplicationdoesn'trequireanychangestothemaildatabasedesign.
YoucanplacetheagentforprocessingtheXMLoutsidetheuser'smaildatabase,andthesameagentcanbeusedforservingallusers.
Whenauserauthenticatesforthefirsttime,thePHPapplication,afterretrievingthesessioncookie,asksthisagentforthelocationoftheuser'smailfile.
Theagentknowswhotheinvokeroftheagentisbecausetheagentisrunningwiththe"RunasWebuser"propertyactivated.
AfterdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage12of14thisinitialrequest,thepathtotheuser'smaildatabaseissavedforre-useuntiltheuserclosestheWebbrowserorthesessionexpires.
AuserisalwaysauthenticatedusingrealDominoauthentication.
TheusercannotaccessanyresourcesheorshecannotaccessusingaWebbrowserclient,eveniftheusercouldmodifythePHPsourcecodeontheWebserver.
ConclusionIfyou'reaDominodeveloperoradministratorandyourDominoserverisn'taccessiblefromtheInternet,youcanstillgiveusersawaytoaccessdatastoredinDominodatabasesandallowthemtoreadandwriteemailmessages.
UsingtheXMLtechniquesdescribedinthisarticleandappliedinthesampleapplication,youcaneasilyimplementDominoauthenticationinyourownPHPapplicationstoverifyloginsagainsttheDominoDirectory.
Thereisnooverridingofauser'saccessrightsintheWeb-basedXMLsolution;theuserisusinghisorherowncredentialsineachoperation.
Thisensuresthatuserscannotaccessunauthorizeddata.
Tofurtherincreasesecurity,youcanimplementloggingoffailedloginattempts.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage13of14DownloadableresourcesDescriptionNameSizeSourcecodeofPHPapplicationphp_app_sample.
zip10KBLotusScriptagentusedforprocessingXMLxmlagent.
zip2KBCompiledversionofNotesAPIextensionphp_notes_dll.
zip21KBdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage14of14RelatedtopicsdeveloperWorksarticle,"ReadingandwritingtheXMLDOMwithPHP"PHPWebsitePHP:XMLParserFunctionsTryalivedemoofthePHPinterfacedemotoaDominomaildatabase.
DownloadatrialversionofLotusNotes7fromdeveloperWorks.
DownloadatrialversionofLotusDomino7fromdeveloperWorks.
DownloadthesourcecodeoftheNotesAPIextensionforPHPfromthePHPExtensionCommunityLibrary(PECL)site.
CopyrightIBMCorporation2006(www.
ibm.
com/legal/copytrade.
shtml)Trademarks(www.
ibm.
com/developerworks/ibm/trademarks/)
昔日数据怎么样?昔日数据是一个来自国内服务器销售商,成立于2020年底,主要销售国内海外云服务器,目前有国内湖北十堰云服务器和香港hkbn云服务器 采用KVM虚拟化技术构架,湖北十堰机房10M带宽月付19元起;香港HKBN,月付12元起; 此次夏日活动全部首月5折促销,有需要的可以关注一下。点击进入:昔日数据官方网站地址昔日数据优惠码:优惠码: XR2021 全场通用(活动持续半个月 2021/7...
云步云怎么样?云步云是创建于2021年的品牌,主要从事出售香港vps、美国VPS、日本VPS、香港独立服务器、香港站群服务器等,机房有香港、美国、日本东京等机房,目前在售VPS线路有CN2+BGP、CN2 GIA,香港的线路也是CN2直连大陆,该公司旗下产品均采用KVM虚拟化架构。目前,云步云提供香港安畅、沙田、大浦、葵湾、将军澳、新世界等CN2机房云服务器,2核2G5M仅72.5元/月起。点击进...
最近发现一个比较怪异的事情,在访问和登录大部分国外主机商和域名商的时候都需要二次验证。常见的就是需要我们勾选判断是不是真人。以及比如在刚才要访问Namecheap检查前几天送给网友域名的账户域名是否转出的,再次登录网站的时候又需要人机验证。这里有看到"Attention Required"的提示。我们只能手工选择按钮,然后根据验证码进行选择合适的标记。这次我要选择的是船的标识,每次需要选择三个,一...
file_get_contents为你推荐
contentgoogleCouriercss127.0.0.1DNS老是被修改为127.0.0.1,这是为什么?联通版iphone4s苹果4S移动版和联通版有什么不同迅雷快鸟用迅雷快鸟提示:您所在的网络暂不支持迅雷快鸟csshack针对IE6的CSS HACK是什么?联通合约机iphone5联通合约机iphone5能用移动卡吗苹果5.1完美越狱iOS5.1.1完美越狱教程chrome18chrome的加速功能怎么开启呢?android5.1安卓N是什么东西??和普通的安卓系统(例如安卓5.1)有什么区别?
便宜域名注册 香港vps主机 双线vps 阿云浏览器 国外永久服务器 inmotionhosting pccw 免备案cdn 火车票抢票攻略 win8升级win10正式版 typecho 远程登陆工具 搜狗12306抢票助手 eq2 丹弗 有益网络 腾讯实名认证中心 adroit qq云端 网游服务器 更多