2013-04-24 76 views
0

我是一個Android開發人員,有沒有知識與PHP旁邊。我有一款使用Google推送通知的應用,效果不錯。我遇到的問題是當同一部手機註冊Google時,Google的regID必須存儲在我的數據庫中。如果我將應用程序推到手機上說4次,那麼我將在數據庫中有4行指向一部手機。php sql_srv檢查數據庫是否有行失敗

我想檢查數據庫,看看是否存在一個給定的REGID記錄。我試圖使用sqlsrv_has_rows()來做到這一點。下面的代碼編譯但不插入記錄如果記錄存在與否。

任何人都可以看到什麼問題是?

由於提前,

亞光

public function storeUser($companyid, $gcm_regid) { 

    $strCompanyID = strval($companyid); 
    $strRegID = strval($gcm_regid); 

    $serverName = "LOCALHOST\SQLEXPRESS"; 
    $uid = "gcm";  
    $pwd = "gcm";  
    $databaseName = "gcm"; 

    $connectionInfo = array(
     "UID" => $uid, 
     "PWD" => $pwd, 
     "Database" => $databaseName 
    ); 

    $db = sqlsrv_connect($serverName, $connectionInfo) 
       or die("Unable to connect to server"); 

    $query = " 
     SELECT * 
     FROM GcmUsers 
     WHERE gcuRegID = " . $strRegID; 
    $resultQueryRegID = sqlsrv_query($db, $query); 

    if ($resultQueryRegID) { 
     $rows = sqlsrv_has_rows($resultQueryRegID); 

     if ($rows === true) { 
      //echo "There are rows. <br />"; 
     } else { 
      // echo "There are no rows. <br />"; 
      $queryInsert = " 
       INSERT INTO GcmUsers 
        (gcuCompanyID, gcuRegID) 
       VALUES 
        ('$strCompanyID','$strRegID') 
      "; 
      $result = sqlsrv_query($db, $queryInsert); 
     } 
    } 
} 

[EDIT 1]

public 

function storeUser($companyid, $gcm_regid) { 

    $strCompanyID = strval($companyid); 
    $strRegID = strval($gcm_regid); 


    $serverName = "LOCALHOST\SQLEXPRESS"; 
    $uid = "gcm"; 
    $pwd = "gcm"; 
    $databaseName = "gcm"; 

    $connectionInfo = array("UID" => $uid, "PWD" => $pwd, "Database" => $databaseName); 

    $db = sqlsrv_connect($serverName, $connectionInfo) or die("Unable to connect to server"); 



    $sql = "SELECT * FROM GcmUsers where gcuRegID = ?"; 

    // Initialize parameters and prepare the statement. 
    // Variables $qty and $id are bound to the statement, $stmt. 

    $stmt = sqlsrv_prepare($db, $sql, array(&$strRegID)); 
    if (!$stmt) { 
     die(print_r(sqlsrv_errors(), true)); 
    } 

    $result = sqlsrv_execute($stmt); 



    $rows = sqlsrv_has_rows($result); 

    if ($rows === true) { 
     // echo "There are rows. <br />"; 
    } else { 
     // echo "There are no rows. <br />"; 
     $queryInsert = "INSERT INTO GcmUsers (gcuCompanyID, gcuRegID) values ('$strCompanyID','$strRegID')"; 
     $result = sqlsrv_query($db, $queryInsert); 
    } 
} 

[EDIT2]

$sql = "SELECT * FROM GcmUsers where gcuRegID = ?"; 

         // Initialize parameters and prepare the statement. 
         // Variables $qty and $id are bound to the statement, $stmt. 

         $stmt = sqlsrv_prepare($db, $sql, array(&$strRegID)); 
         if(!$stmt) { 
          die(print_r(sqlsrv_errors(), true)); 
         }   

         $result = sqlsrv_execute($stmt); 





          if (sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { 
           // Got rows 
          }else{ 
           // Not rows 
           $queryInsert = "INSERT INTO GcmUsers (gcuCompanyID, gcuRegID) values ('$strCompanyID','$strRegID')"; 
            $result = sqlsrv_query($db, $queryInsert); 
          } 
+1

你可以在第一個'sqlsrv_query()'調用之後顯示'var_dump(sqlsrv_errors());''?另外我注意到你的if($ resultQueryRegID){'沒有'else'塊來處理第一個查詢發生錯誤的情況;-) – DaveRandom 2013-04-24 08:58:42

回答

1

回答到原來的問題:

PHP和SQL是在不同平臺上運行的不同語言。基本上,你有這樣的:

$strRegID = strval($gcm_regid); 
$query = " 
    SELECT * 
    FROM GcmUsers 
    WHERE gcuRegID = " . $strRegID; 

這PHP代碼生成SQL代碼,結果可能是這樣的:

SELECT * 
FROM GcmUsers 
WHERE gcuRegID = ABCDEFG 

我想現在你可以發現錯誤,如果你不這樣做,你至少應該學習一些基本的SQL。

要修復您的代碼,請查看How to prevent SQL injection in PHP?並開始使用預準備語句。

最後,查看PHP手冊中的用法示例,並確保您知道如何從SQL Server中獲取錯誤消息。否則,你會在黑暗中拍攝。


答到編輯的問題

你的檢查是這樣的:

$rows = sqlsrv_has_rows($resultQueryRegID); 
if ($rows === true) { 
    //echo "There are rows. <br />"; 
} else { 
    // echo "There are no rows. <br />"; 
} 

但是,這不是正是什麼the manual說:

返回TRUE如果日如果 語句沒有行或者發生了錯誤,則指定的語句有行並且FALSE

將您的代碼翻譯爲「插入新記錄,如果沒有以前的記錄或者我們無法確定它」。

對兩個完全不同的結果使用相同的返回值可能是一個可以說是設計的決定,但這就是函數的工作原理。我想,當你得到FALSE你需要測試是否有錯誤。

或者,僅僅霎那行似乎是一個更簡單的方法:

if (sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
    // Got rows 
}else{ 
    // Not rows 
} 
+0

G. Vicario你好,我已經更新了這篇文章,包括EDIT1。我使用了一個準備好的語句,它會將一條記錄插入到一​​個空的數據庫中,但是一旦該記錄處於啓用狀態,隨後調用具有相同RegID的storeUser將會在DB中放置相同/重複的記錄。好像$行總是假的。你有任何進一步的想法。謝謝 – turtleboy 2013-04-24 11:31:34

+0

是的,只是看到你在回答問題後改變了問題... – 2013-04-24 11:42:42

+0

@G。 Vicario嗨,你提出的另一種選擇也沒有效果。我發佈了edit2,如果你有時間看,但它只是在數據庫中寫入重複的行。 – turtleboy 2013-04-24 12:10:33

0

另一種方法可能是讓數據庫中檢查在INSERT語句中加入了「哪裏都不存在」條款 - 所以插入sql看起來像

INSERT INTO GcmUsers (gcuCompanyID, gcuRegID) 
select ('strCompanyID','strRegID') 
where not exists (select * from GcmUsers where gcuRegID = 'strRegID')