深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 879|回复: 6
打印 上一主题 下一主题

php连接mssql的方法(ADODB)

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2020-4-19 14:30:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhgc 于 2020-4-19 14:36 编辑

php连接mssql的方法(ADODB)

Microsoft Drivers for PHP for SQL Server

https://www.microsoft.com/en-us/download/details.aspx?id=20098

Version 4.0 supports PHP 7.0+ on Windows and Linux
Version 3.2 supports PHP 5.6, 5.5, and 5.4 on Windows

php是5.6.31 -->SQLSRV32.EXE



Version        3.0.2.2R (Unofficial)
Unofficial Changes        Works with Native Clients 11/10/9


There are different versions of the Native Client components for each SQL Server.

SQL Server 2005 - Native Client 9.0
SQL Server 2008 - Native Client 10.0
SQL Server 2012 - Native Client 11.0

SELECT   
SERVERPROPERTY('servername') AS 实例名,  
SERVERPROPERTY('ProductVersion') AS 实例版本,  
SERVERPROPERTY('Edition') AS 产品版本,  
SERVERPROPERTY('ProductLevel') AS 版本级别,  
@@VERSION AS 版本信息




找SQL Server 2008 - Native Client 10.0



  1. <?php

  2. require_once("adodb/adodb.inc.php"); //版本升级为5.20.14
  3. //string ERPconn = "Data Source=10.0.10.70;Password=Xc;User ID=zf;Initial Catalog=AHXC";

  4. $db = ADONewConnection('mssqlnative');
  5. //$db->setConnectionParameter('ReturnDatesAsStrings',false);
  6. //$db->connect('SERVER\SQLEXPRESS','user','password','NORTHWND');
  7. $db->setConnectionParameter('characterSet','UTF-8');
  8. $db->connect("10.0.10.70","zf","Xc","AHXC");
  9. $sql="select getdate()";
  10. $rs = $db->Execute($sql);
  11. print_r($rs->GetRows());
复制代码



成功!


结论:
1. php不再自带连接mssql的模块,需要去微软驱动SQLSRVXX.EXE
2. 微软官方提供的驱动都是32位的,不支持64位的 。要找非观方的64位版
3. 一定要下载对应版本的Native Client
回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
 楼主| 发表于 2020-12-13 23:13:37 | 只看该作者
保存位置

\tools.syant\php.syant\SQLServer_MSSQL_PHP
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
板凳
 楼主| 发表于 2020-12-13 23:18:48 | 只看该作者
保存位置

\tools.syant\php.syant\SQLServer_MSSQL_PHP
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
地板
 楼主| 发表于 2021-1-28 22:11:31 | 只看该作者
再次总结:

1.sqlncli64.msi一定要安装,他实际是SQL SERVER 2008 Native Client

2.SQLSRV32.EXE已经没有安装必要, 因为只有32位的,没有64位的

只接把64位目录 中的
php_pdo_sqlsrv_56_ts.dll
php_sqlsrv_56_ts.dll
放在php的ext目录

然后在php.ini中加上
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo_sqlsrv_56_ts.dll
extension=php_sqlsrv_56_ts.dll



这样php就可以连通
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
5#
 楼主| 发表于 2021-9-21 11:12:26 | 只看该作者
第一个案例分析:

  1. '确定BOM
  2. If (bCheckBom) Then
  3.     sUrl = "http://192.168.100.18/mesapi/index.php/erp/bom/checkbom/" & Trim(Me.cmbproduct.Text) & "/save?character=gbk"
  4.     sBom = GetUrlStr(sUrl)
  5.     '{"tag":418,"res":"OK","msg":"","tick":0.104,"time":"2020-04-21 20:19:41","log":["DGSC找到8HC019CMMA0!","1e50e588ef00c898b2cbc65bd6a96479","MES有记录1"],"data":[]}
  6.      If InStr(sBom, "res"":""OK""") > 0 Then
  7.         MsgBox "注意:" & Trim(Me.cmbproduct.Text) & "料表ERP数据同步成功!"
  8.      Else
  9.         MsgBox "警告:" & Trim(Me.cmbproduct.Text) & "料表ERP数据同步不成功!"
  10.         ' Screen.MousePointer = vbDefault
  11.         ' Exit Sub
  12.      End If
  13. End If
