PHP - 将变量插入数组中

时间:2016-11-10 15:23:24

标签: php arrays variables attributes

假设我们有这个数组

$args = array('responseType' => 'Xml',
    'serverName' => 'vl18278.dinaserver.com',
    'command' => 'Vps_GetUsedSpace',
) ;

此数组组成一个通过cURL发送的URL。我需要使用变量$ vps替换vl18278.dinaserver.com,但是当我替换它时,URL会在属性serverName的=符号之前显示%5B0%5D

responseType=Xml&serverName%5B0%5D=vl18278.dinaserver.com&command=Vps_GetUsedSpace

如果我不替换vl18278.dinaserver.com,则网址正确无误。

我的代码出了什么问题?为什么那些%5B0%5D会进入我的网址? :( 提前谢谢。

完整代码:

<?php 

$listavps = simplexml_load_file('servers.xml');


foreach ($listavps->servers->server as $vps) {

$urlApi = 'url.php';
$username = 'user';
$password = 'pass';
$args = array('responseType' => 'Xml',
    'serverName' => 'vl18278.dinaserver.com',
    'command' => 'Vps_GetUsedSpace',
) ;
$args = ( is_array ( $args ) ? http_build_query ( $args, '', '&' ) : $args );
$headers = array();

$handle = curl_init($urlApi);
if( $handle === false ) // error starting curl
{
    $error = '0 - Couldn\'t start curl';
}
else
{

    curl_setopt ( $handle, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt ( $handle, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $handle, CURLOPT_URL, $urlApi );

    curl_setopt( $handle, CURLOPT_USERPWD, $username.':'.$password );
    curl_setopt( $handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );

    curl_setopt( $handle, CURLOPT_TIMEOUT, 60 );
    curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 4); // set higher if you get a "28 - SSL connection timeout" error

    curl_setopt ( $handle, CURLOPT_HEADER, true );
    curl_setopt ( $handle, CURLOPT_HTTPHEADER, $headers );

    $curlversion = curl_version();
    curl_setopt ( $handle, CURLOPT_USERAGENT, 'PHP '.phpversion().' + Curl '.$curlversion['version'] );
    curl_setopt ( $handle, CURLOPT_REFERER, null );

    curl_setopt ( $handle, CURLOPT_SSL_VERIFYPEER, false ); // set false if you get a "60 - SSL certificate problem" error

    curl_setopt ( $handle, CURLOPT_POSTFIELDS, $args );
    curl_setopt ( $handle, CURLOPT_POST, true );

    $response = curl_exec ( $handle );
    echo $args;
    if ($response)
    {
        $response = substr( $response,  strpos( $response, "\r\n\r\n" ) + 4 ); // remove http headers
        // parse response


        $responseSimpleXml = simplexml_load_string($response);
        if( $responseSimpleXml === false )
        {
            // invalid xml response
        }
        else
        {
            // parse response
            $errorCode = $responseSimpleXml->response->responseCode ;
            echo $errorCode;
            if( $errorCode == 1000 ) // success
            {
                $usado = $responseSimpleXml->response->data->total_space;
                $capacidad = $responseSimpleXml->response->data->space_limit;
                echo 'Usado: '.$usado.'</br>Total: '.$capacidad.'.';
            }
            else // normal errors
            {
                $errors = $responseSimpleXml->response->errors;
                foreach( $errors->error as $error )
                {
                    // process error
                }
            }
        }


    }
    else // http response code != 200
    {
        $error = curl_errno ( $handle ) . ' - ' . curl_error ( $handle );
    }

    curl_close($handle);
}


}


?>

2 个答案:

答案 0 :(得分:0)

您的变量$server必须是数组,因为一旦解码,%5B0%5D[0]

我的猜测是在您替换值的地方使用$server[0]而不是$server。没有替换代码,很难确定。

答案 1 :(得分:0)

我在使用它之前使用$ listavps变量中的rawurlencode解决了这个问题。

<?php 

$listavps = simplexml_load_file('servers.xml');

foreach ($listavps->servers->server as $key => $tag) {

$vps = rawurlencode ($tag);

$urlApi = 'url.php';
$username = 'user';
$password = 'pass';
$args = array('responseType' => 'Xml',
    'serverName' => $vps,
    'command' => 'Vps_GetUsedSpace',
) ;