PEAR-Forum.de Übersicht Thema anzeigen - SOAP Abfrage von Artikelmengen unseres Lieferanten

SOAP Abfrage von Artikelmengen unseres Lieferanten

Gehe zu Seite 1, 2  Weiter
 

PEAR-Forum.de Übersicht » Web Services
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag27.08.2007 16:06    SOAP Abfrage von Artikelmengen unseres Lieferanten Antworten mit Zitat

Hallo Gemeinde,

bin ganz neu mit Pear und Soap, hab jetzt PEAR auf dem Webserver installiert und das SOAP package dazu.

Unser Lieferant hat uns folgendes Script zur direkten Übertragung der Lagermenge gegeben:

Code:
<?php
require_once "SOAP/Client.php";

$soap = new SOAP_Client("http:// .... steinigke.php");

$parameter = array("article" => "51838400", "auth_id" => " .. Unsere Auth Id .. ");

$result = $soap->call("getStockInfo", $parameter, "urn:soapservice");

if (strtolower(get_class($result)) == "soap_fault") {

   print "FEHLER: " . $result->message;

} else {
   
   print_r($result);

}
?>


Das Problem ist, das er nur das richtige ausgibt, wenn das Script auch genau im Ordner PEAR/PEAR auf dem Webserver liegt. Wenn es - wie eigentlich gedacht - extern abgerufen wird, funktioniert es nicht und es kommt diese Fehlermeldung:

Code:
Fatal error: main() [function.require]: Failed opening required 'SOAP/Client.php' (include_path='.:/usr/local/lib/php') in /homepages/45/d76979324/htdocs/soaptest.php on line 2


Kann ich da irgendwie der Zeile require_once einen kompletten pfad zuweisen oder so damit ich das Script extern unter unsere Artikel setzen kann und damit die Lagermengen abgerufen werden?

Auch ist die Ausgabe vom Browser beim Abfragen des Scriptes nicht wie gewünscht, sondern sieht folgendermaßen aus:

Code:
stdClass Object ( [current_stock] => 6 [time] => 0 )


Das möchte ich auch noch geändert haben in "Noch [current_stock] Artikel vorrätig" oder so ähnlich. Kann ich diesen Ausgabewert erzwingen oder liegt das an dem Script unseres Herstellers und er muss das anpassen?


So das wars erstmal, ich hoffe ihr könnt mir weiterhelfen, danke Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag27.08.2007 17:24     Antworten mit Zitat

Du musst den include_path einrichten, dieser muss das PEAR-Verzeichnis enthalten. Wenn du ein require_once machst, probiert PHP einfach jede Angabe im include_path durch.

http://ch2.php.net/manual/de/ini.core.php#ini.include-path

Und ja, du kannst natürlich beliebig auf die Rückgabe zugreifen, der SOAP-Aufruf gibt ein Objekt mit den Rückgabewerten als Eigenschaften zurück und in deinem Code wird einfach ein print_r auf dieses Objekt gemacht.

Du kannst das beispielsweise so machen:
PHP:
<?php
echo 'Noch ' $result->current_stock ' Artikel vorrätig';
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag27.08.2007 22:43     Antworten mit Zitat

Berdir hat folgendes geschrieben:
Du musst den include_path einrichten, dieser muss das PEAR-Verzeichnis enthalten. Wenn du ein require_once machst, probiert PHP einfach jede Angabe im include_path durch.

http://ch2.php.net/manual/de/ini.core.php#ini.include-path

Und ja, du kannst natürlich beliebig auf die Rückgabe zugreifen, der SOAP-Aufruf gibt ein Objekt mit den Rückgabewerten als Eigenschaften zurück und in deinem Code wird einfach ein print_r auf dieses Objekt gemacht.

Du kannst das beispielsweise so machen:
PHP:
<?php
echo 'Noch ' $result->current_stock ' Artikel vorrätig';



also einfach wie in der manual ein .; vor den pfad setzen oder was? muss ich dann den absoluten pfad des webservers nehmen (das mit dem /htdocs/html/ etc vorne dran) oder einfach .;www. etc?

und das echo script soll ich das anstelle des print befehls nehmen oder wohin soll ich das setzen in dem script, kenne mich echt nicht gut mit php aus hab mich halt nur ein bisschen reingefressen weil ich das plugin für die firma hinbekommen will

