Export (0) Print
Expand All

Get Estimated Position By Bid in PHP

The following example shows how to get the estimated position in the search results if the specified keywords use the specified bid value using the Ad Intelligence GetEstimatedPositionByKeywordIds service operation.

This example has been developed and run within the environment described in Getting Started Using PHP with Bing Ads Services.

To download the PHP classes included in the sample, see PHP Production Classes for Bing Ads API.

System_CLiX_note Note

This example uses the UserName and Password elements for authentication. For Managing User Authentication with OAuth, replace the UserName and Password elements with the AuthenticationToken, which is your OAuth access token.

<?php

// You must pass credentials and the URL of the Ad Intelligence WSDL.

// Command line usage:
// php.exe GetEstimatedPosition username password devToken accountId wsdl
// 

// Disable WSDL caching.

ini_set("soap.wsdl_cache_enabled", "0");
ini_set("soap.wsdl_cache_ttl", "0");

// Define the proxy class for the Ad Intelligence service.

Class ClientProxy
{
    private $username;
    private $password;
    private $developerToken;
    private $wsdlUrl;
    private $accountId;
    private $service;
    private $namespace;

    public function __construct($username, $password, $token, $accountId, $wsdl)
    {
        $this->username = $username;
        $this->password = $password;
        $this->developerToken = $token;
        $this->accountId = $accountId;
        $this->wsdlUrl = $wsdl;
        $this->service = $this->GetProxy($wsdl);
    }

    public function GetAccountId() { return $this->accountId; }
    public function GetService() { return $this->service; }
    public function GetNamespace() { return $this->namespace; }

    // This function gets the namespace from the WSDL, so you do
    // not have to hardcode it in the client.

    private function GetNamespaceForService($url)
    {
        $doc = new DOMDocument;
        $doc->Load($url);

        $xpath = new DOMXPath($doc);
        $query = "/*/@targetNamespace";

        $attrs = $xpath->query($query);

        // The query will return only one node in the node list.

        foreach($attrs as $attr)
        {
            $namespace = $attr->value;
        }

        return $namespace;
    }

    private function GetProxy($wsdl)
    {
        $this->namespace = $this->GetNamespaceForService($wsdl);

        // Define the SOAP headers.

        $headers = array();

        $headers[] = new SoapHeader(
            $this->namespace,
            'CustomerAccountId',
            $this->accountId
            );

        $headers[] = new SoapHeader(
            $this->namespace,
            'DeveloperToken',
            $this->developerToken
            );

        $headers[] = new SoapHeader(
            $this->namespace,
            'UserName',
            $this->username
            );

        $headers[] = new SoapHeader(
            $this->namespace,
            'Password',
            $this->password
            );

        // By default, PHP does not return single item arrays as an array type.
        // To force PHP to always return an array for an array type in the
        // response, specify the SOAP_SINGLE_ELEMENT_ARRAYS feature.

        $options = array(
            'trace' => TRUE,
            'exceptions' => TRUE,
            'features' => SOAP_SINGLE_ELEMENT_ARRAYS
            );

        $proxy = new SOAPClient($this->wsdlUrl, $options);

        $proxy->__setSoapHeaders($headers);

        return $proxy;
    }
}

// Define the request class.

final class GetEstimatedPositionByKeywordIdsRequest
{
    public $KeywordIds;
    public $MaxBid;
}

