2013-04-24 4 views
0

Я разработчик Android, у которого нет знаний с php. У меня есть приложение, которое использует Google push-уведомления и прекрасно работает. Проблема, с которой я сталкиваюсь, заключается в том, что тот же телефон регистрируется с Google, что regID из Google должен храниться в моей БД. Если я нажимаю приложение на телефон, скажу 4 раза, тогда у меня будет 4 строки в БД, указывающих на один телефон.php sql_srv проверить, нет ли у DB строк с ошибкой

Я пытаюсь проверить БД, чтобы увидеть, существует ли запись для данного 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

Можете ли вы показать 'var_dump (sqlsrv_errors());' после первого 'sqlsrv_query()' позвонить? Также я замечаю, что ваш 'if ($ resultQueryRegID) {' не имеет блока 'else' для обработки случая, когда возникает ошибка с первым запросом ;-) – DaveRandom

ответ

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 если й e имеет строки и FALSE, если оператор не имеет строк или если произошла ошибка.

Что означает ваш код как «вставить новую запись, если нет предыдущей, или если мы не смогли ее определить».

Использование того же возвращаемого значения для двух совершенно разных результатов, вероятно, является конструктивным решением, но именно так работает функция. Я полагаю, что когда вы получите FALSE, вам нужно будет проверить, есть ли ошибка или нет.

В качестве альтернативы, просто захват строки кажется более простым способом:

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

G. Vicario Привет, я обновил сообщение, чтобы включить edit1. Я использовал подготовленный оператор, и он будет вставлять запись в пустую БД, но как только запись будет включена, последующие вызовы storeUser с тем же RegID поместят одну и ту же/дублируемую запись в БД. Кажется, что $ rows всегда ложно. У вас есть какие-то дальнейшие идеи. спасибо – turtleboy

+0

Да, просто увидел, что вы изменили вопрос после того, как получили ответ ... –

+0

@G. Vicario Привет, ни одна альтернатива, которую вы предложили, тоже не сработала. Я опубликовал edit2, если у вас есть время, чтобы посмотреть, но он просто пишет дубликаты строк в БД. – turtleboy

0

Альтернативный подход может позволить базе данных делать проверку в операторе вставки, добавив «где не существует» условие - поэтому вставка SQL будет выглядеть как-то

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