2010-09-26 8 views
0

J'ai un formulaire qui ressemble à ceci. Maintenant, un client a demandé de convertir cela en un format qui interroge et envoie une réponse en XML. Est-ce que quelqu'un peut me pint à un tutoriel approprié ou un exemple en PHP. Il semble y avoir beaucoup de façons de le faireFormulaire html en réponse XML et réponse

<form action="" method='post'> 
<table> 
<tr><td>User Number </td><td><input type='text' name='task_user_no' value='<?=$task_user_no?>'></td></tr> 
<tr><td>Date </td><td><input type='text' name='task_date' value='<?=$task_date?>'> (YYYYMMDD)</td></tr> 
<tr><td>From Time </td><td><input type='text' name='task_from_time' value='<?=$task_from_time?>'>(HHMM)</td></tr> 
<tr><td>To Time </td><td><input type='text' name='task_to_time' value='<?=$task_to_time?>'>(HHMM)</td></tr> 
<tr><td>Message </td><td><input type='text' name='task_message' value='<?=$task_message?>'></td></tr> 
<tr><td>&nbsp;</td><td><input type='submit' value='submit' name='submit' ></td></tr> 
</form> 
+0

Si vous essayez de vous débarrasser du formulaire et que vous souhaitez qu'un serveur distant interroge un serveur différent, vous devez fournir plus de détails sur ce qui se passe réellement sur votre serveur lorsque le formulaire est soumis. Nous ne pouvons pas en dire si vous avez configuré l'URL à laquelle le formulaire est soumis pour traiter uniquement les requêtes standard, ou si vous devez envoyer une requête XML, et si oui, à quoi doit ressembler ce fichier XML. – prodigitalson

Répondre

2

Eh bien, puisque vous havent détails fournis mettre mal bas les bases:

  1. Un travail cron, une interaction utilisateur ou un autre déclencheur appelle la requête sur le serveur distant (RS)
  2. Le script php t sur RS crée une requête à envoyer au serveur d'applications (AS) qui héberge votre site/application
  3. L'AS analyse les variables de requête et génère une requête pour le magasin de données.
  4. L'AS fait la requête sur banque de données, et transforme les résultats à un format XML
  5. L'AS envoie la réponse au format XML à la RS
  6. Le RS parse le XML et fait ce qu'il doit faire avec le les données qu'il contient

donc, étant donné ces étapes quelques exemples de scripts:

Script RS serveur

// set up params for query: 

$params = array(
    'task_no' => '0000000' 
    'task_date' => 'YYYYMMDD', 
    'task_from_time' => 'HHMM', 
    'task_to_time' => 'HHMM', 
    'taks_message' => 'The Message' 
); 

$client = curl_init('http://remote-server.com/task.php'); 

// return the response instead of outputting it 
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 

// make it a POST request, use CURLOPT_GET for Get requests 
curl_setopt($client, CURLOPT_POST, true); 

// set the data to send.. if using get then intstead use http_build_query($params) and append the resuult to the URL used in curl_init 
curl_setopt($client, CURLOPT_POSTFIELDS, $params); 

$response = curl_exec($client); 

// load the response as xml 

try 
{ 
    $responseXml = new SimpleXmlElement($response); 

    // do stuff here with the result see SimpleXml documentation for working with the xml nodes 

    exit; 
} 
catch(Exception $e) 
{ 
    // log message from exception 

    // exit with a non-zero status code may be important for cron or a shell invocation 
    exit($e->getCode()); 
} 

scénario task.php sur l'AS

// Im going to use PDO for simplicity sake 
$db = new PDO($dsn, $user, $pass); 
$query = 'SELECT * from table_name' 
     .'WHERE task_user_no = :task_user_no' 
     .'AND task_date = :task_date' 
     .'AND task_from_time = :task_from_time' 
     .'AND task_to_time = :task_to_time'; 

$stmt = $db->prepare($query); 
$params = $_POST; // make a copy for binding 
$xml = new DOMDocument('1.0', 'UTF-8'); 

// create some basic elements 
$response = $xml->createElement('response'); 
$info = $xml->createElement('info'); 
$results = $xml->createElement('results'); 

// set up an array we can append later if there are errors 
$errors = array(); 

foreach($params as $field => $value) 
{ 
    $paramName = ':' . $field; 

    switch($field) 
    { 
     case 'task_user_no': 
     $paramType = PDO::PARAM_INT; // assuming an int pk/fk 
     break; 
     default: 
     $paramType = PDO::PARAM_STR; // assuming string for all others 
     break; 
    } 

    if(!$stmt->bindParam($paramName, $param[$field], $paramType)) 
    { 

     $errors[] = $xml->createElement('error', sprintf(
      'Value for (%s) does not exist or is not of the proper type (%s).' 
      $field, 
      $paramType 
     )); 
    } 
} 

if(!$stmt->execute() && ($pdoError = $stmt->errorCode())) 
{ 
    $errors[] = sprintf(
     'There was an error retrieving your data, Error (%s)', 
     $pdoError 
    ); 
} 


while(false !== ($record = $stmt->fetch(PDO::FETCH_ASSOC))) 
{ 
    $task = $xml->createElement('task'); 

    foreach($record as $col => $val) 
    { 
    $task->appendChild($xml->createElement($col, $val)); 

    $results->appendChild($task); 
    } 
} 

if(!empty($errors)) 
{ 
    $errorsElement = $xml->createElement('errors'); 

    foreach($errors as $error) 
    { 
     $errorsElement->appendChild($xml->createElement('error', $error)); 
    } 

    $info->appendChild($errorsElement); 
} 

$response->appendChild($info); 
$response->appendChild($results); 
$xml->appendChild($response); 

$responseStr = $xml->saveXml(); 

header('Content-type: text/xml'); 
header('Content-length: '. strlen($responseStr)); 
header('HTTP/1.1 200 Ok'); 
print $responseStr; 
exit; 

Bien sûr, vous pouvez utiliser les bibliothèques existantes pour faire avancer les choses simplicty ... Par exemple au lieu d'utiliser curl vous pouvez utiliser Zend_Http_Client (que je recommande sans hésiter car il non seulement vous permet d'utiliser curl mais aussi fopen et les prises directes). OU pour l'analyse de la réponse xml sur l'AS, vous pouvez utiliser Zend_Dom_Query qui vous permet essentiellement de travailler avec la réponse xml d'une manière similaire à jQuery (sélecteurs css et quoi pas au lieu de xPath).

+0

un excellent tutoriel. Merci! –

0

Jetez un oeil à Jquery Ajax Fonction

Doc

+0

Je ne pense pas que je veux une réponse ajax. Ultimement, nous voulons nous débarrasser de la forme et demander au serveur distant de faire des requêtes automatisées sur notre serveur. J'ai besoin d'une solution PHP pour faire et répondre aux demandes XML. (Est-ce mon imagination ou jQuery est devenu la réponse à la moitié des questions posées ici?) –

+0

haha ​​ce n'est pas votre imagination, à propos de votre question je ne sais pas comment vous pouvez envoyer les données de php au xml. Ne sera pas trop long jusqu'à ce qu'un expert arrive :) – Elliott