php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.05.2006, 11:45  
Neuer Benutzer
 
Registriert seit: 12.05.2006
Beiträge: 4
andre_shd
andre_shd eine Nachricht über ICQ schicken
Standard WebService über NUSOAP gibt NULL (leeres result) zurück

Hallo phpfriend.de'ler

Ich sitze jetzt, seit mittlerweile über einer halben Woche an einem Problem von meinem WebService.
Der Service soll dazu dienen, über die Windows-COM-Api auf das WMI (WindowsManagement-Interface) zuzugreifen,
um ein umfassendes Interface für eine SystemMonitiring-Lösung zur Verfügung stellen zu können.
Die WMI-Query Funktion funktioniert tadellos. Mein Problem zurzeit is die Auswertung des WebService
mittels SOAP (ich nutze NUSOAP, aber auch mit der normalen SOAP-Extension funktioniert es nicht).
Ohne die Angabe einer WSDL-File, bekomme ich ohne Probleme meine Ergebnisse ausgeliefert, jedoch, da das ganze auch in anderen
Programmiersprachen genutzt werden soll, ist eine WSDL unerlässlich.

Das genaue Problem ist, dass ich ein Ergebnis zusammenstelle in meinem PHP-Script, welches relativ dynamisch ist.
Denn meine WMI-Query-Funktion liest soviele Felder aus, wie es als Paramter übergeben kriegt und erstellt
daraus dann ein Array. Nun kann ich dieses Array nicht genau definieren über WSDL, und ich tippe das darin auch der Fehler liegt.

edit: irgendwie Funktionieren die PHP-Tags nicht ;(

Hier mal alle meine Scripte mit Kommentierung:

PHP-Code:
<?
 
//----> Requirements
require_once('./lib/nusoap.php');
//<-----


//----> SOAP-Server

// Server initialisieren
$server = new soap_server();

// Initialisiere WSDL-Support
$server->configureWSDL('wmi''urn:wmi');

// Typen hinzufügen
$server->wsdl->addComplexType(
    
'ArrayOfString',
    
'complexType',
    
'array',
    
'',
    
'SOAP-ENC:Array',
    array(),
    array(array(
'ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]')),
    
'xsd:string'
);

$server->wsdl->addComplexType(
    
'ArrayOfArray',
    
'complexType',
    
'array',
    
'',
    
'SOAP-ENC:Array',
    array(),
    array(array(
'ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'ArrayOfString[]')),
    
'ArrayOfString'
);

// Funktion registrieren
$server->register('query_wmi',                // method name
    
array('class' => 'xsd:string','fields' => 'xsd:string','where' => 'xsd:string'),        // input parameters
    
array('return' => 'tns:ArrayOfArray'),      // output parameters
    
'urn:wmi',                      // namespace
    
'urn:wmi#query_wmi',                // soapaction
    
'rpc',                                // style
    
'encoded',                            // use
    
'querys wmi'            // documentation
);
//<----


//----> Funktion zu Abfrage des WMI

// query_wmi('Win32_Klasse', 'Feldnamen', 'Where-Clause')
function query_wmi($class$fields$where) {

     
// Credentials zum Connecten einbinden
    
include('./globals.php');
    
    
// Wbem-COM-Object erzeugen
    
$wmi = new COM('WbemScripting.SWbemLocator');    
    
    
// Verbindung zum Host herstellen
    
$sh $wmi->ConnectServer($daten['host'], 'root\cimv2'$daten['user'], $daten['password']);    
    
    
// Überprüfen ob eine Where-Definierung vorliegt
    
if($where <> '') {
        
// Mit stripslashes() die BackSlash aus der where-Clause entfernen
        
$where stripslashes($where);
        
// Abfrage-String zusammensetzen und per Eval von PHP interpretieren lassen
        
eval("\$eval_class = \"Select \$fields from \$class where \$where\";");
    } else eval(
"\$eval_class = \"Select \$fields from \$class\";");
    
    
// Query senden
    
$temp $sh->ExecQuery($eval_class);
    
    
// Fields zerlegen, falls mehrere Felder abgefragt werden sollen
    
$array_fields explode(", "$fields);
    
    
// Array-String leeren
    
$string '';

    
// Query zerlegen
    
foreach($temp as $klasse) {
        
// Interpretieren des Code-Strings
        
foreach($array_fields as $item) {
            if (
$string == '') {
                eval(
"\$string = \"'\".\$item.\"' => '\".\$klasse->\$item.\"'\";");
            } else {
                eval(
"\$string = \$string.\", \".\"'\".\$item.\"' => '\".\$klasse->\$item.\"'\";");
            }
        }
        eval(
"\$array_temp[] = array(\\$string);");
    }
    
    return 
$array_temp;
}
//<----


// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA '';
$server->service($HTTP_RAW_POST_DATA);
    
?>
PHP-Code:
<?

//----> Requirements
require_once('./lib/nusoap.php');
//<-----


//----> SOAP-Client

// Client initialisieren
$client = new soapclient('http://localhost/wmi/soap_server.php?wsdl'true);

// Check for an error
$err $client->getError();
if (
$err) {
    
// Display the error
    
echo '<h2>Constructor error</h2><pre>' $err '</pre>';
    
// At this point, you know the call that follows will fail
}
// Funktionsaufruf via SOAP
$result $client->call('query_wmi', array('class' => 'Win32_NetworkAdapterConfiguration','fields' => 'Name','where' => ''));
// Check for a fault
if ($client->fault) {
    echo 
'<h2>Fault</h2><pre>';
    
print_r($result);
    echo 
'</pre>';
} else {
    
// Check for errors
    
$err $client->getError();
    if (
$err) {
        
// Display the error
        
echo '<h2>Error</h2><pre>' $err '</pre>';
    } else {
        
// Display the result
        
echo '<h2>Result</h2><pre>';
        
print_r($result);
    echo 
'</pre>';
    }
}
//<----

// Display the request and response
echo '<h2>Request</h2>';
echo 
'<pre>' htmlspecialchars($client->requestENT_QUOTES) . '</pre>';
echo 
'<h2>Response</h2>';
echo 
'<pre>' htmlspecialchars($client->responseENT_QUOTES) . '</pre>';
// Display the debug messages
echo '<h2>Debug</h2>';
echo 
'<pre>' htmlspecialchars($client->debug_strENT_QUOTES) . '</pre>';

?>
und hier noch die WSDL-File welche mir NUSOAP automatisch erstellt.
PHP-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:tns="urn:wmi" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:wmi">
<types>
<xsd:schema targetNamespace="urn:wmi"
>
 <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
 <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
 <xsd:complexType name="ArrayOfString">
  <xsd:complexContent>
   <xsd:restriction base="SOAP-ENC:Array">
    <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[]"/>
   </xsd:restriction>

  </xsd:complexContent>
 </xsd:complexType>
 <xsd:complexType name="ArrayOfArray">
  <xsd:complexContent>
   <xsd:restriction base="SOAP-ENC:Array">
    <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="ArrayOfString[]"/>
   </xsd:restriction>
  </xsd:complexContent>
 </xsd:complexType>

</xsd:schema>
</types>
<message name="query_wmiRequest">
  <part name="class" type="xsd:string" />
  <part name="fields" type="xsd:string" />
  <part name="where" type="xsd:string" /></message>
<message name="query_wmiResponse">
  <part name="return" type="tns:ArrayOfArray" /></message>
<portType name="wmiPortType">
  <operation name="query_wmi">
    <documentation>querys wmi</documentation>

    <input message="tns:query_wmiRequest"/>
    <output message="tns:query_wmiResponse"/>
  </operation>
</portType>
<binding name="wmiBinding" type="tns:wmiPortType">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="query_wmi">
    <soap:operation soapAction="urn:wmi#query_wmi" style="rpc"/>
    <input><soap:body use="encoded" namespace="urn:wmi" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input>
    <output><soap:body use="encoded" namespace="urn:wmi" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output>

  </operation>
</binding>
<service name="wmi">
  <port name="wmiPort" binding="tns:wmiBinding">
    <soap:address location="http://localhost/wmi/soap_server.php"/>
  </port>
</service>
</definitions>
ein Auszus aus der Ausgabe des Clients, was mein Problem zeigt:
PHP-Code:
2006-05-12 11:06:46.150814 soap_parserin buildVal, return:
array(
1) {
  [
"return"]=>
  &
NULL
}
2006-05-12 11:06:46.151938 soap_parserparsed successfullyfound root struct2 of name query_wmiResponse
2006
-05-12 11:06:46.153347 soapclientsent message successfully and got a(n) array
return=array(
1) {
  [
"return"]=>
  
NULL
}
2006-05-12 11:06:46.174303 soapclient: return shifted value
NULL 
Vielen Dank für eure Hilfe.

Mit Freundlichen Grüßen
André Wiedemann
andre_shd ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.05.2006, 08:22  
Neuer Benutzer
 
Registriert seit: 12.05.2006
Beiträge: 4
andre_shd
andre_shd eine Nachricht über ICQ schicken
Standard

tut mir leid, dass ich pushen muss
aber ich bin echt am verzweifeln

mfg andré
andre_shd ist offline   Mit Zitat antworten
Alt 15.05.2006, 09:51  
Neuer Benutzer
 
Registriert seit: 12.05.2006
Beiträge: 4
andre_shd
andre_shd eine Nachricht über ICQ schicken
Standard

hab das problem gelöst, aber fragt bitte nicht wie, hab nur ein paar auskommentierte zeilen editiert und plötzlich gings *confused*

mfg andré
andre_shd ist offline   Mit Zitat antworten
Alt 16.05.2006, 12:52  
Neuer Benutzer
 
Registriert seit: 12.05.2006
Beiträge: 4
andre_shd
andre_shd eine Nachricht über ICQ schicken
Standard

tut mir leid für den quatro-post aber wollte euch informieren wo der fehler lag.

und zwar war dieser total simpel, das script ist zu 100% fehlerfrei, das problem war die Abfrage. Ich hab auf ein WMI-Feld zugegriffen, welches garnicht existiert. Und wenn ein Feld nicht existiert, wird kein Ergebnis zurück gegeben

mfg andré
andre_shd ist offline   Mit Zitat antworten
Alt 16.05.2006, 14:12  
Erfahrener Benutzer
 
Registriert seit: 23.08.2007
Beiträge: 1.510
M3g4Star befindet sich auf einem aufstrebenden Ast
Standard

Also wenn dir deine Klasse da keinen Fehler gemeldet hat ist irgendwas falsch .. bei MySQL gibts da 'n feines :

PHP-Code:
<?php
mysql_query
("SELECT .....") or die(mysql_error());
?>
<== vom Grundaufbau her zumindest ...
M3g4Star ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Problem bei INSERTEN INTO RedDragon PHP Tipps 2008 37 18.07.2008 16:26
SELECT-Abfrage optimieren pz6j89 Datenbanken 14 17.04.2008 17:37
Transaktion(en) mit der InnoDB-Engine, aber wie?! PsychoEagle Datenbanken 12 23.07.2007 12:11
where Abfrage in anderer Tabelle?? Matthiasnet Datenbanken 10 11.04.2007 17:35
Probleme bei der Umsetzung Kein Genie PHP Tipps 2007 3 02.03.2007 15:43
Normalisierung einer chaotischen Tabelle maeck Datenbanken 10 12.12.2006 18:17
Updaten Delet und Insert klappen nicht PHP Tipps 2006 13 13.06.2006 13:59
Gute Struktur heohni Datenbanken 5 29.05.2006 11:42
[Erledigt] Bestell-Tabelle ok? PHP-Fortgeschrittene 4 28.11.2005 21:35
[Erledigt] Problem mit mySQL Datenbanken 7 27.09.2005 12:06
PHP-Fehlermeldung, weiss nicht mehr weiter PHP Tipps 2005-2 12 21.09.2005 12:56
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
Standart SQL Dump in PHP = Arbeits/Kostenersparnis ???????? PHP-Fortgeschrittene 7 12.06.2005 11:55
[MySQL] Problem mit einer verschachtelten Abfrage aktionkuba Datenbanken 7 06.04.2005 14:07
HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
nusoap credentials, nusoap addcomplextype, nusoap wsdl einbinden, nusoap ohne wsdl, nusoap register class, nusoap register classes, http://www.php.de/php-fortgeschrittene/39873-webservice-ueber-nusoap-gibt-null-leeres-result-zurueck.html, nusoap call array, nusoap server wsdl, nusoap wsdl:arraytype, wsdl arrayofstring, php addcomplextype soap, nusoap array, nusoap returns nothing, nusoap call geht nicht, nusoap return mysql, nusoap string, php nusoap register class, php ausgabe struct arrayofstring, nusoap return array

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:16 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.