如何在mysqli prepare语句查询中使用'or'
How to use 'or' inside mysqli prepare statement query
我是 mysqli prepare 语句的新手,很惊讶地发现 ||在 mysqli 准备语句查询中没有按预期工作。
我有一个检查用户是否注册的功能,它的评估应该基于唯一的行 ID 和电子邮件 address.Besides,因为 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。
问题是您在准备语句中指定要绑定两个值。但是在 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;
}
}
}
}
我是 mysqli prepare 语句的新手,很惊讶地发现 ||在 mysqli 准备语句查询中没有按预期工作。
我有一个检查用户是否注册的功能,它的评估应该基于唯一的行 ID 和电子邮件 address.Besides,因为 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。
问题是您在准备语句中指定要绑定两个值。但是在 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;
}
}
}
}