| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
27.08.2007 16:06 SOAP Abfrage von Artikelmengen unseres Lieferanten |
|
|
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  |
|
| Nach oben |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
27.08.2007 17:24 |
|
|
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 |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
27.08.2007 22:43 |
|
|
| 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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
27.08.2007 23:13 |
|
|
| 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  |
|
| Nach oben |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 5:28 |
|
|
super dann dank ich dir erstma soweit.
will mich auch mit php mehr auseinandersetzen, man kann ja auch nicht grad wenig damit anfangen  |
|
| Nach oben |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 9:07 |
|
|
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
28.08.2007 9:19 |
|
|
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 |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 9:31 |
|
|
ICH RAUB DIR BESTIMMT DEINEN LETZTEN NERV, BIN ABER VERDAMMT GLÜCKLICH DAS MIR JEMAND HELFEN KANN
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_path( get_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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
28.08.2007 9:45 |
|
|
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 |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 9:54 |
|
|
ok ich hab aber noch n paar fragen bitte noch beantworten
habe den code jetzt angepasst >>
| PHP: | <?php
functions getLagerStatus($artikel_id) {
set_include_path( get_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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
28.08.2007 10:00 |
|
|
| 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  |
|
| Nach oben |
|
 |
Digital Jedi User
Anmeldungsdatum: 18.06.2004 Beiträge: 308
|
28.08.2007 10:01 |
|
|
| @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 |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 10:06 |
|
|
| 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 |
|
 |
Tha1nOnly Neuer User
Anmeldungsdatum: 27.08.2007 Beiträge: 14
|
28.08.2007 10:09 |
|
|
passt der code jetzt so:
| PHP: | <?php
functions getLagerStatus($artikel_id) {
set_include_path( get_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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
28.08.2007 10:19 |
|
|
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 |
|
 |
|
|