Webservice mit PHP NuSOAP -> Select bei MySQL

Erks

Erfahrenes Mitglied
Hi,
ich habe seit gestern mit dem Webservice, den ich über PHP anstatt über ASP.NET laufenlassen kann, angefangen.

Meine ersten gehversuche haben geklappt, doch nun kommt ich zu den MySQL Datenbankabfragen, die ich in ein C# Programm einlesen möchte.

Was geklappt hat, war:
PHP:
require('mysql.php');
require_once ("lib/nusoap.php");
$namespace = "http://www.event4net.de/....";
$server = new soap_server();
$server->configureWSDL("WebService_ConnectPHP2MySQL");
$server->wsdl->schemaTargetNamespace = $namespace;

$server->register(
                'insert',
                array('name'=>'xsd:int'), 
                array('return'=>'xsd:string'),
                $namespace,
                false,
                'rpc',
                'encoded',
                'A simple insert into'
);

....

function insert($id) {
	require('mysql.php');
	mysql_query("INSERT INTO test VALUES('".$id."')") or die(mysql_error());
	return "Data executed";
}
 
....
           
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) 
                ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
                 
$server->service($POST_DATA);                
exit();

Nun wollte ich das mit Select ausprobieren, aber da hakts. Irgendwie wird die Array nicht richtig gelesen, oder gefüllt. Wieso?

PHP:
require('mysql.php');
require_once ("lib/nusoap.php");
$namespace = "http://www.event4net.de/....";
$server = new soap_server();
$server->configureWSDL("WebService_ConnectPHP2MySQL");
$server->wsdl->schemaTargetNamespace = $namespace;


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

$server->register(
                'select', 
                array( ), 
                array('return' => 'tns:ListArray'),
                $namespace,
                false,
                'rpc',
                'encoded',
                'A simple select'
);

function select() {
	require('mysql.php');
	
	$game=array();
	
	$select_ort = "SELECT id FROM test";	
	if(!$res_id_ort = mysql_query($select_ort)){
		die(mysql_error());
	}
	while($ort=mysql_fetch_array($res_id_ort)){
		$game[] = $ort;
	}
	return array("ListArray" => $game);
}
             
$POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) 
                ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';

$server->service($POST_DATA);                
exit();

Die SQL Tabelle ist...
Code:
CREATE TABLE test(id varchar(10) PRIMARY KEY);

Danke für Antworten;)
 
Zuletzt bearbeitet:
Das SELECT Statement wird augerufen. Das hab ich in der DB selbst eingegeben und es hat mir das Erfragte geliefert.

Wie kann ich das mit trigger_error() realisieren, damit ich weiß, ob select() aufgerufen wird?

anstatt die() dann ...
Code:
sqlerrorhandler("(".mysql_errno().") ".mysql_error(), $query, $_SERVER['PHP_SELF'], __LINE__);

?
 
Zuletzt bearbeitet:
Ok, aber bleiben wir kurznoch bei diesem die()

Als ich hab mal extern ausprobiert, ob mein SQL Statement überhaupt das Richtige ausgibt. Ja tut es, auch als 2 Dimensionale Array.

Hier nochmal der relevante PHP Code:
PHP:
require('mysql.php');
require_once ("lib/nusoap.php");
$namespace = "http://www.....";
$server = new soap_server();
$server->configureWSDL("WebService_ConnectPHP2MySQL");
$server->wsdl->schemaTargetNamespace = $namespace;

$server->wsdl->addComplexType(
				'MyComplexType',
				'complexType',
				'struct',
				'all',
				'',
				array( 
					'ID' => array('name' => 'ID','type' => 'xsd:int'),
					'YourName' => array('name' => 'YourName','type' => 'xsd:string')
				)
); 

$server->register(
                'select', 
                array( ), 
                array('return' => 'tns:MyComplexType'),
                $namespace,
                false,
                'rpc',
                'encoded',
                'A simple select'
);

function select() {
	require('mysql.php');
	
	$output_1=array();
	$output_2=array();
	
	$select_test = "SELECT * FROM student_detail";	
	if(!$res_id_test = mysql_query($select_test)){
		die(mysql_error());
	}
	while($test=mysql_fetch_array($res_id_test)){
		$output_2['ID'] = $test['id'];
		$output_2['YourName'] = $test['vorname'];
		array_push($output_1,$output_2);
	}
	return $output_1[0];
}
?>

Wenn ich nun bei der function select() "return $output_1[0];" angebe, dann kann ich via C# auf das jeweilige Element zugreifen. Aber wieso kann ich nicht auf alle zugreifen wenn ich nur "return $output_1;" angebe?

Liegt mein Fehler in "$server->wsdl->addComplexType" oder "$server->register"?:(

Hier mal mein C# Code, mit dem ich auslesen konnte:
Code:
using WindowsFormsApplication1.Services;

...

private void button1_Click(object sender, EventArgs e)
{
            WebService_ConnectPHP2MySQL s = new WebService_ConnectPHP2MySQL();

            try
            {
                MyComplexType mct = new MyComplexType();
                mct = s.select();
  

                MessageBox.Show(mct.ID.ToString() + "\nType: " + mct.ID.GetType().ToString());
                MessageBox.Show(mct.YourName + "\nType: " + mct.YourName.GetType().ToString());
            }
            catch (Exception ex) { 
                MessageBox.Show(ex.ToString());
            }
}
 
Sowohl, als auch. Du registriesrt die Methode mit dem Return-Value eines Single-Objekts und kannst damit auch kein Array zurück geben.
 
Zurück