2012-07-03 2 views
4

Я создал веб-службу на основе PHP/MySQL. Я написал client.php, как показано ниже:Не получить ответ от PHP/MySQL NuSOAP

<?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 дает правильный вывод. Но если я удаляю комментарии, которые дают мне вывод как «-Error: XML-ошибка, анализирующая полезную нагрузку SOAP в строке 2: Недопустимый конец документа», даже если SQL-запрос правильный и тот же непосредственно работает в phpMyAdmin.

Пожалуйста, помогите мне решить проблему отладки. КАК МОЖНО СКОРЕЕ..!!! Заранее спасибо.

+2

РНР '' mysql_ * функции [устаревшее] (http://www.php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated). Существуют [альтернативы] (http://www.php.net/manual/en/mysqlinfo.api.choosing.php), которые поддерживаются и [намного безопаснее] (http://stackoverflow.com/a/60496/ 132382). – pilcrow

+0

Привет Я внес изменения и переключился на mysqli из MySQL. Ниже приведена функция после изменений: $ mysqli = new mysqli ("localhost", "root", "", "test"); $ rsGetData = $ mysqli-> query ($ sql); \t while ($ rowGetData = $ rsGetData-> fetch_assoc()) Но все же я получаю сообщение об ошибке. Но теперь другое. Ниже приведен ответ, который я получаю: -Error: Response not of type text/xml: text/html – Prash278

+0

Отлично, +1 для повышения над очень многими проектами php/MySQL. Вероятно, вы должны закрыть этот вопрос и показать нам минимальный код, который воспроизводит вашу новую ошибку в другом вопросе. – pilcrow

ответ

0

Возможно, это связано с тем, что некоторые методы в вашей библиотеке SOAP не используются в используемой вами версии PHP.

Add theses lines at top of your server.php page

ini_set('display_errors','Off');

Это должно сработать. Дай мне знать.

0

Ваш цикл foreach должен быть вне взгляда, посмотрите на this.for каждый принимает аргумент как массив, а не строку.

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

foreach($row $k => $v) { 
       $responseData .= "<$k>$v</$k>"; 
      } 
Смежные вопросы