2014-12-05 52 views
0

我遇到了一個奇怪的問題(至少對我而言)。 我想檢查一個電子郵件地址,這是在Android設備上已經在我的數據庫中。 我得到了我的服務器端驗證碼:使用android檢查mysql數據

<?php 
include('db_connect.php'); 
$db = new _DB_Connect(); 
$db->connect(); 

    if(isset($_POST['email'])){ 

     $accountMail = $_POST['email']; 
     $result = mysql_query("select email from gcm_users;"); 
     $count = mysql_num_rows($result); 
     while($row = mysql_fetch_array($result)){ 
      if($row['email'] == $accountMail){ 
       echo "E-Mail found"; 
      }else{ 
       echo "Not found"; 
      } 
     } 
    } 
    ?> 

我張貼帳戶的電子郵件與Android的文件。 我在數據庫中的郵件IS我得到回聲「發現電子郵件」,並可以在我的android上看到它。 如果電子郵件不在數據庫中,我什麼都看不到。 繼承人我在我的Android使用的功能至今:

protected Void doInBackground(String... params) { 
    try{ 
     String accountMail; 
     InputStream inputStream; 
     String status; 
     //get Account e-mail 
     accountMail = RegisterDeviceOnRaspberryPiServer.getAccount(context); 

     //testoutput 
     System.out.println("Found Mail is: -> " + accountMail); 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost("http://checkRegistration.php"); 
     httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("email", accountMail)); 
     httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse httpResponse = httpClient.execute(httpPost); 
     inputStream = httpResponse.getEntity().getContent(); 
     status = RegisterDeviceOnRaspberryPiServer.convertInputStreamToString(inputStream); 
     System.out.println("STATUS: " + status); 

    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    return null; 
} 

所以就像我說的,狀態:+狀態打印給我唯一的迴應,當郵件被插入,但沒有閉上眼睛,什麼都在DB 。

第二個問題是,是否有更好的方法來檢查帳戶電子郵件是否在我的數據庫中?

回答

0

1)問題是while循環條件。

while($row = mysql_fetch_array($result)){ 

此循環內的代碼只有在至少有1個結果時纔會運行(這是因爲mysql_fetch_array對空結果集返回false)。

在沒有電子郵件的情況下,條件爲false,跳過循環內的代碼。這就是爲什麼當電子郵件不存在時你什麼都看不到

2)我不認爲你必須擔心這個問題的最佳解決方案。你非常接近。我能想到的最簡單的解決方案不需要一個while循環。你可以使用你在while循環上面聲​​明的count變量。如果查詢返回的行數(count)爲0,則電子郵件不存在,否則它存在。

可有可無:如果您想爲您在您的分貝重複的電子郵件條目,您可以檢查是否計數> 1

正切:我使用本地存儲一個SQLite數據庫時遇到了類似的問題。基本上,當你查詢SQLite數據庫時,你的結果是一個包含所有行和數據的Cursor對象。遊標有一個方法就像你在while循環中使用的方法。人們很容易忘記它的怪異行爲事件光標對象爲空

希望這有助於

+0

謝謝您。使用$ count變量的想法很棒,並且很有用! – CSDev 2014-12-06 11:39:55

0

這是我會怎麼做呢? 在我的情況下,我正在檢查數據庫中是否存在phone_number

checkPhoneNumber.php

if($_SERVER["REQUEST_METHOD"] == "POST"){ 

    header("Content-Type: application/json"); 
    include("classes/PDO.class.php"); 
    $db = new DatabaseHelper(); 
    $conn = $db->connect(); 

    //API JSON REQUEST 
    $json_req = json_decode(file_get_contents("php://input")); 
    $phone_number = $json_req->{"phone_number"}; 

    //JSON Return 
    $return = array(); 

    $query = "SELECT phone_number FROM user WHERE phone_number = :number"; 
    $stmt = $conn->prepare($query); 
    $stmt->bindParam(":number", $phone_number, PDO::PARAM_STR); 
    if($stmt->execute()){ 

     $phone_number = $stmt->fetch(PDO::FETCH_ASSOC); 

     if(is_array($phone_number)){ 

      $return = array("result" => TRUE, "message" => "Number is registered"); 

     }else{ 
      $return = array("result" => FALSE, "message" => "Number is not registered"); 

     } 

    }else{ 

     $return = array("result" => FALSE, "message" => "An error occurred executing the database query"); 

    } 

    echo json_encode($return); 

}else{ 

    //Nothing 

} 

正如你看到的,我接受在JSON格式請求phone_number

在我的Android應用我使用的東西這樣的:

private class CheckUser extends AsyncTask<String, Void, Boolean> { 

    private String apiUrl; 
    private String phoneNumber; 
    private String result; 
    private boolean isRegistered; 

    public CheckUser(String apiUrl, String phoneNumber) { 

     this.apiUrl = apiUrl; 
     this.phoneNumber = phoneNumber; 

    } 

    @Override 
    protected Boolean doInBackground(String... params) { 

     try { 

      // HTTP Client 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(apiUrl); 

      // DATA TO SEND 
      JSONObject request = new JSONObject(); 
      request.put("phone_number", phoneNumber); 

      // ENTITY 
      StringEntity se = new StringEntity(request.toString()); 

      // PARAMS 
      httpPost.setEntity(se); 
      httpPost.setHeader("Content-Type", "application/json"); 

      // RESPONSE 
      HttpResponse response = httpClient.execute(httpPost); 
      printLog("checkUser API " + response.getStatusLine()); 

      // RESULT DATA 
      result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8); 

     } catch (Exception e) { 

      e.printStackTrace(); 

     } 

     try { 

      JSONObject data = new JSONObject(result); 
      isRegistered = data.getBoolean("result"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return isRegistered; 
    } 

} 

我做HTTP請求發送JSON數據,因爲我的API接受JSON只,見上

希望它可以幫助

+0

謝謝你的回答,請檢查一下!看起來不錯! – CSDev 2014-12-06 11:39:09