复制代码



  1. Attribute VB_Name = "MesAPI"
  2. Option Explicit
  3. 'vb代替inet控件获得网页源代e79fa5e98193e78988e69d8331333363386162码(解决代码不完整的问题)
  4. Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
  5. Public Const INTERNET_OPEN_TYPE_DIRECT = 1
  6. Public Const INTERNET_OPEN_TYPE_PROXY = 3
  7. Public Const scUserAgent = "Microsoft Internet Explorer 6.0"
  8. Public Const INTERNET_FLAG_RELOAD = &H80000000
  9. Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
  10. Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
  11. Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
  12. Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
  13. Public Function GetUrlStr(URL) As String '调用时 URL 参数一定要带 http:// 前缀.
  14. Dim hOpen As Long
  15. Dim hOpenUrl As Long
  16. Dim sUrl As String
  17. Dim bDoLoop As Boolean
  18. Dim bRet As Boolean
  19. Dim sReadBuffer As String * 2048
  20. Dim lNumberOfBytesRead As Long
  21. Dim sBuffer As String
  22. sUrl = URL
  23. hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
  24. hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
  25. bDoLoop = True
  26. While bDoLoop
  27. sReadBuffer = vbNullString
  28. bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
  29. sBuffer = sBuffer & left$(sReadBuffer, lNumberOfBytesRead)
  30. If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
  31. Wend
  32. GetUrlStr = sBuffer
  33. If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
  34. If hOpen <> 0 Then InternetCloseHandle (hOpen)
  35. End Function
复制代码



回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
6#
 楼主| 发表于 2021-9-21 11:17:58 | 只看该作者
MSSERVER/MSSQL类型ERP的连接

  1. <?php

  2. /*
  3. * 全飞鸿后台接口
  4. * 本模块设计来处理erp数据
  5. * 有任何问题请联系syant/13760216621
  6. */

  7. require_once("adodb/adodb.inc.php"); //版本升级为5.20.14

  8. class erp extends tapp{
  9.        
  10.         var $db;
  11.        
  12.         /*
  13.         * MES系统EPR数据处理接口 v1.0
  14.         * DGSC,AHXC, XCLK,OMKJ,XGLK
  15.         */
  16.         function erp() {
  17.                 parent::__construct();        //一定要添加这一句
  18.                 $this->db = ADONewConnection('mssqlnative');
  19.                 //$this->db->setConnectionParameter('ReturnDatesAsStrings',false);
  20.                 $this->db->setConnectionParameter('characterSet','UTF-8');
  21.                 $this->db->connect("10.0.10.0","Xc","2018","DGSC");  //AHXC
  22.                 $this->db->SetFetchMode(ADODB_FETCH_NUM);  //ADODB_FETCH_NUM   ADODB_FETCH_ASSOC  ADODB_FETCH_BOTH
  23.         }

  24. }
复制代码

回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
7#
 楼主| 发表于 2021-9-21 11:23:07 | 只看该作者
