当前位置: 亚洲城ca88 > ca88 > 正文

PHP利用COM对象访谈SQLServer,PHP调用COM组件的注解

时间:2019-11-22 20:14来源:ca88
PHP4.0.6以上方可在 Win32 平台北寻访 COM 和 DCOM对象。这里借用ASP观念访谈一下SQLServer。当然你也得以用mssql种类函数。即使是三个ASPCoder,你会感觉上边代码特别熟知,习于旧贯----无他,

PHP4.0.6以上方可在 Win32 平台北寻访 COM 和 DCOM 对象。这里借用ASP观念访谈一下SQLServer。当然你也得以用mssql种类函数。即使是三个ASP Coder,你会感觉上边代码特别熟知,习于旧贯----无他,但PHP强尔~_~:open echo"create conn OK";$rs=new COM or die;echo"
";//if echo"create rs OK";$sql="SELECT * FROM tb_bs";$rs->open;while{echo $rs->fields["i_BsID"]->value.":";echo $rs->fields["vc_BsName"]->value;echo"
";$rs->movenext();}$rs->Close;$rs=null;$dbConn->Close;$dbConn=null;?>如何,很简短吗?对于ASP Coder,万豆蔻梢头忽地你的BOSS接到多少个PHP项目标单子,你也不用恐慌,花一点时候你也足以顺利地张开销付了~访谈SQLServer的寄存过程,也和ASP的做法大概等同。

在PHP 4.2.0 至 4.2.3中,能够运用w32api_register_function 函数调用外界的DLL,前提是亟需在php.ini中张开增加的php_w32api.dll。

骨干思维正是:在JS动态成立select控件的option,通过Ajax获取在PHP从SQL数据库获取的省市区音讯,代码有一点点长,但为数不菲都以近乎的,举个例子JS中省、市、区收获方式相仿,PHP中经过参数不相同实行不生龙活虎的select语句。

假使运用的是PHP 5,调用DLL唯有利用PHP的COM类了。

index.html代码:

主导办法为:$obj = new COM("server.object")

复制代码 代码如下:

上边介绍怎样用PHP调用COM组件,接受的是msvs.net二〇〇五条件下的C#建立COM组件。

省市区三级联动

1. 用C#创建COM对象

请选拔省份请选取雷州市请接收县乡

COM对象是ClassLibrary类,它生成DLL文件。要在VS开垦景况中开创三个简短的COM对象,大家得以依次接收“文件”->“新建”->“项目”->“Visual C#”->“类库”,然后成立一个名为Comtest的工程。

thumbnails.js代码:

亟待注意的是:在COM中调用VC#对象急需下边包车型地铁法则:

