我是Android开发人员,几乎不了解php。我使用Google推送通知的应用程序正常运行。我遇到的问题是当同一部手机向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);
}
}
[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);
}
答案 0 :(得分: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
}
答案 1 :(得分:0)
另一种方法可能是让数据库通过添加“where not exists”子句来执行insert语句中的检查 - 所以insert sql看起来像
INSERT INTO GcmUsers ( gcuCompanyID, gcuRegID)
select ('strCompanyID','strRegID')
where not exists ( select * from GcmUsers where gcuRegID = 'strRegID' )