Wie kann ich diesen Code verarbeiten?

Identität

Erfahrenes Mitglied
Hey,

ich habe durch eine API folgenden Code erhalten, leider weiß ich nicht, was das für eine Sprache ist bzw. wie ich damit arbeiten kann. Könnt ihr mir die Funktionen von PHP nennen, mit denen ich diesen Code zerflücken kann, das heißt, dass ich auslesen kann, wie viel Geld offen ist? CurrentMonth -> Open

Ich bin gerade etwas Hilflos...
PHP:
stdClass Object 
( 
    [CurrentMonth] => stdClass Object 
        ( 
            [Open] => 0.00 
            [Confirmed] => 0.00 
            [Cancelled] => 0.00 
        ) 
 
    [PreviousMonths] => stdClass Object 
        ( 
            [Open] => 0.00 
            [Confirmed] => 0.00 
            [Cancelled] => 0.00 
        ) 
 
    [Payments] => stdClass Object 
        ( 
            [LastPayment] => 0001-01-01T00:00:00 
            [TotalPayment] => 0.00 
        ) 
 
    [Partnerships] => stdClass Object 
        ( 
            [PartnershipsActive] => 0 
            [PartnershipsWaiting] => 0 
        ) 
 
    [InboxMessages] => stdClass Object 
        ( 
            [UnreadMessages] => 0 
            [PartnershipStatusMessages] => 0 
            [ChangedCommissionRates] => 0 
            [Total] => 0 
        ) 
 
)
 
Zuletzt bearbeitet:
Dieses Object ist etwa wie folgt aufgebaut
PHP:
$test = new stdClass();
$test->CurrentMonth = new stdClass();
$test->CurrentMonth->Open = '0.00';
$test->CurrentMonth->Confirmed = '0.00';
$test->CurrentMonth->Cancelled = '0.00';

$test->PreviousMonths = new stdClass();
$test->PreviousMonths->Open = '0.00';
$test->PreviousMonths->Confirmed = '0.00';
$test->PreviousMonths->Cancelled = '0.00';

///etc...

print_r($test);

Zugreiffen kannst du über die verschachtelten Parameters der Objekte
PHP:
echo $test->CurrentMonth->Open;
 
Vielleicht sollte ich mir in PHP erst Objektorintierte Programmierung aneignen...

Also das ist das Erzeugerscript, welches dann soetwas wie oben ausgibt:

Code:
<?php

define ("WSDL_LOGON", "xxxxx");
define ("WSDL_STATS",  "xxxxx");

$Username   = 'xxxxx'; // the publisher ID
$Password   = 'xxxxx'; // the publisher web services password

$SOAP_LOGON = new SoapClient(WSDL_LOGON);
$Token      = $SOAP_LOGON->Logon(array(
             'Username'  => $Username,
             'Password'  => $Password,
             'WebServiceType' => 'Publisher'
             ));

$StartDate  = strtotime("-12 weeks");
$EndDate    = strtotime(now);
$ProgramIds = array('0');

$params = array(
          'StartDate' => $StartDate,
          'EndDate' => $EndDate,
          'ProgramIds' => $ProgramIds,
          'ProgramTypes' => 'All',
          'SubId' => '50',
          'MaximumRecords' => '100',
          'TransactionStatus' => 'All',
          'ValuationType' => 'DateOfRegistration'
          );

$SOAP_REQUEST = new SoapClient(WSDL_STATS);
$req = $SOAP_REQUEST->GetSubIdStatistics(array(
            'CredentialToken' => $Token,
            'GetSubIdStatisticsRequestMessage' => $params
            ));

print_r($req);
?>
Was ich nun aber nicht verstehe ist, warum gibt es einfach nur das obige Ergebnis aus? Wie kann ich damit denn nun weiterarbeiten? Muss ich das per Include in mein PHP Script setzen und kann ich dann einfach die Sachen ausgeben wie yaslaw es schrieb?
PHP:
              echo $test->CurrentMonth->Open;


Also ich bin mächtig verwirrt, ich bin über jede Hilfe dankbar.
 
Die Ausgabe kommt nur durch das print_r. Du kannst jederzeit in diesem Skript auf die Daten zugreifen
PHP:
$req->CurrentMonth->Open

Oder hab ich die Frage falsch verstanden
 
Herrlich, das funktioniert und mein Script läuft fast wie gewünscht.