复制代码 代码如下:window.onload = getProvince;function createRequest() {//Ajax于PHP交互作用须要对象 try { request = new XMLHttpRequest();//创造三个新的号召对象; } catch { try { request = new ActiveXObject; } catch { try { request = new ActiveXObject; } catch { request = null; } } } return request;}function sech {//省市改过时接触,select的onchange事件 var aa = document.getElementById{ getCity;//这里aa.value为省的id}if{getCounty;//这里aa.value为市的id}}function getProvince() {//获取全数省 request = createRequest(); if { alert("Unable to create request"); return; } var url= "getDetails.php?ID=0";//ID=0时传递至PHP时让其得到全数省 request.open; request.onreadystatechange = displayProvince; //设置回调函数 request.send; //发送诉求}function getCity{//获取省对应的市 request = createRequest(); if { alert("Unable to create request"); return; } var url= "getDetails.php?ID=" escape; request.open; request.onreadystatechange = displayCity; request.send;}function getCounty{//获取市对应的区 request = createRequest(); if { alert("Unable to create request"); return; } var url= "getDetails.php?ID=" escape; request.open; request.onreadystatechange = displayCounty; request.send;}function displayProvince() {//将获取的数据动态增加至select if (request.readyState == 4) { if (request.status == 200) { var a=new Array;var b=request.responseText;//将PHP重返的数额赋值给ba=b.split;//通过","将那意气风发数额保存在数组a中 document.getElementById.length=1; var obj=document.getElementById; for(i=0;i obj.options.add; //动态生成OPTION加到select中,第二个参数为Text,第二个参数为Value值. } }}function displayCity() {//将获取的数额动态增添至select if (request.readyState == 4) { if (request.status == 200) { var a=new Array;var b=request.responseText;a=b.split; document.getElementById.length=1;//重新采纳document.getElementById.length=1;//重新采用if(document.getElementById.value!="province"){ var obj=document.getElementById; for(i=0;i obj.options.add(new Option(a[i], document.getElementById.value*100 i 1)); //ocument.getElementById.value*100 i 1对应的是市的ID。} } }}function displayCounty() {//将获取的数目扩展至select if (request.readyState == 4) { if (request.status == 200) { var a=new Array;var b=request.responseText;a=b.split;document.getElementById.length=1;if(document.getElementById.value!="province"&&document.getElementById{ var obj=document.getElementById; for(i=0;i obj.options.add(new Option; } } }}

·类必需是public性质。

getDetails.php代码:

·性情、方法和事件必得是public性质的。

复制代码 代码如下:

·特性和措施必得在类接口中定义。

if{//获得省列表$conn->Open; //建构数据库连接$sqlstr = "select name from Province"; //设置查询字符串$rs = $conn->Execute; //实践查询拿到结果$num_cols = $rs->Fields->Count(); //拿到数码集列数$Province=array();$i=0;while {$Province[$i]=$rs->Fields['name']->Value.",";$rs->MoveNext();$i ;}foreachecho $val;$conn->Close();$rs = null;$conn = null;}

·事件必得在事件接口中定义。

if($_REQUEST['ID']>0&&$_REQUEST['ID']<35){//获得省对应的市列表$conn->Open; //建构数据库连接$sqlstr = "select name from City where c,";$rs->MoveNext();$i ;}foreachecho $val;$conn->Close();$rs = null;$conn = null;}

不是在此些接口中定义的public性质的类成员不能够被COM访谈,但它们能够被别的的.NET Framework对象访谈。要让COM能够访谈特性和办法,大家必须要在类接口中定义它们,使它们有着DispId属性,并在类中落实那几个特色和方式。那个成员定义时的逐一也正是它们在COM中相继。要让COM访谈类中的事件,必得在事件接口中定义这么些事件,并予以它们DispId属性。

if{//拿到省市对应的县列表$conn->Open; //创立数据库连接$sqlstr = "select name from County where c,";$rs->MoveNext();$i ;}foreachecho $val;$conn->Close();$rs = null;$conn = null;}?>

在接口名字在此之前,每种接口要求二个GUID本性。要生成唯豆蔻梢头的Guid,必要周转guidgen.exe工具软件,并选择“registry format”。在Program FilesMicrosoft Visual Studio 2005Common7Toolsguidgen.exe可获得。

数据库设计,表格Province表,City表,County表。须求:Province表要求id和name,id建议从1至34,举个例子香水之都id为1,四川id为2,就那样推算; City表必要id,name和cid,id为cid*100 1,cid为这个城市的上边,举个例子河内的顶头上司为广西省,cid为2的话,深圳的id就是201,就那样类推。 County表要求id,name和cid,因为是三级的涉嫌,id能够随便,提议从10001发端自增。cid为内地上级,比如和平县的cid为201,罗湖区的cid也为201;

需求潜心的是,在类的前边,须求安装上边包车型地铁性格:

截图:

ClassInterface(ClassInterfaceType.None),

HTML效果:

ComSourceInterfaces(typeof(*** _Events))

完结后效果:

ClassInterfaceType.None表示并没有为此类生成类接口,若无明了地落到实处接口,类只好因此IDispatch提供早先时期绑定访问。顾客愿意通过分明地由类落成的接口使表面前遇到象能够访谈类的效果与利益,那也是推荐的ClassInterfaceAttribute的安装。

备注:PHP是服务器端的,建议发表网址后通过ip调节和测验。

ComSourceInterfaces(typeof(*** _伊夫nts))分明洋洋看成COM事件向外界对象提供的接口。

上面是代码示例:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.Reflection;

using System.Data.OleDb;

using System.Data;

using System.Collections;

using System.Collections.Specialized;

namespace Comtest

{

    //类接口

    [Guid("394BE3FE-18B8-4c5e-B611-75B5C5493A4E")]

    public interface ITest

    {

        string Test(string test);

        [DispId(1)]       //固定写法,索引号从1最早

        string About();

        [DispId(2)]

        int Add(int a, int b);

    }

 

    //事件接口

    [Guid("45875EE5-5C8D-4016-897A-FCC7DD5A6834"),             //固定写法

    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

    public interface ITest_Events

    {

    }

 

    //类

    [Guid("854C二〇一六-E7BF-41ea-8F09-B873698E9F8E"),           //固定写法

     ClassInterface(ClassInterfaceType.None),

    ComSourceInterfaces(typeof(ITest_Events))]

    public class Class2 : ITest          //该类世襲上边的接口,并落到实处抽象方法

    {

        public string Test(string test)

        {

            return test;

        }

 

        public string About() { return "迎接访谈 "; }

        public int Add(int a, int b) { return a b; }

    }

 

}

 

在开创COM对象前,大家一定要向COM Interop注册该指标。右击方案微型机中的工程名字,点击快速菜单上的“属性”选项,然后再点击“生成”选项,将“为COM Interop注册”钩上。张开AssemblyInfo.cs将comVisible设为true。

为了对程序集举办唯后生可畏的标记,安全计策和版本计策,可感到类库组合创制多个强名字。注意:不是必得。成立强名字要求用到SN.EXE名字,在“最早—VS二〇〇六—VS Tools—VS命令提示符”,输入:

sn -k Comtest_Key.snk

将Comtest_Key.snk 添参与项目中(在Program FilesMS Visual Studio 2005VC下卡塔尔国,然后展开AssemblyInfo.cs,并步向上边意气风发行的剧情:

[assembly: AssemblyKeyFile("Comtest_Key.snk")]

最终生成项目,就能够在bin下获得COM组件。

2. PHP调用COM组件

平昔在PHP中应用COM类举办会见,就能够。

代码如下:

<?php

$b=new COM("Comtest.Class2");

$t1=126;

$t2=456; 

$r=$b->add($t1,$t2);

$f=$b->about();

echo  $r;  

echo $f;

?>  

除去,调用访谈EXCEL、WO宝马7系D和数据库,都足以选择COM类。

以下为调用WOENVISIOND的简洁明了例子:

<?php

// 启动 word

$word = new COM("word.application") or die("Unable to instanciate Word");

print "Loaded Word, version {$word->Version}n";

 

//将其置前

$word->Visible = 1;

 

//展开贰个空文书档案

$word->Documents->Add();

 

//随意做些事情

ca88,$word->Selection->TypeText("This is a test...");

$word->Documents[1]->SaveAs("Useless test.doc");

 

//关闭 word

$word->Quit();

 

//释放对象

$word->Release();

$word = null;

?>

 

以下为访谈MSSQL数据库系统的简便例子:

<?php  

     //访问MSSQL数据库系统

     echo '访问MSSQL<br>'   ;

          $dbConn=new  COM   ("ADODB.Connection")   or   die("创建COM失败");  

          $ADO='Provider=sqloledb;Data Source=10.35.58.74;Initial Catalog=Tour;Min Pool Size=1;Persist Security Info=False;User;Password=fq15Ns@E#(';

          //"Provider=sqloledb;DataSource=10.35.58.112;Initial   Catalog=Tour;User   Id=sa;Password=sa;"; fq15Ns@E#(  

          //Access如:$ADO="DRIVER={Microsoft   Access   Driver   (*.mdb)};   DBQ="   .   realpath("mydb.mdb");    

          $dbConn->open($ADO);  

          //if($dbConn)   echo"create   conn   OK";  

          $rs=new   COM("ADODB.RecordSet")   or   die("创建RS失败");  

          echo"<br>";  

          //if($rs)   echo"create   rs   OK";  

          $sql="Exec P_SelUser 9001111";//"SELECT   *   FROM   user_userInfo";  

          $rs->open($sql,$dbConn,1,1);  

         

          while(!$rs->eof){  

   

                  echo   $rs->fields["Account"]->value.":";  

                  echo   $rs->fields["PhoneID"]->value;  

                  echo"<BR>";  

   

                  $rs->movenext();  

          }  

   

          $rs->Close;  

          $rs=null;  

   

          $dbConn->Close;  

          $dbConn=null;  

  ?>  

那表达假如大家要使用PHP访问MSSQL,能够经过调用COM组件来促成。

 

 


编辑:ca88 本文来源:PHP利用COM对象访谈SQLServer,PHP调用COM组件的注解

关键词: 亚洲城ca88