2016-10-17 3 views
1

私は最近、phpで手続き型からoop型に移動しています。私は本から勉強していますし、本の練習とプロジェクトもやっています。私自身のウェブサイトのために行う。初期化クラスと未定義オフセットに問題がある

私のウェブサイトにSMS機能を実装したいのですが、プロジェクトの調査中に私が使用する会社のAPIに接続するこの小さなクラスライブラリが出てきました。ライブラリはgithubにあり、サポートされていないようです開発者への電子メールは跳ね返っています。

これはlibraryであり、これは私がそれを初期化するために使用するコードです:

require_once('classes/class.smsquick.php'); 

$username = "someuser"; 
$password = "somepass"; 

$api = new SmsQuick($username, $password); 

//uncommenting the line below returns undefined_index @ line 312 and 282 
//$available_credits = $api->checkBalance(); 

//var_dump($api); //used for checking 

これらのエラー、私が受けています:

お知らせ:不定オフセット:Cで1:\ classes_values()は、パラメータ1が配列で、C:\ websites \ ooptuts \ public \ classes \ class.smsquickで指定されたブール値であると想定しています。 php on line 282

public function checkBalance() { 
    $vars = array(
     'username' => $this->api_username, 
     'password' => $this->api_password, 
     'action' => 'balance', 
    ); 

    $retval = $this->executeApiRequest($vars); 
    list(, $response) = array_values(reset($retval)); // line 282 

    return (int) $response; 
} 

/** 
* Helper method to execute an API request. 
* 
* @param array $vars 
* Data to POST to SMS gateway API endpoint. 
* 
* @return array 
* Response from SMS gateway. 
*/ 
public function executeApiRequest($vars) { 
    // Basic validation on the authentication details 
    foreach ($vars as $key => $value) { 
     switch ($key) { 
      case 'username': 
      case 'password': 
       if (empty($value)) { 
        throw new Exception('API username or password not specified.'); 
       } 
       break; 
     } 
    } 

    $data = $this->preparePostData($vars); 
    $retval = $this->executePostRequest($data); 

    list($status, $response) = explode(':', $retval); // line 312 
    if ($status == 'ERROR') { 
     throw new Exception(strtr('There was an error with this request: !error.', array('!error' => $response))); 
    } 

    $data = array(); 
    $lines = explode("\n", $retval); 
    foreach (array_filter($lines) as $i => $line) { 
     $line = trim($line); 
     $data[$i] = explode(':', $line); 
    } 

    return $data; 
} 

protected function preparePostData($data) { 
    $post_data = array(); 
    foreach ($data as $key => $value) { 
     switch ($key) { 
      case 'to': 
       // Support multiple phone numbers. 
       $value = implode(',', array_unique($value)); 
       break; 
     } 
     $post_data[] = $key . '=' . rawurlencode($value); 
    } 

    return implode('&', $post_data); 
} 

protected function executePostRequest($data) { 
    $ch = curl_init($this->api_endpoint); 
    curl_setopt($ch, CURLOPT_POST, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $retval = curl_exec($ch); 
    curl_close($ch); 
    return $retval; 
} 

がどのように私はクラスを初期化していますによって引き起こされる問題です:

線312および282は、最後の二つの方法が、私はそれらも示されているように要求され、次の二つの方法の中で指摘されています何か私は見落としている何か...?私は2日間の周りにグーグルなどで周りを回って過ごしていないと多くの進歩を作っていないと他の人からいくつかのアドバイスを感謝します。

ありがとう

答えて

1

reset()はブール値を返すため、独自の行にリセット()の呼び出しを移動:

reset($retval); 
list(, $response) = array_values($retval); // line 282 

は、私はそれはあなたのケースではしかし、そのその返すFALSEまたPHP Manual: reset()

から

、その可能な最初の値を返すと言うべきです行312で、渡す配列が空です。確実に配列の値を出力してみてください。おそらくあなたのCURL呼び出しが期待したものを返さないかもしれません。

+1

あなたは確かに正しい軌道に乗っていました。私はリセット行を変更する必要はありませんでした。問題はSSL証明書であり、私は先週Wampを再インストールしてしまい、明らかに戻っていたWampフォルダにcacert.pemを含めるのを忘れました。カールレスポンスによる不良データ。どうもありがとう。回答としてマーク。 – MartinJJ

+0

うれしい私は助けることができます。正直言って、私は逆に問題を読む。 CURL呼び出しが最初に見えるという提案をしていたはずですが、私が問題を読んだ方法は逆でした。 $ retvalの値が空になってしまった場合でも、私はそれ自身の行でリセット呼び出しを保持します。必要に応じてエラーチェックを行うこともできます – Matt1776