我度过了一段艰难的时光,花了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}
答案 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);