2017-02-15 5 views
0

私は既存の一意のキーのリストを管理する非常に基本的なAPIを書いています。 getKey()メソッドが呼び出されると、すでに割り当てられているキーが返されるか、未使用のキーが見つかって割り当てられます。更新クエリの後に行データを取得

後者では、既存の行にUPDATEを呼び出し、割り当て済みとマークする必要があります。その後、私はこれがかなり冗長であると感じる行データを取得するために同じ情報を再度照会しています。それは機能しますが、私は自己改善のためのベストプラクティスを見つけようとしています。ここでは、潜在的により良い実装についてフィードバックを得たいと考えています。

<?php 

require "Slim/Slim.php"; 
\Slim\Slim::registerAutoloader(); 

require "defines.php"; 

$GLOBALS['db'] = new mysqli(DATABASE_HOST, DATABASE_USER, DATABASE_PASS, DATABASE_NAME); 

// SLIM INSTANCE 
$app = new \Slim\Slim(); 

$app->get('/getKey/:dlc/:serviceId', function ($dlc, $serviceId) 
{ 
    $sql = "SELECT game_key FROM " . $dlc . " WHERE service_id = " . $serviceId . " LIMIT 1"; 

    if ($result = $GLOBALS['db']->query($sql)) 
    { 
     // Check if we already have a GAME_KEY assigned 
     if (mysqli_num_rows($result) >= 1) 
     { 
      echo "got an existing row!"; 
      $row = mysqli_fetch_assoc($result); 
      echo $row["game_key"]; 
     } 
     else 
     { 
      echo "no existing row, lets update one!"; 
      $sql = "UPDATE " . $dlc . " SET service_id = $serviceId WHERE service_id = 0 LIMIT 1"; 

      if ($GLOBALS['db']->query($sql)) 
      { 
       $sql = "SELECT game_key FROM " . $dlc . " WHERE service_id = " . $serviceId; 

       if ($result2 = $GLOBALS['db']->query($sql)) 
       { 
        $row = mysqli_fetch_assoc($result2); 
        echo $row["game_key"]; 
       } 
      } 
     } 
    } 
    else 
    { 
     echo "Query Failed!"; 
    } 
}); 

// run the Slim app 
$app->run(); 

?> 
+0

に「ID」の主キー列を持っていることを前提とし** service_id ** game_keyが存在し、その後where句WHERE service_id = 0で更新を行い、game_keyを設定していません。 2番目のクエリのgame_keyは最初のクエリと同じになります。この第二の部分は厄介なように見えます。このコードで何をしたいですか? –

+0

これは、game_keyフィールドが既にデータベースに設定されているためです。一意のgame_keyを含む1500行があります。私はservice_idを使用して、割り当てられているかどうかを判断しています。そうでない場合は0、それ以外の場合はサービスのIDです。希望は意味をなさない! –

答えて

-1

あなたは最大2文を使用することができます。

// SELECT game_key matching $serviceId OR some with 0 if not found 
$sql = "SELECT id, game_key, service_id FROM " . $dlc . " WHERE service_id = " . $serviceId . " OR service_id = 0 ORDER BY service_id DESC LIMIT 1"; 
if ($result = $GLOBALS['db']->query($sql)) 
{ 
    $row = mysqli_fetch_assoc($result); 
    echo $row["game_key"]; 
    // Check if it is new key 
    if($row["service_id"] == 0) { 
     $keyId = $row["id"] 
     $sql = "UPDATE $dlc SET service_id = $serviceId WHERE id= $keyId LIMIT 1"; 
     ... // continue to exec update query 
    } 
} 

私はあなたが与えられたかどうかを確認あなたのロジックの最初の部分では、あなたのテーブル

+0

ありがとうございますが、私が書いた方法は混乱していると思います。基本的には、まず既存の行が特定の "service_id"ですでに存在するかどうかを確認し、確認する必要があります。もしそうなら、私は "game_key"を得てそれをエコーし​​ます。そうでない場合は、 "service_id"がまだ設定されていない最初の行(値が0)を見つけて、それに "service_id"を割り当てる必要があります。 –

+0

これは私がORDER BYステートメントを使用した理由です。このservice_idを持つ行がある場合、この行が返されます。それ以外の場合は0が返されます - あなたは正のservice_id値を持っていると仮定します – Mateusz

+0

ああ、私は完全にそれを見逃して、完璧な意味を持ち、とてもきれいに見えます。ありがとうございました! –

関連する問題