本帖最后由 zhgc 于 2021-9-21 11:24 编辑
  1. <?php


  2. /*
  3. * 全飞鸿后台接口
  4. * 本模块设计来处理erp数据
  5. * 有任何问题请联系syant/13760216621
  6. */

  7. class BOM  extends tpage{
  8.                
  9.         function BOM($app) {
  10.                         parent::__construct($app);
  11.                         $app->setDebug(true);//开发期间打开debug
  12.         }
复制代码

        
  1.         function getRealLoc($loc){
  2.                 $loc=str_replace(" ",",",$loc);
  3.                 $loc=str_replace(";",",",$loc);
  4.                 $loc=str_replace(",",",",$loc);
  5.                 $loc=str_replace(";",",",$loc);
  6.                 $loc=str_replace(";",",",$loc);
  7.                 $loc=str_replace("\r\n",",",$loc);
  8.                 $loc=str_replace("\n\r",",",$loc);
  9.                 $loc=str_replace("\r",",",$loc);
  10.                 $loc=str_replace("\n",",",$loc);
  11.                 return $loc;
  12.         }
复制代码

        
      
  1. function getBOMinfo_bydb($PNO,$ZT){
  2.                 $data=array();
  3.                 $sql="select CB001 主件品号,CB005 元件品号,CB021 位号 from {$ZT}.dbo.BOMCB where CB001 = '{$PNO}'";
  4.                 //$sql="select t1.CB005 元件,t2.MB004 替代料,t2.MB002 主件品号,t1.CB021 位号 from DGSC.dbo.BOMCB t1,DGSC.dbo.BOMMB t2
  5. //where t1.CB005=t2.MB001 and t1.CB001 = '8HC011CMM80' and t2.MB002 in ('8HC011CMM80','********************')";
  6.                 $rs = $this->app->db->Execute($sql);
  7.                 if($rs){
  8.                         if(!$rs->EOF){
  9.                                 $this->app->saveLog("{$ZT}找到{$PNO}!");
  10.                                 $data["bom"]=$rs->GetRows();
  11.                                 //
  12.                                 $sql="select t1.CB005 元件,t2.MB004 替代料,t2.MB002 主件品号,t1.CB021 位号 from {$ZT}.dbo.BOMCB t1,{$ZT}.dbo.BOMMB t2 where t1.CB005=t2.MB001 and t1.CB001 = '{$PNO}' and t2.MB002 in ('{$PNO}')";
  13.                                 $rss = $this->app->db->Execute($sql);
  14.                                 $data["replace"]=$rss->GetRows();
  15.                                 //
  16.                                 $sql="select t1.CB005 元件,t2.MB004 替代料,t2.MB002 主件品号,t1.CB021 位号 from {$ZT}.dbo.BOMCB t1,{$ZT}.dbo.BOMMB t2 where t1.CB005=t2.MB001 and t1.CB001 = '{$PNO}' and t2.MB002 in ('********************')";
  17.                                 $rsss = $this->app->db->Execute($sql);
  18.                                 $data["common"]=$rsss->GetRows();
  19.                         } else {
  20.                                 $this->app->saveLog("{$ZT}没有{$PNO}!");
  21.                         }
  22.                 } else {
  23.                         $this->app->saveLog($db->errorMsg());
  24.                 }
  25.                 return $data;               
  26.         }
复制代码

      
  1. function getBOMInfo($PNO){
  2.                 $data=array();
  3.                 $ZT="DGSC";
  4.                 $data=$this->getBOMinfo_bydb($PNO,$ZT);
  5.                 if(empty($data)){
  6.                         $this->app->saveLog("{$ZT}未找到{$PNO}!");
  7.                         $ZT="AHXC";
  8.                         $data=$this->getBOMinfo_bydb($PNO,$ZT);
  9.                 }
  10.                 if(empty($data)){
  11.                         $this->app->saveLog("{$ZT}未找到{$PNO}!");
  12.                         $ZT="XCLK";
  13.                         $data=$this->getBOMinfo_bydb($PNO,$ZT);
  14.                 }
  15.                 if(empty($data)){
  16.                         $this->app->saveLog("{$ZT}未找到{$PNO}!");
  17.                 }
  18.                 return $data;
  19.         }
复制代码

        
        function index(){
                $data=$this->getBOMInfo("8HC011CMM80");
                if(!empty($data)){
                        $this->app->jsdata["res"]="OK";
                        $this->app->jsdata["data"]=$data;
                } else {
                        $this->app->jsdata["res"]="FAIL";
                        $this->app->jsdata["msg"]="ERP中没有BOM";
                }
        }
        
      
  1. /*
  2.          * 确保与ERP是同步的数据
  3.          * [url]http://192.168.100.18/mesapi/index.php/erp/bom/checkbom/8HC011CMM80[/url]                (在ERP中检查最新的BOM)
  4.          * [url]http://192.168.100.18/mesapi/index.php/erp/bom/checkbom/8HC011CMM80/save[/url]         (将ERP中的BOM保存到MES)
  5.           */
  6.         function checkbom(){
  7.                 //http://192.168.100.18/mesapi/index.php/erp/bom/checkbom/8HC011CMM80/save
  8.                 //$segment :  Array\n(\n    [0] => erp\n    [1] => bom\n    [2] => checkbom\n    [3] => 8HC011CMM80\n    [4] => save \n)\n"
  9.                 //$uri : "erp\/bom\/checkbom\/8HC011CMM80\/save\/"
  10.                 global $segment;
  11.                 $pno="";
  12.                 $bSave=true;  //false to true
  13.                 //1. 参数处理
  14.                 if(count($segment)<4){
  15.                         $this->app->FAIL("没有传机种名称!");
  16.                         return;
  17.                 } else {
  18.                         $pno=$segment[3];
  19.                         if(count($segment)>4){
  20.                                 if($segment[4]=="save"){
  21.                                         $bSave=true;
  22.                                 }
  23.                         }
  24.                 }
  25.                 //2. 查询ERP数据库
  26.                 $data=$this->getBOMInfo($pno);
  27.                 if(!empty($data)){
  28.                         $commom=$data["common"];
  29.                         $data["common"]=array();
  30.                         //
  31.                         $sss=json_encode($data,JSON_UNESCAPED_UNICODE);
  32.                         $ccc=json_encode($commom,JSON_UNESCAPED_UNICODE);
  33.                         $sssmd5=md5($sss);
  34.                         $cccmd5=md5($ccc);
  35.                         $this->app->saveLog($sssmd5);
  36.                         if($this->app->prepare_mes(false)){  //true表示用standby
  37.                                 //comm
  38.                                 if(bSave){
  39.                                         $this->savecommon($cccmd5,$commom);
  40.                                 }
  41.                                 //
  42.                                 $mysql="select count(1) from  smt.c_bom where p_no='{$pno}' and version='01' and bom_code='{$sssmd5}' limit 1";
  43.                                 $icount=$this->app->mes->getone($mysql)*1;
  44.                                 $this->app->saveLog("MES有记录{$icount}");
  45.                                 if($icount==0){
  46.                                         if($bSave){
  47.                                                 $this->savebom($pno,$sssmd5,$data);
  48.                                                 
  49.                                                 return ;
  50.                                         } else {
  51.                                                 //$this->app->jsdata["res"]="FAIL";
  52.                                                 //$this->app->jsdata["msg"]="警告:MES系统监控到ERP已修改了{$pno}机型BOM数据!";
  53.                                                 $this->app->FAIL("警告:MES系统监控到ERP已修改了{$pno}机型BOM数据!");
  54.                                                 return ;
  55.                                         }
  56.                                 } else {
  57.                                         //$this->app->jsdata["res"]="OK";  //是OK的,未变化!
  58.                                         $this->app->OK();
  59.                                         return ;
  60.                                 }
  61.                         } else{
  62.                                 //$this->app->jsdata["msg"]=$sssmd5;
  63.                         };
  64.                         
  65.                         //
  66.                 } else {
  67.                         //$this->app->jsdata["res"]="FAIL";
  68.                         //$this->app->jsdata["msg"]="ERP中没有BOM";
  69.                         $this->app->FAIL("ERP中没有机型{$pno}的BOM数据");
  70.                         return ;
  71.                 }
  72.                
  73.         }
复制代码

        
      
  1. function savecommon($md5,$data){
  2.                 //$start=$this->app->getTickCount();
  3.                 $PNO="MES_COMMON_KP";
  4.                 $mysql="select count(1) from  smt.c_bom where p_no='{$PNO}' and version='01' and bom_code='{$md5}' limit 1";
  5.                 $icount=$this->app->mes->getone($mysql)*1;               
  6.                 if($icount>0){
  7.                         return  ;//  OK
  8.                 }
  9.                 $sqls=array();
  10.                 $sqls[]="update smt.c_bom set end_time=now() where p_no='{$PNO}' and version='01'";
  11.                 $sqls[]="delete from smt.c_bom where p_no='{$PNO}' and version='01'";
  12.                 $sqls[]="insert into smt.c_bom(bom_code,p_no,version,cust_code,update_time,side,flag) values ('{$md5}','{$PNO}','01','MI01',now(),'BT',1); ";
  13.                 $sqls[]="delete from smt.c_bom_replace where BOM_CODE='{$PNO}'";
  14.                 //分析替代料
  15.                 foreach($data as $v){
  16.                         //"33080101            ","33080100            ","********************","C25,C31"
  17.                         $location=$this->getRealLoc($v[3]);
  18.                         $kp=$v[0];
  19.                         $rkp=$v[1];
  20.                         $locs=explode(",",$location);
  21.                         $icount=0;
  22.                         foreach($locs as $loc){
  23.                                 if(strlen(trim($loc))>0){
  24.                                         $sql="insert into smt.c_bom_replace(BOM_CODE,CUST_KP_NO,REPLACE_NO,LOCATION,DOWNLOADTIME,EMP) values ('{$PNO}','{$kp}','{$rkp}','{$loc}',now(),'SYANT')";
  25.                                         $sqls[]=$sql;
  26.                                         $icount=$icount+1;
  27.                                 }
  28.                         }
  29.                 }
复制代码

                //开始做事务保存  
                //$this->app->saveLog("do common sql:".print_r($sqls,true));
                if($this->app->prepare_mes(false)){
                        $this->app->mes->BeginTrans();
                        foreach($sqls as $sql){
                                $rst=$this->app->mes->Execute($sql); //
                                if($rst){
                                        //
                                }else{
                                        //$this->app->FAIL('execute error:  '.$this->app->mes->ErrorMsg()."  SQL:".$sql);
                                        $this->app->saveLog('Execute error:  '.$this->app->mes->ErrorMsg()."  SQL:".$sql);
                                        break;
                                }
                        }
                        if($rst){
                                $this->app->mes->CommitTrans();
                                $this->app->saveLog("通用替代料保存成功!");
                                //$this->app->OK("保存成功!");
                        }else{
                                $this->app->mes->RollbackTrans();   
                        }
                } else {
                        $this->app->FAIL("MES数据库连接不可用!");
                }
        }
        
      
  1. /*
  2.          * 保存BOM数据到MES中
  3.          */
  4.         function savebom($PNO,$md5,$data){
  5.                 $start=$this->app->getTickCount();
  6.                 $sqls=array();
  7.                 $sqls[]="update smt.c_bom set end_time=now() where p_no='{$PNO}' and version='01'";
  8.                 $sqls[]="delete from smt.c_bom where p_no='{$PNO}' and version='01'";
  9.                 $sqls[]="insert into smt.c_bom(bom_code,p_no,version,cust_code,update_time,side,flag) values ('{$md5}','{$PNO}','01','MI01',now(),'BT',1); ";
  10.                 $sqls[]="delete from smt.c_bom_location where bom_code='{$md5}'";
  11.                 $sqls[]="delete from smt.c_bom_kp where bom_code='{$md5}'";
  12.                 $sqls[]="delete from smt.c_bom_replace where bom_code='{$md5}'";
  13.                 //分析主料
  14.                 foreach($data["bom"] as $v){
  15.                         //$this->app->jsdata["msg"]=print_r($v,true);
  16.                         //Array([0] => 8HC011CMM80 [1] => 11508534 [2] => U4,U6,U7)
  17.                         //$location=$v[2];
  18.                         $location=$this->getRealLoc($v[2]);
  19.                         $kp=$v[1];
  20.                         $locs=explode(",",$location);
  21.                         $icount=0;
  22.                         foreach($locs as $loc){
  23.                                 if(strlen(trim($loc))>0){
  24.                                         $sql="insert into smt.c_bom_location(bom_code,cust_kp_no,location,replace_flag) values ('{$md5}','{$kp}','{$loc}',1)";
  25.                                         $sqls[]=$sql;
  26.                                         $icount=$icount+1;
  27.                                 }
  28.                         }
  29.                         $sqls[]="insert into smt.c_bom_kp(bom_code,cust_kp_no,kp_desc,std_qty)
  30.                                 values ('{$md5}','{$kp}','{$kp}','{$icount}')";
  31.                 }
  32.                 //分析替代料
  33.                 foreach($data["replace"] as $v){
  34.                         //t1.CB005 元件,t2.MB004 替代料,t2.MB002 主件品号,t1.CB021 位号
  35.                         //$location=$v[3];
  36.                         $location=$this->getRealLoc($v[3]);
  37.                         $kp=$v[0];
  38.                         $rkp=$v[1];
  39.                         $locs=explode(",",$location);
  40.                         $icount=0;
  41.                         foreach($locs as $loc){
  42.                                 if(strlen(trim($loc))>0){
  43.                                         $sql="insert into smt.c_bom_replace(BOM_CODE,CUST_KP_NO,REPLACE_NO,LOCATION,DOWNLOADTIME,EMP) values ('{$md5}','{$kp}','{$rkp}','{$loc}',now(),'SYANT')";
  44.                                         $sqls[]=$sql;
  45.                                         $icount=$icount+1;
  46.                                 }
  47.                         }
  48.                 }
  49.                 //开始做事务保存  
  50.                 if($this->app->prepare_mes(false)){
  51.                         $this->app->mes->BeginTrans();
  52.                         foreach($sqls as $sql){
  53.                                 $rst=$this->app->mes->Execute($sql); //
  54.                                 if($rst){
  55.                                         //
  56.                                 }else{
  57.                                         $this->app->FAIL('execute error:  '.$this->app->mes->ErrorMsg()."  SQL:".$sql);
  58.                                         break;
  59.                                 }
  60.                         }
  61.                         if($rst){
  62.                                 $this->app->mes->CommitTrans();
  63.                                 $this->app->OK("保存成功!");
  64.                         }else{
  65.                                 $this->app->mes->RollbackTrans();   
  66.                         }
  67.                 } else {
  68.                         $this->app->FAIL("MES数据库连接不可用!");
  69.                 }
  70.         }
复制代码

        
}
?>

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 03:51 , Processed in 0.036114 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表