danke für deine hilfe
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag27.08.2007 23:13     Antworten mit Zitat

Tha1nOnly hat folgendes geschrieben:

also einfach wie in der manual ein .; vor den pfad setzen oder was? muss ich dann den absoluten pfad des webservers nehmen (das mit dem /htdocs/html/ etc vorne dran) oder einfach .;www. etc?


Nein, den absoluten Pfad zu deiner PEAR-Installation dort angeben, damit die Dateien in diesem Ordner eingebunden werden können. Entweder die php.ini anpassen, oder direkt im Code, vor dem require_once..

PHP:
<?php
set_include_path
get_include_path() . PATH_SEPARATOR '/absoluter/pfad/zu/pear');


Tha1nOnly hat folgendes geschrieben:

und das echo script soll ich das anstelle des print befehls nehmen oder wohin soll ich das setzen in dem script, kenne mich echt nicht gut mit php aus hab mich halt nur ein bisschen reingefressen weil ich das plugin für die firma hinbekommen will

danke für deine hilfe


Das kommt anstelle der print_r Ausgabe, die print Zeile wird ja ausgegeben, wenn ein Fehler aufgetreten ist. Ich würde den Code aber etwas umschreiben, ist so einfacher lesbar:

PHP:
<?php
$result 
$soap->call("getStockInfo"$parameter"urn:soapservice");

// Pruefen ob ein Fehler zurückgegeben wurde
if (PEAR::isError($result)) {
    
// Ein Fehler ist aufgetreten bei der Abfrage, mit getMessage ausgeben
    
echo 'FEHLER: ' $result->getMessage();
} else {
    
// Alles in Ordnung, Anzahl Artikel ausgeben
    
echo 'Noch ' $result->current_stock ' Artikel vorrätig';
}


PS: Ich würde dir stark empfehlen, dich etwas besser einzuarbeiten, wenn du noch mehr damit machen willst. Man hat zwar in PHP schnell einige Code-Schnippsel zusammenkopiert und zum Laufen gebracht, aber man hat genau so einfach auch Sicherheitslücken eingebaut... Und bei einem Shop ist meistens Geld im Spiel, das ist eine schlechte Kombination Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 5:28     Antworten mit Zitat

super dann dank ich dir erstma soweit.

will mich auch mit php mehr auseinandersetzen, man kann ja auch nicht grad wenig damit anfangen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 9:07     Antworten mit Zitat

also muss das dann so aussehen mit dem pfad oder -->>

PHP:
<?php
<?php
set_include_path
get_include_path() . PATH_SEPARATOR '/homepages/45/d76979324/www. -- URL -- .de/PEAR');


und so würde dann das gesamte script aussehen '(übrigens danke für die extra erklärungen)

PHP:
<?php

set_include_path
get_include_path() . PATH_SEPARATOR '/homepages/45/d76979324/www. -- URL -- .de/PEAR');

require_once 
"SOAP/Client.php";

$soap = new SOAP_Client("http://  .....  steinigke.php");

$parameter = array("article" => "51838400""auth_id" => " -- AuthId -- ");

$result $soap->call("getStockInfo"$parameter"urn:soapservice");

if (
PEAR::isError($result)) {

    echo 
'FEHLER: ' $result->getMessage();

} else {
    
    echo 
'Noch ' $result->current_stock ' Artikel vorrätig';

}
?>
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag28.08.2007 9:19     Antworten mit Zitat

Der Pfad den du angibst muss dann einfach zusammen mit der Klassen-Datei den absoluten Pfad zu dieser Datei angeben. Die SOAP_Client-Klasse muss also unter diesem Pfad gefunden werden

Code:

/homepages/45/d76979324/www. -- URL -- .de/PEAR/SOAP/Client.php


Der Code sollte dann soweit ich es beurteilen kann funktionieren. Wenn du dann soweit bist, würde ich den ganzen Code noch in eine Funktion verpacken, so das du es einfach in eine bestehende Anwendung integrieren kannst.

PHP:
<?php
function getLagerStatus($artikel_id)
{
    
// Hier kommt der Code rein, einfach den Artikel-Parameter dynamisch machen...
    // ...
    
$parameter = array("article" => $artikel_id"auth_id" => " -- AuthId -- "); 

    
// ... und anstelle von echo, return verwenden...
    
return 'Noch ' $result->current_stock ' Artikel vorrätig'
    
// ...
}

