php webserviceは、クライアントがデータベースデータをサーバにコミットし、別のデータベースデータを返すことを実現する

8648 ワード

会社のニーズのため、webserviceを使用して、会社erpのサーバとクライアントの両方のデータベース交換を開発する必要があります.
すなわち,クライアントが更新したデータを生産用のサーバ側にアップロードするたびに,サーバ側が更新したばかりのデータを返す.(サーバ側では更新データを実行するスクリプトがあります)
php言語を使用しているため、現在のネットワーク上でアップロードの問題を解決しているのはjavaとCです.シロの私は勉強の過程でたくさんの苦労をしました.
socketを使用してファイルをアップロードしようとすることも含まれています.fsockpen GET/POSTを使用してフォームとそのアップロードファイルをコミットすることもできます.
この2つはphpしかできない私にとって実行可能性がありますが、ボスは私にできるだけwebserviceを使うように要求したので、最後にwebserviceに復帰し、soapの伝送特性を使ってこの小さなプロジェクトを完成することにしました.
Webserviceでは、最初はサーバに認証機能を追加します.つまり、クライアントがサーバに接続するには、対応するアカウントパスワードを事前に構成しなければなりません.そうしないと、サーバはクライアントがそれを使用することを拒否します.
認証:
SoapHeader-SoapHeaderクラス
  • SoapHeader::__ construct-SoapHeaderコンストラクション関数
  • SoapHeader::SoapHeader-SoapHeaderコンストラクション関数
  • 認証についてはあまり言わないが、私の前のブログでは、ネット上にも多くの関連記事があると言った.
    そのため、クライアントはこの過程でアカウントを提出し、パスワードをサーバーに送信します.検証結果に基づいて値を返します.
    では、これを通じて、クライアントが取得したデータを、アカウントのパスワードを転送するときについで渡すことができます.
    SoapVar-SoapVarクラス
  • SoapVar::__構築-SoapVar構築関数
  • SoapVar::SoapVar-SoapVarコンストラクション関数
  • ここではsoapvarを使用して、必要なサーバに転送するデータをカプセル化します.具体的には関連資料を調べることができる.
    サーバーが文字列だけを受信するように試したので、ここでは配列を文字列に変換し、サーバーに着いたときに配列に変換することを採用しています.
    実はsoapvarがデータ型を定義するときに配列形式を定義できるかどうか分からないので、次回最適化するときに振り返ってみましょう.
    上コード、serverサーバ側のsoapservice_local.php
    item[0]->value;  
            //$pwd =$value->item[1]->value;  
        if($value->username == 'admin'&& $value ->password=='123456') 
        {  
          $this->Authenticated = true;                    
        } 
        else 
        {  
          $this->Authenticated = FALSE;      
        }
    
        if ($this->Authenticated) 
        {
            $aaa=$value->clientsoap;
            $array_client = explode('##',$aaa); 
    
            for($index=0;$index"; 
            } 
                $mysql=@mysql_connect("localhost","weberp","erp.shai3c.com");
                if (!$mysql)
                {
                  die('Could not connect: ' . mysql_error());
                }
                //$get_now=$array_client[17];
                $mysql_database="weberp";
                $aa=mysql_query("set names utf8;");
                $mysql_database=mysql_select_db($mysql_database); 
                $sql="update prices set startdate='".$array_client[12]."',
                                        enddate='".$array_client[14]."',
                                        updatedate='".$array_client[16]."',
                                        operator='".$array_client[18]."',
                                        storelink='".$array_client[22]."', 
                                        competitorid='".$array_client[24]."', 
                                        price='".$array_client[26]."', 
                                        sales='".$array_client[28]."', 
                                        store_sales='".$array_client[30]."', 
                                        state='".$array_client[32]."', 
                                        store_state='".$array_client[34]."', 
                                        getpricedate='".$array_client[36]."', 
                                        storedate='".$array_client[38]."'
                                         
                                    where stockid='".$array_client[0]."' 
                                    and typeabbrev='".$array_client[2]."'";
    
                $result = mysql_query($sql,$mysql);
    
    
                //            ,    
                if ($array_client[16]=='2017-08-05') 
                {            
                    $this->posted = TRUE; 
                }
                else 
                {  
                  $this->posted = FALSE;      
                }
        }
        
        } 
    
        //          
        function feline()
        {      
          if($this->Authenticated)
          	{
    
    
            $mysql=@mysql_connect("localhost","root","");
            if (!$mysql)
            {
              die('Could not connect: ' . mysql_error());
            }
            $get_now=date('2017-05-09');
            $mysql_database="weberp";
            $aa=mysql_query("set names utf8;");
            $mysql_database=mysql_select_db($mysql_database); 
            $sql="select * from prices where updatedate='".$get_now."' limit 5";
            //      id   。
    
            $result = mysql_query($sql,$mysql);
            //                  
            while($row = mysql_fetch_array($result)) 
            { 
            //var_dump($row);
                $array[]=$row;        
            }
            //var_dump($array[0]['getpricedate']);
            return $array;
            } 
    
             else 
            {  
             return '    ,   ';      
            }  
    
        }
        function postval()
        {
        if ($this->posted) 
        {
            return "     ";
        }
            elseif($this->posted='FALSE'){ return "      ";}  
        }
    
        //     ,          
      
    }
    
     $options = array('uri'=>'XXXXXXXXX/');
     $server = new SoapServer(NULL,$options);
    
     try {
        //$server->setClass('MySoapServer');
        $server->setClass('mysoapclass'); 
        //$server->addFunction("add_number");
        $server->handle();
     } catch(SoapFault $fault) {
        echo 'SoapFault:'.$fault->faultstring;
     }
     //var_dump($server);
    ?>

    以上のコードの役割は、サーバ側がクライアントから送信されたデータを受信した後、アカウントパスワードがadmin,123456であるかどうかを検証してから、文字列データの解析を実行することである.
    次に、サーバのデータベースに更新します.
    次のセクションは、サーバ・データベースからいくつかのデータを取得し、クライアントクライアントに返信します.データのコミットに成功した値、すなわち「取得済データ」を返します.
    もちろん、アカウントのパスワードが間違っている場合は.失敗した値が返されます.
    次にクライアントです.soapClient_local.php
    //           ,       。
    class authentication_header 
    {  
         var $username;  
         var $password; 
         var $clientsoap; 
    
         public function __construct($username, $password,$clientsoap) 
        {  
         $this->username = $username;  
         $this->password = $password;  
         $this->clientsoap = $clientsoap;  
    
        } 
    
    }
    
    
     $options = array(
            'location'=>'XXXXXXXXX/soapService_local.php',
            'uri'=>'XXXXXXXXX/
    '
            );
     $client = new SoapClient(NULL,$options);
    
     try {
        //            ,         ,   service 。
            $mysql=@mysql_connect("localhost","root","");
                    if (!$mysql)
                    {
                      die('Could not connect: ' . mysql_error());
                    }
                    $mysql_database="weberp";
                    $aa=mysql_query("set names utf8;");
                    $mysql_database=mysql_select_db($mysql_database); 
            $post_sql="select * from prices where updatedate='2017-08-05' limit 1";
            $post_result=mysql_query($post_sql,$mysql);
            while($post_row=mysql_fetch_array($post_result))
            {
                $array[]=$post_row;
            }
    
             //var_dump($array[0]);
            //               ,          。
            $clientsoap=implode("##",$array[0]);
            //var_dump($clientsoap);
             //                    。
         	  $auth = new authentication_header('admin', '123456',$clientsoap);
         	  $authvalues = new SoapVar($auth, SOAP_ENC_OBJECT, 'authenticate','XXXXXXXXX/
    '); 
            $header = new SoapHeader('XXXXXXXXX/', 'authenticate', $authvalues,true); 
    
         	 $re=$client->__setSoapHeaders(array($header));
             //$message = $client->get_message();
            $result =$client->__soapCall('feline',array());      
            $postval =$client->__soapCall('postval',array());      
            var_dump($postval);
            var_dump($result);     
        }
    
    
    
    
     	 
     catch(SoapFault $fault) {
        var_dump($fault);
     }
    ?>

    以上のクライアントの機能は,データベース内で得られた配列形式のデータを取得し,アカウントパスワードとともにパッケージ化し,サーバに送信することである.
    これに対して、基礎的なフレームワークがあり、残りはこの上でさらに整備され、安全性に大きな問題があるはずですが、小さな会社用のerpにとっては、しばらくは使えます.
    ありがとう