Ich habe jetzt einen Array-Index und (0,1,2,3,4) und möchte von Array 0-4 einzelne Eigenschaften ausgeben lassen. (Dafür nehme ich eine Schleife)

Kurze Erläuterung:
$zahl ... Zählt die vorhanden Arrays (In diesem Fall 5)
Es folgt die Schleife, diese soll jetzt also 5 mal durchlaufen und von jedem Array das Datum ausgeben. In diesem Code wird jetzt nur 5x das Datum von Array 2 ausgegeben. Das Problem ist nämlich bei print_r: SubIdStatisticsRecord[2]. Die 2 muss ich austauschen, aber eine Variable ($zahl) kann ich da ja nicht verwenden. Eine Idee?
PHP:
$zahl = count ($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord);
 for($count = 0; $count <= $zahl; $count++)
  {
    print_r($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord[2]->Date);
  }
 
PHP:
$zahl = count ($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord);
 for($count = 0; $count <= $zahl; $count++)
{
    print_r($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord[$count]->Date);
}
Dafür ist der Schleifenzähler ja da :)

mfg
 
Da hat sich allerdings ein kleiner Fehler eingeschlichen ;) Die Schleifenbedingung muss auf kleiner (<) zutreffen, nicht auf kleiner gleich (<=).
Erklärung:
PHP:
$array = array(0, 1, 2, 3, 4); //array mit den Zahlen von 0-4
$count = count($array); //es stehen 5 Zahlen im array
for( $i = 0; $i <= $count; $i++){ //ACHTUNG: FALSCH, die Schleife läuft jetzt von 0-5 durch, also 6 mal, wie haben aber nur 5 Werte im Array stehen.
  echo $array[$i];
}

//Richtig
for( $i = 0; $i < $count; $i++ ){
}
 
@aGeNET
Deinen Vorschlag mit count habe ich übernommen. Vielen Dank dafür. :)

@timestamp
Korrekt, vielen Dank für deinen Hinweis. :)

So, bin fast am Ziel, aber es kommt wieder ein Fehler den ich nicht nachvollziehen kann, es ist zum verrükt werden. Ich habe das Script nun in eine Schleife eingebaut, diese soll alle ID's der User auslesen und für jeden User einmal das Script von oben durchlaufen lassen, damit ich die Daten durch die API für jeden User bekomme. Das komische ist, bei den ID's 100-122 kommt kein Fehler, bei 123 bricht er auf einmal ab und schmeißt eine Fehlermeldung:
Fatal error: Cannot use object of type stdClass as array in /var/www/web82/html/content/verwalten.php on line 49

Kann mir jemand anhand der Fehlermeldung erklären, was ich falsch mache? Ich hoffe, dann muss ich hier auch nicht weiter nerven.
PHP:
<?php
$sql = "SELECT id FROM user WHERE id = 123";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
             define ("WSDL_LOGON", "xxxxxx");
             define ("WSDL_STATS",  "xxxxxx");

             $Username   = 'xxxxxx'; // the publisher ID
             $Password   = 'xxxxxx'; // the publisher web services password

             $SOAP_LOGON = new SoapClient(WSDL_LOGON);
             $Token      = $SOAP_LOGON->Logon(array(
                          'Username'  => $Username,
                          'Password'  => $Password,
                          'WebServiceType' => 'Publisher'
                          ));

             $StartDate  = strtotime("-4 weeks");
             $EndDate    = strtotime(now);
             $ProgramIds = 'All';
             $useridd = $row['id'];
             $params = array(
                       'StartDate' => $StartDate,
                       'EndDate' => $EndDate,
                       'ProgramIds' => $ProgramIds,
                       'ProgramTypes' => 'All',
                       'SubId' => '123',
                       'MaximumRecords' => '500',
                       'TransactionStatus' => 'All',
                       'ValuationType' => 'DateOfRegistration'
                       );

             $SOAP_REQUEST = new SoapClient(WSDL_STATS);
             $req = $SOAP_REQUEST->GetSubIdStatistics(array(
                         'CredentialToken' => $Token,
                         'GetSubIdStatisticsRequestMessage' => $params
                         ));
    
    $zahl = count ($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord);

    if($zahl < 1){
        echo 'Kein Angebot wahrgenommen.';
    }
    else{
         for($count = 0; $count < $zahl; $count++)
          {
            print_r($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord[$count]->ProgramTitle);
            echo '<br>';
          }  
    }
}
?>
 
Ne Sache zu for und dem count:

Könnte man da nicht einfach foreach nehmen (wenn man eh alle haben will)?
PHP:
 foreach($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord as $record)
  {
    print_r($record->Date);
  }
und zum Fehler:
PHP:
//anstatt
print_r($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord[$count]->ProgramTitle);
//versuchen?
print_r($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord[$count]['ProgramTitle']);
bzw zusammengelegt:
PHP:
 foreach($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord as $record)
  {
    print_r($record['ProgramTitle']);
  }
mfg chmee
 
@chmee
Macht wohl mehr Sinn, habe deinen Vorschlag übernommen. Danke für deine Hilfe!

Das Problem taucht weiterhin auf, mit oben genannter Fehlermeldung:
Fatal error: Cannot use object of type stdClass as array in /var/www/web82/html/content/verwalten.php on line 49


Ich habe gestern Abend viel ausprobiert und habe herausgefunden, wenn ich die Zeile vor der foreach-Schleife entferne:
PHP:
$zahl = count ($req->SubIdStatisticsRecords->Records->SubIdStatisticsRecord);
Taucht kein Fehler mehr auf (ist ja klar, da er dann bei jedem User die foreach-Schleife nicht ausführt sondern einfach "Kein Angebot wahrgenommen" ausgibt). Also wird es wohl an der Variable $zahl liegen, habe ich dort etwas falsch gemacht?

Vielleicht hilft euch das noch weiter, das Anfangsscript, welches die Ergebnisse alle vernünftig ausgibt. (Mein erweitertes Script, soll die einzelnen Eigenschaften von jedem User auslesen und daraus dann Datenbankeinträge machen)

Das Script
PHP:
<?php

define ("WSDL_LOGON", "XXXXX");
define ("WSDL_STATS",  "XXXXX");

$Username   = 'XXXXX'; // the publisher ID
$Password   = 'XXXXX'; // the publisher web services password

$SOAP_LOGON = new SoapClient(WSDL_LOGON);
$Token      = $SOAP_LOGON->Logon(array(
             'Username'  => $Username,
             'Password'  => $Password,
             'WebServiceType' => 'Publisher'
             ));

$StartDate  = strtotime("-8 weeks");
$EndDate    = strtotime(now);
$ProgramIds = array('0');

$params = array(
          'StartDate' => $StartDate,
          'EndDate' => $EndDate,
          'ProgramIds' => $ProgramIds,
          'ProgramTypes' => 'All',
          'SubId' => '',
          'MaximumRecords' => '100',
          'TransactionStatus' => 'All',
          'ValuationType' => 'DateOfRegistration'
          );

$SOAP_REQUEST = new SoapClient(WSDL_STATS);
$req = $SOAP_REQUEST->GetSubIdStatistics(array(
            'CredentialToken' => $Token,
            'GetSubIdStatisticsRequestMessage' => $params
            ));

print_r($req);

?>
Die Ausgabe
Code:
stdClass Object
(
    [SubIdStatisticsRecords] => stdClass Object
        (
            [TotalPrice] => 0.00
            [TotalPayment] => 0.00
            [Records] => stdClass Object
                (
                    [SubIdStatisticsRecord] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [Date] => 2010-05-30T20:29:24
                                    [Number] => 111502864
                                    [SubId] => 50
                                    [ProgramId] => 1200
                                    [ProgramTitle] => XXXX
                                    [Transaction] => L 
                                    [Price] => 0.00
                                    [CheckDate] => 2010-06-02T00:00:00
                                    [TransactionStatus] => Confirmed
                                )

                            [1] => stdClass Object
                                (
                                    [Date] => 2010-06-03T05:46:34
                                    [Number] => 112124884
                                    [SubId] => 50
                                    [ProgramId] => 1200
                                    [ProgramTitle] => XXXX
                                    [Transaction] => L 
                                    [Price] => 0.00
                                    [CheckDate] => 2010-06-15T00:00:00
                                    [TransactionStatus] => Confirmed
                                )

                            [2] => stdClass Object
                                (
                                    [Date] => 2010-06-08T21:45:25
                                    [Number] => 112347569
                                    [SubId] => 50
                                    [ProgramId] => 1200
                                    [ProgramTitle] => XXXX
                                    [Transaction] => L 
                                    [Price] => 0.00
                                    [CheckDate] => 2010-06-15T00:00:00
                                    [TransactionStatus] => Confirmed
                                )

                        )

                )

        )

)
 
Zurück