// Dann kannst du einfach die Datei einbinden, in der diese Funktion ist, und so ausgeben lassen.

require_once 'lagerbestand.php';
echo 
getLagerstatus("51838400");
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 9:31     Antworten mit Zitat

ICH RAUB DIR BESTIMMT DEINEN LETZTEN NERV, BIN ABER VERDAMMT GLÜCKLICH DAS MIR JEMAND HELFEN KANN Wink

hmmm ok das ist eine gute idee und mit den letzten zwei zeilen kann ich das dann jedes mal in einer artikelbeschreibung (html) abrufen oder was? muss ich ja auch eine php schleife dann in html einbauen oder? kannst mir das auch coden?

ist mein code komplett jetzt so richtig?!?!?!?

PHP:
<?php
functions getLagerStatus
($artikel_id)

set_include_pathget_include_path() . PATH_SEPARATOR '/homepages/45/d76979324/www. -- URL -- .de/PEAR');

require_once 
"/homepages/45/d76979324/www. -- URL -- .de/PEAR/SOAP/Client.php ";

$soap = new SOAP_Client("http://service.showtechnic.de/soap/steinigke.php");

$parameter = array("article" => artikel_id"auth_id" => "hds77hd3789kk2545j8");

$result $soap->call("getStockInfo"$parameter"urn:soapservice");

if (
PEAR::isError($result)) {

    echo 
'FEHLER: ' $result->getMessage();

} else {
    
    return 
'Noch ' $result->current_stock ' Artikel vorrätig';

}
?>
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag28.08.2007 9:45     Antworten mit Zitat

Ja, das require_once musst du nur einmal machen und dann kannst du für jede gewünschte

