【问题标题】:How to use 'or' inside mysqli prepare statement query如何在mysqli准备语句查询中使用“或”
【发布时间】:2015-06-14 16:29:24
【问题描述】:

我是 mysqli prepare 语句的新手,很惊讶地发现 ||在 mysqli 准备语句查询中没有按预期工作。 我有一个检查用户是否注册的功能,它的评估应该基于唯一的行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;
                }
            }
        }

这样做的正确方法是什么,我必须使用单独的函数吗?

【问题讨论】:

  • || 是许多 SQL 方言中的 concat 运算符,而不是 OR 别名。
  • @mario 是的,我确实尝试过OR,但它仍然没有返回来自get_result() 的行
  • 今天在 php mysql 房间里对错误检查 echo $mysqli->error; 的热爱在哪里!忘了,今天每天都一样

标签: php mysql mysqli prepared-statement


【解决方案1】:

你需要像这样绑定两个参数:

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

因为你设置了两个'?'。

s 表示字符串,i 表示整数,b 表示 blob,d 表示双精度。

【讨论】:

  • 是的,你是对的,我做了$stmt->bind_param('si',$iden,$iden);,因为 id 是 Int(11) `
【解决方案2】:

问题是您在准备语句中指定了要绑定两个值。但是在 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;
        }
    }
}

}

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2016-09-11
    • 2012-03-26
    相关资源
    最近更新 更多