php
  • xml
  • forms
  • 2010-09-26 101 views 0 likes 
    0

    我有一个看起来像这样的表单。现在,客户已要求将其转换为以XML格式查询和发送响应的格式。有人可以让我在PHP中使用适当的教程或示例。似乎有这样html表单到XML响应和回复

    <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

    如果您试图摆脱窗体并希望远程服务器查询不同的服务器,那么您确实需要提供有关提交窗体时现在在您的服务器上实际发生的更多详细信息。如果你设置了表单提交给url来处理标准请求,或者你需要发送xml请求,并且如果是的话,那么xml需要的样子,我们不能告诉你。 – prodigitalson 2010-09-26 23:16:29

    回答

    2

    嘛,因为你还没有提供细节生病放下基础:

    1. cron作业,用户交互或其他触发器调用远程服务器(RS)上的请求。
    2. php scrip t建立一个查询发送到托管您的站点/应用程序的应用程序服务器(AS)
    3. AS解析请求变量并为数据存储构建查询。
    4. 的AS使得对数据存储查询,并将结果转换为XML格式
    5. 的AS发送响应为XML的RS
    6. 的RS解析XML和做什么它需要与做数据包含

    所以给了这些步骤,一些示例脚本:

    RS服务器脚本

    // 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()); 
    } 
    

    的AS脚本task.php

    // 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; 
    

    当然你也可以使用现有的库,以进一步simplicty东西...例如,而不是使用curl你可以使用Zend_Http_Client(我肯定会,因为它推荐不仅可以使用curl,而且还可以使用fopen和直接插座)。或者你可以使用Zend_Dom_Query这个基本上允许你以类似于jQuery(css选择器和什么不是xPath)的方式处理xml响应。

    +0

    一个伟大的教程。谢谢! – 2010-10-03 22:09:59

    0

    看看jQuery的Ajax的功能的许多方面

    Doc

    +0

    我不认为我想要一个Ajax响应。最后,我们希望摆脱窗体并让远程服务器在我们的服务器上进行自动查询。我需要一个PHP解决方案来制作和响应XML请求。 (这是我的想象力还是让jQuery成为这里提出的一半问题的答案?) – 2010-09-26 22:51:15

    +0

    哈哈这不是你的想象力,关于你的问题我不知道如何将数据从PHP发送到XML。不会太长,直到专家出现:) – Elliott 2010-09-26 22:56:21

    相关问题