Ich kann dir nicht sagen ob es funktioniert, das musst du einfach mal testen. Es fehlt sicher noch eine öffnende, geschweifte Klammer hinter der function ... Angabe und ich würde den Fehler auch mit return zurückgeben (das Zweite echo auch noch ersetzen.

Man kann das ganze natürlich noch beliebig ausbauen, zum Beispiel könnte man, wenn ein Fehler auftritt, diesen nicht einfach ausgeben, sondern loggen oder einen Administrator mit einer E-Mail informieren. Oder wenn du auf deinem Shop sehr viele Zugriffe hast, nicht jedesmal den Lagerstatus live abfragen, sondern temporär (z.B. 15 Minuten) lokal speichern, da sonst immer ein Aufruf auf eine externe Seite gemacht werden muss, was natürlich relativ langsam ist.

Für viele solche Sachen gibt es schon PEAR-Pakete, zum Beispiel Log oder Cache_Lite. Ich würde dir aber empfehlen, dich vorher allgemein in PHP einzuarbeiten, zum Beispiel mit einem Buch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 9:54     Antworten mit Zitat

ok ich hab aber noch n paar fragen bitte noch beantworten Wink

habe den code jetzt angepasst >>

PHP:
<?php
functions getLagerStatus
($artikel_id) {
set_include_pathget_include_path() . PATH_SEPARATOR '/homepages/45/d76979324/www. -- URL -- .de/PEAR');
require_once 
"/homepages/45/d76979324/www. -- URL -- .de/PEAR/SOAP/Client.php ";
$soap = new SOAP_Client("http:// ... /steinigke.php");
$parameter = array("article" => artikel_id"auth_id" => " -- AuthId -- ");
$result $soap->call("getStockInfo"$parameter"urn:soapservice");
if (
PEAR::isError($result)) {
        return 
'FEHLER: ' $result->getMessage();
} else {
    return 
'Noch ' $result->current_stock ' Artikel vorrätig';
}
?>


muss ich da nicht die geschweifte klammer auch irgendwo wieder zu machen?

und abrufen kann ich das in einer html datei wie? geht das vielleicht so:

<?php
require_once 'lagerbestand.php';
echo getLagerstatus("51838400");
?>

??????????????????????????????


Zuletzt bearbeitet von Tha1nOnly am 28.08.2007 10:17, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag28.08.2007 10:00     Antworten mit Zitat

Tha1nOnly hat folgendes geschrieben:

muss ich da nicht die geschweifte klammer auch irgendwo wieder zu machen?


Ja, das musst du. Und zwar dort, wo die Funktion zuende sein soll, in deinem Fall also am Ende des Codes.

Tha1nOnly hat folgendes geschrieben:

und abrufen kann ich das in einer html datei wie? geht das vielleicht so:

<?php
require_once 'lagerbestand.php';
echo getLagerstatus("51838400");
?>


Jein. Prinzipiell ja, aber damit es funktioniert muss diese Datei auch von PHP geparsed werden, also vermutlich die Endung .php haben, bin nicht sicher ob du das so gemeint hast. Und die Funktion muss natürlich in der Datei lagerbestand.php sein, bzw. den Namen anpassen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Digital Jedi
User


Anmeldungsdatum: 18.06.2004
Beiträge: 308

Beitrag28.08.2007 10:01     Antworten mit Zitat

@Tha1nOnly: Am besten Du kaufst Dir mal ein Buch und arbeitest Dich in die Basics von PHP bzw. Programmierung im Allgemeinen ein. Sorry, wenn das etwas hart klingt, aber Dir fehlen ja sogar die Grundlagen (wie definiere ich eine Funktion usw.).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 10:06     Antworten mit Zitat

Digital Jedi hat folgendes geschrieben:
@Tha1nOnly: Am besten Du kaufst Dir mal ein Buch und arbeitest Dich in die Basics von PHP bzw. Programmierung im Allgemeinen ein. Sorry, wenn das etwas hart klingt, aber Dir fehlen ja sogar die Grundlagen (wie definiere ich eine Funktion usw.).


ja werd ich ja auch demnächst tun nur wenn ich damit jetzt erst anfange bring ich das script nicht schnell genug zum laufen (zumindest net so schnell wie es für die führungsetage der firma fertig sein sollte ....)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Tha1nOnly
Neuer User


Anmeldungsdatum: 27.08.2007
Beiträge: 14

Beitrag28.08.2007 10:09     Antworten mit Zitat

passt der code jetzt so:

PHP:
<?php
functions getLagerStatus
($artikel_id) {

set_include_pathget_include_path() . PATH_SEPARATOR '/homepages/45/d76979324/www. -- URL -- .de/PEAR');

require_once 
"/homepages/45/d76979324/www. -- URL -- .de/PEAR/SOAP/Client.php ";

$soap = new SOAP_Client("http:// .... /steinigke.php");

$parameter = array("article" => artikel_id"auth_id" => " -- AuthId -- ");

$result $soap->call("getStockInfo"$parameter"urn:soapservice");

if (
PEAR::isError($result)) {

    return 
'FEHLER: ' $result->getMessage();

} else {
    
    return 
'Noch ' $result->current_stock ' Artikel vorrätig';

}}
?>


oder ist die geschweifte klammer hinter der anderen geschweiften jetzt nicht richtig? du hast ja gemeint am ende des codes ......

also nenne ich die datei da oben dann z.b. lagerbestand.php und dann kann ich sie einfach mit

PHP:
<?php
require_once 'lagerbestand.php';
echo 
getLagerstatus("51838400");
?>


abrufen ??? oh noch ne frage zum abrufen der lagerbestand.php muss ich da auch wieder den pfad komplett angeben in dem abrufscript? also z.b.

PHP:
<?php
require_once '/homepages/45/d76979324/www. -- URL -- .de/lagerbestand.php';
echo 
getLagerstatus("51838400");
?>
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag28.08.2007 10:19     Antworten mit Zitat

Du musst den Pfad bei require_once nicht absolut angeben, dafür setzt du ja den include_path. Mein absoluter Pfad oben war bloss als Beispiel gemacht, dank der include_path Konfiguration macht das PHP dann intern. Das gleiche gilt für lagerbestand.php, wenn die Datei im gleichen Verzeichnis liegt, kannst du sie mit require_once 'lagerbestand.php' abrufen.

Die Klammer sollte so funktionieren, zur besseren Lesbarkeit würde ich sie aber auf eine eigene Zeile schreiben und der Code, der innerhalb der Funktion ist, einrücken, genau wie du es bei den Zeilen mit if/else gemacht hast.


Zuletzt bearbeitet von Berdir am 28.08.2007 10:39, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
Beiträge der letzten Zeit anzeigen:   
Diese Seite übersetzen
PEAR-Forum.de Übersicht » Web Services
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
   Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

Zu Deinen Favoriten hinzufügen

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen