2015-06-14 103 views
1

我是新來的mysqli prepare語句,驚訝地發現了||在mysqli準備語句查詢中沒有按預期工作。 我有檢查用戶是否註冊,它的評估應基於獨特的行ID和電子郵件address.Besides,因爲id列和email列屬於不同的類型,分別是Int(11)VARCHAR的功能,所以我以爲它會在使用bind_param一些麻煩,因爲不同的數據類型如何使用「或」內的mysqli prepare語句查詢

public function checkUserRegistered($iden){ 
//The iden can be either a id or a email address 
      $stmt = $this->connection->prepare("SELECT `id` FROM `$this->table_name` WHERE (`email`= ? || `id`= ?) LIMIT 1 "); 
      $stmt->bind_param('s',$iden); // s or i ? 
      if($stmt->execute()){ 
       $result = $stmt->get_result(); 
       if($result->num_rows ==1){ 
        $stmt->close(); 
        return true; 
       }else{ 
        return false; 
       } 
      } 
     } 

什麼是這樣做的正確的方式,我必須使用獨立的功能呢?

+0

''||在許多SQL方言的毗連運算,而不是'或'別名。 – mario

+0

@mario是的,我嘗試過'OR',但它仍然不會返回來自'get_result()' –

+1

行的錯誤''echo $ mysqli-> error;'今天在php mysql間!忘了,今天是好像每天 – Drew

回答

2

您需要綁定兩個參數是這樣的:

$stmt->bind_param('si',$iden, $iden); 

爲你設定了兩個 '?'。

s表示串,i表示整數,b是blob和d是雙重。

+0

是的,你是對的,我做了'$ stmt-> bind_param( 'SI',$鑑定者,$鑑定者);'因爲ID是INT(11) ' –

0

問題是你指定了在準備聲明要綁定兩個值。但是在bindValue語句中,你只能綁定一個值。也即將於$鑑定者可以是電子郵件或數量的問題,那麼我認爲最好的辦法是爲他們生成的條件語句。所以,如果我是你,我會去:

public function checkUserRegistered($iden){ 
//making sure $iden is not empty 
if ($iden) { 
    //if $iden is a number is equal to id 
    if (is_numeric($iden)) { 
     $stmt = $this->connection->prepare("SELECT `id` FROM `$this->table_name` WHERE `id`= ? LIMIT 1 "); 

     $stmt->bind_param('i',$iden); //because id is an integer 
    } else { 
     //then $iden is a varchar which is the email 
     $stmt = $this->connection->prepare("SELECT `id` FROM `$this->table_name` WHERE `email`= ? LIMIT 1 "); 

     $stmt->bind_param('s',$iden); //because email is a string 
    } 

    if ($stmt->execute()) { 
     $result = $stmt->get_result(); 

     if($result->num_rows ==1){ 
      $stmt->close(); 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

}