goodjonx Posted December 15, 2007 Share Posted December 15, 2007 Hey All, I'm programming the server side of a small project and need to offer a few simple operations via web service. Now I've only started with PHP a week ago (usually do Java although not pro-level either). I have a really hard time getting it right: I've tried a few tools to generate the WSDL for me, without success. So I've read everything I could find on WSDL and tried to do it manually - after days of frustration still no idea.. Can someone help me out? Thanks!! Rick Here are my functions: (All fields in the data base are strings) <?php require_once('SOAP/Server.php'); require_once('SOAP/Disco.php'); $soapserver = new SoapServer('myowngrouper.wsdl'); $soapserver->addFunction('getTopics'); $soapserver->addFunction('getLevels'); $soapserver->addFunction('getPartners'); $soapserver->addFunction('setUpdate'); $soapserver->handle(); /** * Delivers currently available topics. * @return string[][] This function returns a two-dimensional array of strings. */ function getTopics($application) { require_once('config.php'); $dblink = mysql_connect($dbaddress, $dbuser, $dbpassword) or die('Data base connection error in getTopics: '.mysql_error()); mysql_select_db($dbname) or die('Data base selection error in getTopics.'); $result = mysql_query("SELECT topicid, name FROM groupertopicdata;") or die('Data base query error in getTopics: '.mysql_error()); mysql_close($dblink); $i = 0; while($row = mysql_fetch_array($result)) { $return[$i][0] = $row['topicid']; $return[$i][1] = $row['name']; $i++; } return $return; } /** * Delivers currently available level settings. * @return string[][] This function returns a two-dimensional array of strings. */ function getLevels($application) { require_once('config.php'); $dblink = mysql_connect($dbaddress,$dbuser,$dbpassword) or die('Data base connection error in getLevels: '.mysql_error()); mysql_select_db($dbname) or die('Data base selection error in getLevels: '.mysql_error()); $result = mysql_query("SELECT levelid, name FROM grouperleveldata;") or die('Data base query error in getLevels: '.mysql_error()); mysql_close($dblink); $i = 0; while($row = mysql_fetch_array($result)) { $return[$i][0] = $row['levelid']; $return[$i][1] = $row['name']; $i++; } return $return; } /** * Stores the client's current data and delivers a set of currently available users with a common topic. * @param string $userid The client's user ID * @param string $password The client's password * @param string $name The client's chosen name * @param string $position The client's current position * @param string $topic The client's current topic * @param string $level The client's skill level * @return string[][] This function returns a two-dimensional array of strings. */ function getPartners($application,$userid,$password,$name,$position,$topic,$level) { require_once('config.php'); $ip = clientIp(); $dblink = mysql_connect($dbaddress,$dbuser,$dbpassword) or die('Data base connection error in getPartners: '.mysql_error()); mysql_select_db($dbname) or die('Data base selection error in getPartners: '.mysql_error()); $result = mysql_query("SELECT password FROM grouperuserdata WHERE userid = '".$userid."';") or die('Data base query error in getPartners: '.mysql_error()); $row = mysql_fetch_array($result); if($row['password'] == md5($password)) { //$headers = apache_request_headers(); //$ip = $headers['PC-Remote-Addr']; $ip = ' 192.168.24.52'; $result = mysql_query("SELECT name, ip, position, level FROM grouperuserdata WHERE topic = '".$topic."' AND userid != '".$userid."';") or die('Data base query error in getPartners: '.mysql_error()); mysql_close($dblink); $i = 0; while($row = mysql_fetch_array($result)) { $return[$i][0] = $row['name']; $return[$i][1] = $row['ip']; $return[$i][2] = $row['position']; $return[$i][4] = $row['level']; $i++; } return $return; } else { mysql_close($dblink); return null; // authentication failed } } /** * Stores the client's current data. * @param string $userid The client's user ID * @param string $password The client's password * @param string $name The client's chosen name * @param string $position The client's current position * @param string $topic The client's current topic * @param string $level The client's skill level * @return boolean This function returns TRUE if the operation was successful. */ function setUpdate($application,$userid,$password,$name,$position,$topic,$level) { require_once('config.php'); $ip = clientIp(); $dblink = mysql_connect($dbaddress,$dbuser,$dbpassword) or die('Data base connection error in getPartners: '.mysql_error()); mysql_select_db($dbname) or die('Data base selection error in setUpdate: '.mysql_error()); $result = mysql_query("SELECT password FROM grouperuserdata WHERE userid = '".$userid."';") or die('Data base query error in setUpdate: '.mysql_error()); $row = mysql_fetch_array($result); if($row['password'] == md5($password)) { //$headers = apache_request_headers(); //$ip = $headers['PC-Remote-Addr']; $ip = ' 192.168.24.52'; $result = mysql_query("UPDATE grouperuserdata SET name = '".$name."', ip = '".$ip."', position = '".$position."', level = '".$level."' WHERE userid = '".$userid."';") or die('Data base query error in setUpdate: '.mysql_error()); mysql_close($dblink); return true; } else { mysql_close($dblink); return false; // authentication failed } } ?> Here's my attempt at a WSDL: <?xml version='1.0' encoding='UTF-8'?> <definitions name="grouper" targetNamespace="urn:grouper" xmlns:typens="urn:grouper" xmlns:xsd="http://www.w3.org/2001/XMLSchema " xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/ " xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://localhost/grouper/grouper.php"> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:grouper"> <xsd:element name="getTopicsRequest" type="tns:Request"/> <xsd:element name="getTopicsResponse" type="tns:TopicArray"/> <xsd:element name="getLevelsRequest" type="tns:Request"/> <xsd:element name="getLevelsResponse" type="tns:LevelArray"/> <xsd:element name="getPartnersRequest" type="tns:Person"/> <xsd:element name="getPartnersResponse" type="tns:PartnerArray"/> <xsd:element name="setUpdateRequest" type="tns:Person"/> <xsd:element name="setUpdateResponse" type="tns:Confirmation"/> <xsd:complexType name="Request"> <xsd:sequence> <xsd:element name="application" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="TopicArray"> <xsd:sequence> <xsd:element name="return" type="tns:Topic" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="LevelArray"> <xsd:sequence> <xsd:element name="return" type="tns:Level" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Person"> <xsd:sequence> <xsd:element name="application" type="xsd:string"/> <xsd:element name="userid" type="xsd:string"/> <xsd:element name="password" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> <xsd:element name="ip" type="xsd:string"/> <xsd:element name="position" type="xsd:string"/> <xsd:element name="topic" type="xsd:string"/> <xsd:element name="level" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Partner"> <xsd:sequence> <xsd:element name="application" type="xsd:string"/> <xsd:element name="name" type="xsd:string"/> <xsd:element name="ip" type="xsd:string"/> <xsd:element name="position" type="xsd:string"/> <xsd:element name="level" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="PartnerArray"> <xsd:sequence> <xsd:element name="return" type="tns:Partner" nillable="true" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Confirmation"> <xsd:sequence> <xsd:element name="return" type="xsd:boolean"/> </xsd:sequence> </xsd:complexType> </xsd:schema> <message name="getTopicsRequest"> <part name="parameters" type="tns:Request"/> </message> <message name="getTopicsResponse"> <part name="parameters" type="tns:TopicArray"/> </message> <message name="getLevelsRequest"> <part name="parameters" type="tns:Request"/> </message> <message name="getLevelsResponse"> <part name="parameters" type="tns:LevelArray"/> </message> <message name="getPartnersRequest"> <part name="parameters" type="tns:Partner"/> </message> <message name="getPartnersResponse"> <part name="parameters" type="tns:PartnersArray"/> </message> <message name="setUpdateRequest"> <part name="parameters" type="tns:Partner"/> </message> <message name="setUpdateResponse"> <part name="parameters" type="xsd:boolean"/> </message> <portType name="GrouperPortType"> <documentation> This web service supports the Grouper application. </documentation> <operation name="getTopics"> <documentation> Delivers a set of currently available topics. </documentation> <input message="typens:getTopicsRequest"/> <output message="typens:getTopicsResponse"/> </operation> <operation name="getLevels"> <documentation> Delivers a set of skill level designations. </documentation> <input message="typens:getLevelsRequest"/> <output message="typens:getLevelsResponse"/> </operation> <operation name="getPartners"> <documentation> Stores the client's current status and delivers a set of currently available users on the same topic. </documentation> <input message="typens:getPartnersRequest"/> <output message="typens:getPartnersResponse"/> </operation> <operation name="setUpdate"> <documentation> Stores the client's current status. </documentation> <input message="typens:setUpdateRequest"/> <output message="typens:setUpdateResponse"/> </operation> </portType> <binding name="GrouperBinding" type="typens:GrouperPortType"> <soap:binding style="document" transport=" http://schemas.xmlsoap.org/soap/http"/> <operation name="getLevels"> <soap:operation soapAction="urn:GrouperAction"/> <input> <soap:body namespace="urn:grouper" use="literal" encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body namespace="urn:grouper" use="literal" encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> <operation name="getPartners"> <soap:operation soapAction="urn:GrouperAction"/> <input> <soap:body namespace="urn:grouper" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/ > </input> <output> <soap:body namespace="urn:grouper" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/ > </output> </operation> <operation name="getTopics"> <soap:operation soapAction="urn:GrouperAction"/> <input> <soap:body namespace="urn:grouper" use="literal" encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body namespace="urn:grouper" use="literal" encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> <operation name="setUpdate"> <soap:operation soapAction="urn:GrouperAction"/> <input> <soap:body namespace="urn:grouper" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/ > </input> <output> <soap:body namespace="urn:grouper" use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/ > </output> </operation> </binding> <service name="grouperService"> <port name="GrouperPort" binding="typens:GrouperBinding"> <soap:address location="http://localhost/grouper/grouper.php"/> </port> </service> </definitions> Link to comment https://forums.phpfreaks.com/topic/81807-web-services-wsdl-for-two-dimensional-arrays/ Share on other sites More sharing options...
goodjonx Posted December 16, 2007 Author Share Posted December 16, 2007 Can no one give me a pointer? I suspected that web services are a PHP weakness, but someone must have some experience with it? I am especially wondering if there's a better way return the data, perhaps a string[] would be easier to implement than a string[][] although not as pretty? Or is there a more direct way to return a mysql result..? Link to comment https://forums.phpfreaks.com/topic/81807-web-services-wsdl-for-two-dimensional-arrays/#findComment-416133 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.