Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的MySQL查询在PHP条件检查之前执行?_Php_Mysql_Conditional Statements - Fatal编程技术网

为什么我的MySQL查询在PHP条件检查之前执行?

为什么我的MySQL查询在PHP条件检查之前执行?,php,mysql,conditional-statements,Php,Mysql,Conditional Statements,我正在学习创建条件事件,其中sql签出数据在插入数据之前存在,这样它们就不会冲突 我尝试在php中使用mysql行检查,然后在尝试验证正确执行的查询之前检查查询是否为空 也尝试在条件满足时关闭db连接,但无论如何它都没有价值 $user=addslashesstrtolower$usr; $mail=addslashesstrtolower$mail; $pass=md5addslashes$pwd; $check=$db->querySELECT EXISTSELECT* 来自`用户` 其中较

我正在学习创建条件事件,其中sql签出数据在插入数据之前存在,这样它们就不会冲突

我尝试在php中使用mysql行检查,然后在尝试验证正确执行的查询之前检查查询是否为空

也尝试在条件满足时关闭db连接,但无论如何它都没有价值

$user=addslashesstrtolower$usr; $mail=addslashesstrtolower$mail; $pass=md5addslashes$pwd; $check=$db->querySELECT EXISTSELECT* 来自`用户` 其中较低的“用户名”=较低的“$user” 或更低的“email”=更低的“$mail”; 如果$检查{ $db->close; 返回false; }否则{ $sql=在“用户”`username`、`password`、`email`中插入IGNORE` 值“$user”、“$pass”、“$mail”; $query=$db->query$sql; $db->close; 返回true; }
我希望它在数据为空时执行我的查询,在数据存在时返回false。

您可以这样更改代码

$check = $db->query("SELECT EXISTS(SELECT * FROM `users`
    WHERE LOWER(`username`) = LOWER('$user')
    OR LOWER(`email`) = LOWER('$mail'))");


$check = $conn->query($sql); 
$value = $check->fetch_row()[0];
if($value > 0 ){    
    echo "existed".$value; // you can change accordingly
}else{
    echo "doesn't exist"; // this also
}
因为数据库在1中响应exist查询,在0中响应non exist查询,所以num_行将始终为1,这就是为什么我们无法使用num_行确定是否存在,所以我们必须获取值。

您的主要问题是,只要查询从未失败,$check将始终是真实值。如果查询返回0行,则它仍然是一个true对象

您应该检查是否返回了任何值。您还可以简化查询,因为MySQL不区分大小写,并且不需要检查结果是否存在。使用准备好的语句,代码如下所示

$check = $db->query("SELECT EXISTS(SELECT * FROM `users`
    WHERE LOWER(`username`) = LOWER('$user')
    OR LOWER(`email`) = LOWER('$mail'))");


$check = $conn->query($sql); 
$value = $check->fetch_row()[0];
if($value > 0 ){    
    echo "existed".$value; // you can change accordingly
}else{
    echo "doesn't exist"; // this also
}
$stmt=$db->prepareSELECT从username=?或电子邮件=?; $stmt->bind_参数,$usr,$mail; $stmt->execute; $check=$stmt->fetch; $stmt->close; //如果用户存在,则为True 如果$check{ 返回false; }否则{ $stmt=$db->准备插入用户用户名、密码、电子邮件值?、?、更低; $stmt->bind_参数、$usr、$pass、$mail; $stmt->execute; $stmt->close; }
这就是说,您不应该将md5用于密码-而是将密码哈希与密码验证一起使用。

var\u dump$check给出了什么?您不应该使用addslashes或md5。参数化您的查询,并在需要时使用密码\u哈希和密码\u验证。此外,要添加到@user3783243的注释中,此方法/方法也容易出现争用情况。。如果你想防止重复,你应该向表中添加一个唯一的键。@user3783243它看起来像这个objectmysqli_result3 5{[current_field]=>int0[field_count]=>int1[length]=>NULL[num_rows]=>int1[type]=>int0}我想,用户名和email这两个字段都使用唯一值吗?好的,那你为什么在这里使用或条件@devpro一些应用程序允许登录用户名或电子邮件..完全取决于应用程序。不同的用户可以拥有相同的用户名或相同的电子邮件吗?还是仅仅是独特的组合?我想说的是,电子邮件至少应该是唯一的,但再次-取决于应用程序的功能和结构。请记住,这仍然容易受到竞争条件的影响,假设表中有非唯一键..公平点-您可以使用INSERT INTO。。。在DUPLICATE KEY UPDATE username=username或类似的行上,然后检查受影响的行是什么,或者可能是插入的ID。确实如此。我真的很冒昧,我们还没有看到任何关于这个问题的表结构。它获得了错误通知:未定义的属性:mysqli_result:$num_row请在您的答案中添加一些解释,以便其他人可以从ittry更新的代码中学习。我也检查了我的数据库。它肯定会运行的。