Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error : "Object reference not set to an instance of an object" when calling SOAP cilent in PHP

Here is the data from wsdl

<s:element name="CreateDraftLead">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="formId" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="FirstName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="LastName" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Gender" nillable="true" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="AgeGroup" nillable="true" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="MobilePhone" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Birthday" nillable="true" type="s:dateTime"/>
<s:element minOccurs="0" maxOccurs="1" name="District" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="email" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Region" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="LocationId" nillable="true" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="LeadSourceId" nillable="true" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="CompanyId" nillable="true" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="SourceCampaignId" nillable="true" type="s:int"/>
<s:element minOccurs="1" maxOccurs="1" name="AllowEmail" nillable="true" type="s:boolean"/>
<s:element minOccurs="0" maxOccurs="1" name="Questions" type="tns:ArrayOfQuestion"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfQuestion">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Question" nillable="true" type="tns:Question"/>
</s:sequence>
</s:complexType>
<s:complexType name="Question">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Key" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Value" type="s:string"/>
</s:sequence>
</s:complexType>

And here is my attempt code

$client = new SoapClient("http://demo/demo.asmx?wsdl", array('trace' => 1, "exception" => 0));


        $data = array(
            'formId' => 1,
            'LocationId' => 1,
            'FirstName' => 'test',
            'LastName' => 'test',
            'MobilePhone' => 11111111,
            'email' => '[email protected]',
            'AllowEmail' => 0,
            'Region' => 'HK',
            'LeadSourceId' => 11,
            'Questions' => array(
                "Question" => array("AgeGroup" => 10),
                "Question" => array("Gender" => 1),
                "Question" => array("Remarks" => 'test'),
                "Question" => array("Are you currently a member of any yoga or fitness centre?  " => 'Yes'),
            )
        );



        $result = $client->CreateDraftLead(array('parameters' => $data));

        var_dump($result);

Is this caused by the structure of the input data, how to fix that? Thanks for helping.

Error message:

Fatal error: Uncaught SoapFault exception: [soap:Server] Server was unable to process request. ---> Object reference not set to an instance of an object. in C:\xampp\htdocs\test_soap.php:60 Stack trace: #0 C:\xampp\htdocs\test_soap.php(60): SoapClient->__call('CreateDraftLead', Array) #1 C:\xampp\htdocs\test_soap.php(60): SoapClient->CreateDraftLead(Array) #2 {main} thrown in C:\xampp\htdocs\test_soap.php on line 60

Updated:

Thanks for helping. right now can send to server

<?php
$client = new SoapClient("http://demo/demo.asmx?wsdl");

$data = array(
    'formId' => '1',
    'FirstName' => 'test',
    'LastName' => 'test',
    //'Gender' => 1,
    //'AgeGroup' => 10,
    'MobilePhone' => '11111111',
    'Birthday' => null,
    'District' => 'HK',
    'email' => '[email protected]',
    'Region' => 'HK',
    'LocationId' => 1,
    'LeadSourceId' => 11,
    'CompanyId' => null,
    'SourceCampaignId' => null,
    'AllowEmail' => false,
    'Questions' => array(
        "Question" => array("AgeGroup" => 10),
        "Question" => array("Gender" => 1),
        "Question" => array("Remarks" => 'test'),
        "Question" => array("Are you currently a member of any yoga or fitness centre?  " => 'Yes'),
    )
);

$result = $client->__soapCall("CreateDraftLead", array($data));

var_dump($result);
?>

Problems remain are :

1) AllowEmail takes boolean but either 0,1,true,false return error : Invalid column name 'false' / Invalid column name 'true' from the server , but it is not exception

2) is minOccurs='1' means must provide? as tested can ignore the field and server still return success

Thanks for great effort.

like image 723
user782104 Avatar asked Apr 06 '16 08:04

user782104


1 Answers

Please try out the following (not tested):

<?php
$client = new SoapClient("http://demo/demo.asmx?wsdl", array('trace' => 1, "exception" => 0));

$data = array(
    'formId' => 1,
    'LocationId' => 1,
    'FirstName' => 'test',
    'LastName' => 'test',
    'MobilePhone' => 11111111,
    'email' => '[email protected]',
    'AllowEmail' => 0,
    'Region' => 'HK',
    'LeadSourceId' => 11,
    'Questions' => array(
        "Question" => array("AgeGroup" => 10),
        "Question" => array("Gender" => 1),
        "Question" => array("Remarks" => 'test'),
        "Question" => array("Are you currently a member of any yoga or fitness centre?  " => 'Yes'),
    )
);

$result = $client->__soapCall("CreateDraftLead", array($data));

var_dump($result);

Also it seems that you do not provide all neccessary infomration like Gender and so on.. you should check this aswell.

like image 56
Michael Avatar answered Sep 20 '22 05:09

Michael