2016-09-15 6 views
0

私はPHP APIを作成しており、DBHandlerからリクエストを引き出す関数を呼び出しています。私は '/出席者'機能を取得すると、私は正しくデータを取得します。しかし、私は、APIの各呼び出しに認証を追加したい。 DBHandlerにパラメータを渡して、使用する接続文字列を指定します(複数あるように)。文字列にnullが定義されている場合は、標準の接続文字列が使用されます。PHP 2回呼び出すと関数内のオブジェクトを再宣言できません

'認証'機能には標準の接続文字列が必要ですが、 '/出席者'のgetには別の接続文字列が必要です。前述のように '/ attendees'はそれ自身でうまく動作しますが、sqlを実行しようとすると認証エラーが発生します。認証は別の接続文字列を使用していて、接続を何とか上書きしているためです。

require_once '../include/DbHandler.php'; 
require_once '../include/PassHash.php'; 
require '.././libs/Slim/Slim.php'; 
ini_set('display_errors', 1); 
\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 
$user_id = NULL; 

function authenticate(\Slim\Route $route) { 
    $headers = apache_request_headers(); 
    $response = array(); 
    $app = \Slim\Slim::getInstance(); 
    $dm_config = null; 
    if (isset($headers['Auth'])) { 
     $db = new DbHandler($dm_config); 
     $api_key = $headers['Auth']; 
     if (!$db->isValidApiKey($api_key)) { 
      $response["error"] = true; 
      $response["message"] = "Access Denied. Invalid Api key"; 
      echoRespnse(401, $response); 
      $app->stop(); 
     } else { 
      $response["error"] = false; 
      $response["message"] = "Auth Accepted"; 
     } 
    } else { 
     $response["error"] = true; 
     $response["message"] = "Api key is misssing"; 
     echoRespnse(400, $response); 
     $app->stop(); 
    } 
} 

$app->get('/attendees','authenticate', function() { 
      global $event_id; 
      $headers = apache_request_headers(); 
      $event_id = $headers['Eventid']; 
      $dm_config = $headers['Dm']; 
      $user_id = null; 
      $response = array(); 
      $db = new DbHandler($dm_config); 
      $result = $db->getAttendees($user_id, $event_id); 
      $response["error"] = false; 
      $response["nav"] = array(); 
      while ($task = $result->fetch_assoc()) { 
       $tmp = array(); 
       $tmp["ea.id"] = $task["ea.id"]; 
       array_push($response["nav"], $tmp); 
      } 
      echoRespnse(200, $response); 
     }); 

同じオブジェクトを呼び出すが、別々に使用する関数を取得するにはどうすればよいですか?

答えて

1

両方の機能で同じ接続文字列$dm_configを渡しています。

接続ごとに異なる変数が必要です。

+0

ルーキーミスの下に述べたようにグローバル変数$デシベルとの両方の機能のグローバルキーワードでアクセスを行うことができますが、残念ながら(認証 'でどんな違い – gsusonline

+0

がありません) '変数' $ dm_config'はnullとしてコンストラクタに渡されます。これは意図的ですか? – iliaz

+0

はい、コンストラクタは、指定されたconnenction文字列を使用するためにnullが指定されているかどうかを知っています – gsusonline

1

static $db変数をnullで初期化して接続する前に、dbを空にするかどうかをempty()関数でチェックすることによって行うことができます。

function authenticate(\Slim\Route $route) { 
    static $db=null; 
    $headers = apache_request_headers(); 
    $response = array(); 
    $app = \Slim\Slim::getInstance(); 
    $dm_config = null; 
    if (isset($headers['Auth'])) { 
     if(empty($db)) 
     { 
      $db = new DbHandler($dm_config); 
     } 
     $api_key = $headers['Auth']; 
     if (!$db->isValidApiKey($api_key)) { 
      $response["error"] = true; 
      $response["message"] = "Access Denied. Invalid Api key"; 
      echoRespnse(401, $response); 
      $app->stop(); 
     } else { 
      $response["error"] = false; 
      $response["message"] = "Auth Accepted"; 
     } 
    } else { 
     $response["error"] = true; 
     $response["message"] = "Api key is misssing"; 
     echoRespnse(400, $response); 
     $app->stop(); 
    } 
} 

か、

require_once '../include/DbHandler.php'; 
require_once '../include/PassHash.php'; 
require '.././libs/Slim/Slim.php'; 
ini_set('display_errors', 1); 
\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 
$user_id = NULL; 

$db=null; //global bariable 

function authenticate(\Slim\Route $route) { 
    global $db; // access global variable 
    $headers = apache_request_headers(); 
    $response = array(); 
    $app = \Slim\Slim::getInstance(); 
    $dm_config = null; 
    if (isset($headers['Auth'])) { 
     if(!empty($db)) {$db = new DbHandler($dm_config)}; 
     $api_key = $headers['Auth']; 
     if (!$db->isValidApiKey($api_key)) { 
      $response["error"] = true; 
      $response["message"] = "Access Denied. Invalid Api key"; 
      echoRespnse(401, $response); 
      $app->stop(); 
     } else { 
      $response["error"] = false; 
      $response["message"] = "Auth Accepted"; 
     } 
    } else { 
     $response["error"] = true; 
     $response["message"] = "Api key is misssing"; 
     echoRespnse(400, $response); 
     $app->stop(); 
    } 
} 

$app->get('/attendees','authenticate', function() { 
      global $db; // access global variable 
      global $event_id; 
      $headers = apache_request_headers(); 
      $event_id = $headers['Eventid']; 
      $dm_config = $headers['Dm']; 
      $user_id = null; 
      $response = array(); 
      if(!empty($db)) {$db = new DbHandler($dm_config)}; 
      $result = $db->getAttendees($user_id, $event_id); 
      $response["error"] = false; 
      $response["nav"] = array(); 
      while ($task = $result->fetch_assoc()) { 
       $tmp = array(); 
       $tmp["ea.id"] = $task["ea.id"]; 
       array_push($response["nav"], $tmp); 
      } 
      echoRespnse(200, $response); 
     }); 
+0

ありがとうございます、少しうまく動いています - 間違ったコードを入力した場合、正しい認証エラーが発生します。エラーが出ます。正しいDBが渡されていないようです。注記すると、私は上記の答えを因数分解して、認証の変数の名前を変更しています – gsusonline

+0

認証の結果を確認して出席者の周りを包み込み、同時に呼び出されないようにする方法はありますか? – gsusonline

+0

両方のメソッドで正しいかどうかを確認する際に問題がありますか?答えを編集したのでグローバル変数を使用することができます –

関連する問題