0

我是一名 Android 开发人员,对 php 几乎一无所知。我有一个使用 Google 推送通知并且运行良好的应用程序。我遇到的问题是,当同一部手机向谷歌注册时,来自谷歌的 regID 必须存储在我的数据库中。如果我将应用程序推到手机上说 4 次,那么我将在数据库中有 4 行指向一部手机。

我正在尝试检查数据库以查看给定 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);
        }
    }
}

[编辑 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);
    }
}

[编辑2]

$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);
                            }
4

2 回答 2

1

回答原始问题:

PHP 和 SQL 是在不同平台上运行的不同语言。你基本上有这个:

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

这段 PHP 代码生成 SQL 代码,结果可能是这样的:

SELECT *
FROM GcmUsers
WHERE gcuRegID = ABCDEFG

我假设您现在可以发现错误——如果没有,您至少应该学习一些基本的 SQL。

要修复您的代码,请查看如何防止 PHP 中的 SQL 注入?并开始使用准备好的语句。

最后,查看 PHP 手册中的使用示例,并确保您知道如何从 SQL Server 获取错误消息。否则,您将在黑暗中开枪。


回答已编辑的问题

你的支票是这样的:

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

但这并不是手册所说

TRUE如果指定的语句有行、FALSE语句没有行或发生错误,则返回。

这将您的代码转换为“如果没有以前的记录或者我们无法确定它,则插入新记录”。

对两个完全不同的结果使用相同的返回值可能是一个可以说是设计决策,但这就是函数的工作方式。我想当你得到FALSE你需要测试是否有错误。

或者,仅抓住行似乎是一种更直接的方法:

if (sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    // Got rows
}else{
    // Not rows
}
于 2013-04-24T09:23:53.553 回答
0

另一种方法可能是让数据库通过添加“where not exists”子句来检查插入语句 - 所以插入 sql 看起来像

INSERT INTO GcmUsers ( gcuCompanyID, gcuRegID) 
select ('strCompanyID','strRegID')
where not exists ( select * from GcmUsers where gcuRegID = 'strRegID' )
于 2013-04-24T13:09:26.483 回答