簡體   English   中英

如何在mysqli prepare語句查詢中使用“或”

[英]How to use 'or' inside mysqli prepare statement query

我是mysqli prepare語句的新手,很驚訝地發現了||。 不能在mysqli prepare語句查詢中按預期方式工作。 我有一個檢查用戶是否注冊的函數,其評估應基於唯一的行ID和電子郵件地址,此外,由於ID列和電子郵件列的類型不同,分別為Int(11)VARCHAR ,所以我認為使用bind_param會遇到一些麻煩,因為不同的數據類型

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;
                }
            }
        }

正確的做法是什么,我必須改用單獨的函數嗎?

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

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

因為您設置了兩個“?”。

s表示字符串,i表示整數,b是blob,d是double。

問題是您已指定在prepare語句中要綁定兩個值。 但是在bindValue語句中,您僅綁定一個值。 還有一個問題,$ iden可以是電子郵件或數字,那么我認為最好的方法是為它們生成條件語句。 因此,如果我是你,我將選擇:

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;
        }
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM