PHP Klasse vererbt keine deklarierte Variable

Godsplan

Grünschnabel
Hallo liebe Community,

ich schreibe gerade eine SOAP Schnittstelle mit PHP und stoße dabei auf folgendes Problem. Ich habe im SOAP Server eine Klasse laufen und mit der Klasse handle ich zunächst das Account Management. Also das nicht jeder auf die folgende Funktionalität zugreifen kann. Der SOAP Client ruft meine WSDL auf, über meine Funktion "authAccount" authentifiziert er sich, mittels passwort und username und key. Bisdahin überhaupt kein Problem. Ich habe jetzt eine Funktion geschrieben welche für das Bearbeiten des Passwords zuständig ist und die bereit mir Bauchschmerzen.

Zunächst soll sich der User authen, danach erst kann er sein Passwort ändern.
Das Client Script sieht so aus:

PHP:
$client = new SoapClient($cms->_setting['dev_api_keys_qtype_serverurl'], array('exceptions' => 0));
$result = $client->authAccount($cms->_setting['dev_api_keys_qtype_user'],$cms->_setting['dev_api_keys_qtype_password'],$cms->_setting['dev_api_keys_qtype_key']);
$result.= $client->setpasswordAccount("b971a8ae","Asda2DAs");

WSDL findet er, die Funktion ansich auch, bis dahin kein Problem.

Hier ist die WSDL:

PHP:
<?xml version ='1.0' encoding ='UTF-8' ?> 
<definitions name='Qtype' xmlns:tns='DOMAIN/crm.wsdl' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns='http://schemas.xmlsoap.org/wsdl/'> 

<message name='authAccountRequest'> 
  <part name='login' type='xsd:string'/>
  <part name='password' type='xsd:string'/>
</message> 
<message name='authAccountResponse'><part name='return' type='xsd:string'/></message> 

<message name='registerAccountRequest'> 
  <part name='login' type='xsd:string'/>
  <part name='password' type='xsd:string'/>
  <part name='email' type='xsd:string'/>
</message> 
<message name='registerAccountResponse'><part name='return' type='xsd:string'/></message>

<message name='lostAccountRequest'>
  <part name='email' type='xsd:string'/>
</message> 
<message name='lostAccountResponse'><part name='return' type='xsd:string'/></message>

<message name='setpasswordAccountRequest'>
  <part name='password' type='xsd:string'/>
</message> 
<message name='setpasswordAccountResponse'><part name='return' type='xsd:string'/></message>


<portType name='QtypePortType'> 
  <operation name='authAccount'> 
    <input message='tns:authAccountRequest'/> 
    <output message='tns:authAccountResponse'/> 
  </operation> 
 <operation name='registerAccount'> 
    <input message='tns:registerAccountRequest'/> 
    <output message='tns:registerAccountResponse'/> 
  </operation> 
 <operation name='lostAccount'> 
    <input message='tns:lostAccountRequest'/> 
    <output message='tns:lostAccountResponse'/> 
  </operation> 
	<operation name='setpasswordAccount'> 
	<input message='tns:setpasswordAccountRequest'/> 
	<output message='tns:setpasswordAccountResponse'/> 
	</operation> 
</portType> 

<binding name='QtypeBinding' type='tns:QtypePortType'> 
  <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> 
  <operation name='authAccount'> 
	<soap:operation soapAction='urn:xmethodsQtype#authAccount'/> 
    <input><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></input> 
    <output><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></output> 
  </operation> 
  <operation name='registerAccount'> 
	<soap:operation soapAction='urn:xmethodsQtype#registerAccount'/> 
    <input><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></input> 
    <output><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></output> 
  </operation> 
  <operation name='lostAccount'> 
	<soap:operation soapAction='urn:xmethodsQtype#lostAccount'/> 
    <input><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></input> 
    <output><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></output> 
  </operation>
  <operation name='setpasswordAccount'> 
	<soap:operation soapAction='urn:xmethodsQtype#setpasswordAccount'/> 
    <input><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></input> 
    <output><soap:body use='encoded' namespace='urn:xmethodsQtype' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/></output> 
  </operation>  
</binding> 

<service name='QtypeService'> 
	<port name='QtypePort' binding='QtypeBinding'>
		<soap:address location='http://DOMAIN/server.php'/>
	</port> 
</service>
</definitions>

Das Problem ist das ich bei der Funktion "authAccount", bei erfolgreichem Login, eine Variable auf 1 setze und diese halt global setze mit "$this->statuslogin = 1". Damit ist doch die Variable "statuslogin" auf "1" und ich kann diese in anderen Methoden jetzt auch benutzen.

Und gerade das macht er nicht. In der Methode "setpasswordAccount" ist die Variable "statuslogin" nicht gesetzt. Liegt das eventuell an der SOAP Verbindung? Passt da irgendwas nicht?

Hier die PHP Klasse des Servers:

PHP:
<?php
class qtype_soap_server
{
	var $loginstatus;
	var $loginname;
	// Account Management
	// - The following methods define account handling such as authentification, registration and activation
	function authAccount($login, $password, $key)
	{
		global $conn1, $utils;
		$sql_query = "SELECT * FROM	soap_auth WHERE 
						user = '".$utils->protectcontent($login)."' AND
						password = '".$utils->protectcontent($utils->md5_crypt($password))."' AND
						developerkey = '".$utils->protectcontent($key)."' AND
						activated = '1'";			
		$select_account = $conn1->sql($sql_query);
		if($conn1->num_rows($select_account) != "0"):
			$this->loginstatus = "1";
			$this->loginname = $login;
			return "Login sucessfull\n";			
		else:
			$this->loginstatus = "0";
			return new SoapFault('Client', 'Wrong User-/Password- or Developer Key - Login failed', 'server.php', ''); 
		endif;
	}
	
	function setpasswordAccount($oldpassword,$newpassword)
	{
		if($this->loginstatus == 1):
			return "Password sended";		
		else: // Not logged in
			return "You have to login before changing password";
		endif;	
	}	
}
?>

Er schickt mir als antwort halt "Login erfolgreich" aber anschließend halt "You have to login...". Warum übergibt er die Variable nicht an die Methode? Wo ist der Wurm?

Hier noch die server.php

PHP:
$server = new SoapServer(NULL, array('uri' => "http://DOMAIN/server.php"));
	$server->setClass('qtype_soap_server');
	$server->handle();

Wäre super wenn ihr mal in die Klasse schaun könntet was da nicht stimmt.
 
Das wird nicht funktionieren, da SOAP asynchron wie HTTP ist. Also musst du mit Sessions arbeiten, auf der Service-Seite natürlich.

Es ist vollkommen klar, dass das nicht so funktionieren kann, wenn man weiß, das SOAP nach jedem Call die Verbindung beendet.
 
Zurück