【问题标题】:Not Getting Response from PHP / MySQL NuSOAP没有得到 PHP / MySQL NuSOAP 的响应
【发布时间】:2012-07-03 11:30:17
【问题描述】:

我创建了一个基于 PHP / MySQL 的 Web 服务。我写的client.php如下:

    <?php 
require_once("lib/nusoap.php");

$host = $_SERVER['HTTP_HOST'];
$serverURL = 'http://'.$host.'/WS-Demo';
$serverScript = 'server.php'; 

$client = new nusoap_client("$serverURL/$serverScript?wsdl", 'wsdl'); 
$error = $client->getError(); 
if ($error) { 
    echo '<pre style="color: red">' . $error . '</pre>'; 
    echo '<p style="color:red;'>htmlspecialchars($cliente->getDebug(), ENT_QUOTES).'</p>'; 
    die(); 
} 

function decryptRJ256($string_to_decrypt)
{
    $key    = 'salt_key - I';
    $iv = 'salt_key - II';
    $string_to_decrypt = base64_decode($string_to_decrypt); 
    $rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_decrypt, MCRYPT_MODE_CBC, $iv);
    $rtn = rtrim($rtn, "\4");
    return($rtn);
}

function encryptRJ256($string_to_encrypt)
{
    $key    = 'salt_key - I';
    $iv = 'salt_key - II';
    $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv);
    $rtn = base64_encode($rtn);
    return($rtn);
}

$table = array('users');
$fields = array('DisplayName','Useremail', 'UserName', 'AccountBalance');
$cnd = array('UserID', 'demo');


for($i=0;$i< count($fields); $i++) {
    $fields[$i] = encryptRJ256($fields[$i]);
}

for($i=0;$i< count($table); $i++) {
    $table[$i] = encryptRJ256($table[$i]);
}

for($i=0;$i< count($cnd); $i++) {
    $cnd[$i] = encryptRJ256($cnd[$i]);
}

$result = $client->call( 
            "getDemoData",
            array('fldpara'=>$fields, 'tblpara'=>$table, 'cndpara'=>$cnd),
            "uri:$serverURL/$serverScript",
            "uri:$serverURL/$serverScript/getData"
            ); 

if ($client->fault) {
    echo '<b>Error: ';
    print_r($result);
    echo '</b>';
} else { 
    $error = $client->getError();
    if ($error) { 
        echo '<b style="color: red">-Error: ' . $error . "</b><br />". mysql_error();
    } else {
        $result = decryptRJ256($result);
        echo $result;
    } 
}
?>

和server.php如下:

    <?php   
    require_once("lib/nusoap.php");
    $host = $_SERVER['HTTP_HOST'];
    $miURL = 'http://'.$host.'/WS-Demo';
    $server = new nusoap_server();
    $server->configureWSDL('My_WebService', $miURL);
    $server->wsdl->schemaTargetNamespace=$miURL;

    $server->register('getDemoData',
                      array('fldpara' => 'xsd:Array', 'tblpara' => 'xsd:Array', 'cndpara' => 'xsd:Array'),
                      array('return' => 'xsd:string'),
                      $miURL);


    function decryptRJ256($string_to_decrypt)
    {
        $key    = 'salt_key - I';
        $iv = 'salt_key - II';
        $string_to_decrypt = base64_decode($string_to_decrypt); 
        $rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_decrypt, MCRYPT_MODE_CBC, $iv);
        $rtn = rtrim($rtn, "\4");
        return($rtn);
    }

    function encryptRJ256($string_to_encrypt)
    {
        $key    = 'salt_key - I';
        $iv = 'salt_key - II';
        $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv);
        $rtn = base64_encode($rtn);
        return($rtn);
    }

    function getDemoData($flds, $tbls, $cnds){
        $link=mysql_connect("localhost", "root", "");
        mysql_select_db("test", $link) OR DIE("Error: Database connection error");

        for($i=0;$i< count($flds); $i++) {
            $flds[$i] = decryptRJ256($flds[$i]);
        }

        for($i=0;$i< count($tbls); $i++) {
            $tbls[$i] = decryptRJ256($tbls[$i]);
        }

        for($i=0;$i< count($cnds); $i++) {
            $cnds[$i] = decryptRJ256($cnds[$i]);
        }


        if(! empty($flds)) {
            $what = implode(", ", $flds);
        } else {
            $what = "*";
        }

        if(! empty($tbls)) {
            $from = implode(", ", $tbls);
        }else {
            $err = 1;
        }

        if(! empty($cnds)) {
            $cond = " WHERE ";
            $cond .= $cnds[0] . " = '" . $cnds[1] . "'";
        } else {
            $cond = "";
        }


        $sql = "SELECT ".$what." FROM ".$from . $cond;
        $rsGetData = mysql_query($sql, $link);
        $responseData = '<?xml version="1.0" encoding="UTF-8"?>
        <MyDataSets>';
        $responseData .= '<MyDataSet>';
        $responseData .= '<SQL>'. $sql .'</SQL>';
        $responseData .= '</MyDataSet>';
/* The WHILE LOOP is not WORKING */
        while($rowGetData = mysql_fetch_assoc($rsGetData)) {
            $responseData .= '<MyDataSet>';
            foreach($rowGetData as $k => $v) {
                $responseData .= "<$k>$v</$k>";
            }
            $responseData .= '</MyDataSet>';
        }
/* The WHILE LOOP is not WORKING */
        $responseData .= '</MyDataSets>';
        $responseData = encryptRJ256($sql);
        $responseString = new soapval('return', 'xsd:string', $responseData );
        return $responseString;
    }


    $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
    $server->service($HTTP_RAW_POST_DATA);
    ?>

从上面的代码中,如果我从 server.php 中注释 while 循环,它会给出正确的输出。但是,如果我删除了 cmets,它给我的输出为“-Error: XML error parsing SOAP payload on line 2: Invalid document end”,即使 SQL 查询是正确的,并且同样可以直接在 phpMyAdmin 中工作。

请帮我解决调试问题。尽快..!!!提前致谢。

【问题讨论】:

  • PHP 的 mysql_* 函数是 deprecated。有alternativesmuch safer 都受支持。
  • 您好,我进行了更改并从 MySQL 切换到 mysqli。下面是修改后的函数: $mysqli = new mysqli("localhost", "root", "", "test"); $rsGetData = $mysqli->查询($sql); while($rowGetData = $rsGetData->fetch_assoc()) 但我仍然收到错误消息。但现在不同了。以下是我得到的响应:-错误:响应不是 text/xml 类型:text/html
  • 优秀,+1 超越了许多 php/MySQL 设计。您可能应该结束这个问题并向我们展示在另一个问题中重现您的新错误的最少代码。
  • 如下要求是新问题的链接。 stackoverflow.com/questions/11343336/…

标签: php mysql web-services nusoap


【解决方案1】:

这可能是因为您的 SOAP 库中的某些方法在您使用的 PHP 版本中被贬低了。

在 server.php 页面的顶部添加这些行

ini_set('display_errors','Off');

这应该可行。让我知道。

【讨论】:

    【解决方案2】:

    你的 foreach 循环必须在 while 之外,看看 this.for each 将参数作为数组而不是字符串。

    while($rowGetData = mysql_fetch_assoc($rsGetData)) {
                $responseData .= '<MyDataSet>';
    $row[] = $rowGetData;
               }
    
     foreach($row $k => $v) {
                    $responseData .= "<$k>$v</$k>";
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多