try
{
    // See Usage for argument values.

    $proxy = new ClientProxy($argv[1], $argv[2], $argv[3], $argv[4], $argv[5]);

    // Specify the request information.

    $request = new GetEstimatedPositionByKeywordIdsRequest();
    $request->KeywordIds = array ( <keywordidgoeshere>, <keywordidgoeshere> );
    $request->MaxBid = 0.47;

    $response = $proxy->GetService()->GetEstimatedPositionByKeywordIds($request);

    // Print the estimated position in the results for each match type bid.

    foreach ($response->KeywordEstimatedPositions->KeywordIdEstimatedPosition as $position)
    {
        printf("%s (%s)\n",
                $position->KeywordId,
                $position->KeywordEstimatedPosition->Keyword);

        if (empty($position->KeywordEstimatedPosition->EstimatedPositions->EstimatedPositionAndTraffic))
        {
            print "  There is no position information available for the keyword.\n\n";
        }
        else
        {
            foreach ($position->KeywordEstimatedPosition->EstimatedPositions->EstimatedPositionAndTraffic as $kpi)
            {
                printf("  %s\n", $kpi->MatchType);
                printf("    Estimated ad position: %s\n", $kpi->EstimatedAdPosition);
                printf("    Average CPC: %.2f\n", $kpi->AverageCPC);
                printf("    CTR: %.2f\n", $kpi->CTR);
                printf("    Estimated clicks per week: %s to %s\n",
                    number_format($kpi->MinClicksPerWeek, 0),
                    number_format($kpi->MaxClicksPerWeek, 0));
                printf("    Estimated impressions per week: %s to %s\n",
                    number_format($kpi->MinImpressionsPerWeek, 0),
                    number_format($kpi->MaxImpressionsPerWeek, 0));
                printf("    Estimated cost per week: %.2f to %.2f\n",
                    $kpi->MinTotalCostPerWeek,
                    $kpi->MaxTotalCostPerWeek);

                print "\n";
            }
        }
    }
}
catch (SoapFault $e)
{
    print "GetEstimatedPositionByKeywordIds failed.\n";

    if (isset($e->detail->ApiFaultDetail))
    {
        print "ApiFaultDetail exception encountered\n";
        print "Tracking ID: ".$e->detail->ApiFaultDetail->TrackingId."\n";

        // Process any operation errors.

        if (!empty($e->detail->ApiFaultDetail->OperationErrors))
        {
            $errors = is_array($e->detail->ApiFaultDetail->OperationErrors->OperationError)
                    ? $e->detail->ApiFaultDetail->OperationErrors->OperationError
                    : array('OperationError' => $e->detail->ApiFaultDetail->OperationErrors->OperationError);

            foreach ($errors as $error)
            {
                switch ($error->Code)
                {
                    case 106: // UserIsNotAuthorized
                        print "The user is not authorized to call this operation.\n";
                        break;

                    case 1515: // CampaignServiceBidAmountsLessThanFloorPrice
                        print "The bid amount cannot be less than the minimum bid amount allowed for the account's currency.\n";
                        break;

                    case 1516: // CampaignServiceBidAmountsGreaterThanCeilingPrice
                        print "The bid amount cannot be greater than the maximum bid amount allowed for the account's currency.\n";
                        break;

                    case 1529: // CampaignServiceKeywordIdsArrayShouldNotBeNullOrEmpty
                        print "The list of keyword IDs cannot be null or empty.\n";
                        break;

                    default:
                        printf("Error code: %s (%d)\nMessage: %s\nDetail: %s\n",
                            $error->ErrorCode, $error->Code, $error->Message, $error->Details);
                        break;
                }
            }
        }

        // Process any batch errors.

        if (!empty($e->detail->ApiFaultDetail->BatchErrors))
        {
            $errors = is_array($e->detail->ApiFaultDetail->BatchErrors->BatchError)
                    ? $e->detail->ApiFaultDetail->BatchErrors->BatchError
                    : array('BatchError' => $e->detail->ApiFaultDetail->BatchErrors->BatchError);

            foreach ($errors as $error)
            {
                print "Batch error encountered for array index ".$error->Index.".\n";
                printf("Error code: %s (%d)\nMessage: %s\nDetail: %s\n",
                    $error->ErrorCode, $error->Code, $error->Message, $error->Detail);
            }
        }
    }
    elseif (isset($e->detail->AdApiFaultDetail))
    {
        print "AdApiFaultDetail exception encountered\n";
        print "Tracking ID: ".$e->detail->AdApiFaultDetail->TrackingId ."\n";

        // Process any system errors.

        $errors = is_array($e->detail->AdApiFaultDetail->Errors->AdApiError)
                ? $e->detail->AdApiFaultDetail->Errors->AdApiError
                : array('AdApiError' => $e->detail->AdApiFaultDetail->Errors->AdApiError);

        foreach ($errors as $error)
        {
            if (105 == $error->Code) //  InvalidCredentials
            {
                print "The specified credentials are not valid or the account is inactive.\n";
            }
            else
            {
                printf("Error code: %s (%d)\nMessage: %s\nDetail: %s\n",
                    $error->ErrorCode, $error->Code, $error->Message, $error->Detail);
            }
        }
    }
    else
    {
        print $e->getCode()." ".$e->getMessage()."\n\n";

        // Output the last request/response.

        print "\nLast SOAP request/response:\n";
        print $proxy->GetService()->__getLastRequest()."\n";
        print $proxy->GetService()->__getLastResponse()."\n";
    }
}
catch (Exception $e)
{
    print $e->getCode()." ".$e->getMessage()."\n\n";
    print $e->getTraceAsString()."\n\n";
}

?>

Community Additions

Show:
© 2014 Microsoft