php salesforce新手INVALID_FIELD:实体'联系'上没有这样的列'字段'

时间:2011-03-13 07:56:41

标签: php salesforce

我度过了一段艰难的时光,花了4个小时尝试调试这个。我是PHP的新手,但没想到会有这么难。

这是代码,我正在尝试更新联系人表。我尝试upsert和更新nothign似乎工作

这是更新“代码版本。

$id = '003A000000XRVFxIAP';
 $updateFields = array (
        'Id' => $id,
        'MailingCity' => 'New York',
        'MailingState' => 'NY'
        );      

        $sObject1 = new SObject();
       //$sObject1->fields = $updateFields;
       //$sObject1->MailingCity= 'New York';
       $sObject1->type = 'Contact';
        try{
           $updateResponse = $client->update(array($sObject1),'Contact'); 
         $myID = $updateResponse->id;

        }


Strict Standards: Creating default object from empty value in C:\xampp\htdocs\Proj1\ForceToolkit\soapclient\SforceEnterpriseClient.php on line 89 INVALID_FIELD: No such column 'fields' on entity 'Contact'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names. Error Info  SoapFault exception: [sf:INVALID_FIELD] INVALID_FIELD: No such column 'fields' on entity 'Contact'. If you are attempting to use a custom field, be sure to append the '__c' after the custom field name. Please reference your WSDL or the describe call for the appropriate names. in C:\xampp\htdocs\Proj1\ForceToolkit\soapclient\SforceBaseClient.php:508 Stack trace: #0 C:\xampp\htdocs\Proj1\ForceToolkit\soapclient\SforceBaseClient.php(508): SoapClient->__call('update', Array) #1 C:\xampp\htdocs\Proj1\ForceToolkit\soapclient\SforceBaseClient.php(508): SoapClient->update(Object(stdClass))
#2 C:\xampp\htdocs\Proj1\ForceToolkit\soapclient\SforceEnterpriseClient.php(90): SforceBaseClient->_update(Object(stdClass))
#3 C:\xampp\htdocs\Proj1\createAccount.php(95): SforceEnterpriseClient->update(Array, 'Contact') #4 {main}

3 个答案:

答案 0 :(得分:1)

查看您的跟踪,您似乎正在使用企业客户端,我可以假设企业WSDL。这是强类型的,您应该使用特定于Salesforce组织的WSDL。如果您没有使用从您的组织下载的WSDL,则它将无法在其中定义正确的对象和字段。

我建议使用合作伙伴客户端和合作伙伴WSDL。这是松散的类型,更灵活。如果您不熟悉PHP或Web服务,那么使用起来会更容易。

以下内容应该进行更新...

$sObject1 = new stdClass();
$sObject1->type = 'Contact';
$sObject1->Id = $id;
$sObject1->fields['MailingCity'] = 'New York';
$sObject1->fields['MailingState'] = 'NY';

try
{
    $updateResponse = $client->update( array( $sObject1 ) );
}
catch( Exception $exception )
{
    // Do something
}

请注意,Id是$ sObject的属性,而不是fields数组中的值。此外,您无需在更新调用中指定“联系人”,因为您已在$ sObject的type属性中设置它。

答案 1 :(得分:1)

使用Enterprise WSDL时,请勿创建new SObject,只需创建new stdClass即可。请参阅PHP Getting Started Guide中的示例; SObject仅用于合作伙伴WSDL。

答案 2 :(得分:0)

我在使用Enterprise客户端时遇到了同样的问题。我在更新Account对象上的自定义字段时遇到了同样的问题。

我对SObject的问题是它在更新期间尝试更新名为“fields”的参数。由于Enterprise WSDL不包含该字段,我使用unset()从SObject中删除了'fields'属性。

我很欣赏这是一个hacky解决方案,但它可能对遇到此问题的其他人有用。

$sUpdateObject = new SObject();
$sUpdateObject->id = $record->Id;
$sUpdateObject->MyCustomField__c = 0;
unset($sUpdateObject->fields);

$updateResponse = $mySforceConnection->update(array($sUpdateObject), 'Account');
print_r($upsertResponse);