2016-09-06 2 views
1

У меня есть (imho) действительно странная проблема. Я объявлял конфигурационные переменные в файле конфигурации и хотел бы получить доступ к этим переменным из одной функции на той же странице. Эта функция вызовет SOAP-вызов службе для получения некоторых данных.Глобальная область не работает в PHP-функции

Я включаю этот файл конфигурации на разные страницы, но когда я присоединяюсь к функции, переменные пусты, даже когда я объявляю глобальный балл. Мой (упрощенный) код выглядит следующим образом:

config.php

// Set environment 
$environment = 'dev'; 

switch($environment){ 
     case 'dev': 
      $username = 'dev'; 
      $client = new SoapClient('http://dev.domain.com/wsdl?wsdl', array('trace' => 1, 'exceptions' => 0)); 
     break; 
     case 'prod'; 
      $username = 'prod'; 
      $client = new SoapClient('http://prod.domain.com/wsdl?wsdl', array('trace' => 1, 'exceptions' => 0)); 
     break; 
     default: 
      $username = 'prod'; 
      $client = new SoapClient('http://prod.domain.com/wsdl?wsdl', array('trace' => 1, 'exceptions' => 0)); 
} 

function fetch_data($request_id){ 
     global $username; 

     $xml_post_string = ' 
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ver="https://domain.com"> 
       <soapenv:Header/> 
       <soapenv:Body> 
        <ver:options> 
          <ver:rid>'.$request_id.'</ver:rid> 
          <ver:uid>'.$username.'</ver:uid> 
        </ver:options> 
       </soapenv:Body> 
      </soapenv:Envelope> 
     '; 

     echo '<pre>'; 
     echo 'Var: '.$username; // = empty 
     echo '</pre>'; 

     // Curl headers 
     $headers = array(
      "Content-type: text/xml;charset=\"utf-8\"", 
      "Accept: text/xml", 
      "Cache-Control: no-cache", 
      "Pragma: no-cache", 
      "SOAPAction: "https://domain.com", 
      "Content-length: ".strlen($xml_post_string), 
    ); 

     // Curl options 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($ch, CURLOPT_URL, 'https://domain.com/call?wsdl'); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

     // Execute Curl call 
     $response = curl_exec($ch); // = credential error 
} 

На page.php я включить & вызовите функцию следующим образом:

require_once('config.php'); 

[..] 

$response = fetch_data('1'); 

Когда я введите имя пользователя в Строка XML Я получаю ответ, который я хочу, но когда я использую переменную (как в примере), я получаю пустое значение для $username.

Но почему?

редактировать: изменил exit; к break; и добавил процесс & выходной пример

** редактировать 2: ** Код между [..]

require_once('config.php'); 

global $current_user, $wp_query; 

$user              = wp_get_current_user(); 

$user_meta             = get_user_meta($user->data->ID, 'exID'); 
$user_member_number           = trim($user_meta[0]); 

// Set locale for date notation 
setlocale(LC_ALL, 'nl_NL'); 

$policy_id             = $_GET['polis']; 

$customer_call = array(
     'options' => array(
      'Credentials' => array(
       'UserId'          => $username // Normally more credentials like password are required as well 
      ) 
    ) 
); 
$customer_response           = $client->FetchCustomer($customer_call); 

$member_details            = $customer_response->FetchCustomerResult->Result->PlatformCustomer; 

$product_call = array(
     'options' => array(
      'Credentials' => array(
       'UserId'          => $username // Normally more credentials like password are required as well 
      ) 
    ), 
); 
$product_response           = $client->FetchProduct($product_call); 


if($product_response->FetchProductResult->Succeeded){ 
     // Extract results 
     $product_info           = $product_response->FetchProductResult->Result; 

     // Differentiate product response, depending on the ammount of rows returned 
     if($product_info->SummarizedProductInfo >= 2){ 
      $products           = $product_response->FetchProductResult->Result->Summary; 
     }else{ 
      $products           = $product_response->FetchProductResult->Result; 
     } 

     // Policy numbers for given user (for authentication purpose) 
     $member_active_policies        = array(); 

     // Iterate through policies and write policy number to array 
     foreach($products as $product){ 
      array_push($member_active_policies, $product->PolicyNumber); 
     } 

     // Check if requested polis belongs to user 
     if(in_array($policy_id, $member_active_policies)){ 
      // Iterate through products to find the requested 
      foreach($products as $product){ 
       if($product->PolicyNumber == $policy_id){ 

        // Set member variables, all with prefix $member_ 

        // Set product variables, all with prefix $product_ 

        // Fetch information about other members 
        $all_members       = fetch_data(1)->GetProductInfo; 
+0

Пожалуйста, напишите полный код, [..], возможно, перепишите переменную '$ username'. Btw: Старайтесь не зависеть от глобалов, где бы вы ни находились. Используйте вместо этого, например: классы со статическими переменными –

+0

Stab in the dark: место, где вы 'require_once ('config.php')' * не является глобальным *, например. вам нужен этот файл внутри функции. Просто попробуйте вообще не использовать глобалы или, по крайней мере, сделать их константами. – deceze

+0

Между вашим требованием и вызовом функции должно быть что-то. Где вы положили [...]. Потому что, если я запускаю ваш код, все в порядке, echo возвращает dev. –

ответ

0

Я могу видеть 2 проблемы Вот.

  1. Ваша fetch_data функция ничего не возвращает. Думаю, он должен вернуться $xml_post_string?

  2. Даже если вы вернетесь $xml_post_string, ваш код будет работать, если ваша среда «DEV», когда вы будете поставлять «тычок», это приведет к выходу из сценария на «exit», поэтому ваш сценарий не будет иметь fetch_data функция.

+0

Извините, глупая опечатка в этом посте. Этот 'exit' должен быть' break'' (как в моем рабочем коде). Также мой код является лишь примером, когда я пытаюсь получить доступ к переменной. Я добавил полный код – Maurice

Смежные вопросы