Php 使用mysqli准备的stmt;如果;条件为“||&引用;及&&&引用;操作人员
我正在学习mysqli编写的语句,现在我遇到了一个问题,无法找到解决办法。这是注册表格,包含“用户名”、“电子邮件”和“密码”。如果数据库中已经存在用户名和电子邮件,则不允许注册。我使用了post方法,代码如下:Php 使用mysqli准备的stmt;如果;条件为“||&引用;及&&&引用;操作人员,php,mysql,mysqli,Php,Mysql,Mysqli,我正在学习mysqli编写的语句,现在我遇到了一个问题,无法找到解决办法。这是注册表格,包含“用户名”、“电子邮件”和“密码”。如果数据库中已经存在用户名和电子邮件,则不允许注册。我使用了post方法,代码如下: //validating email if(!filter_var($user_email, FILTER_VALIDATE_EMAIL) === true) { echo "invalid email"; exit(); } //valid email else{
//validating email
if(!filter_var($user_email, FILTER_VALIDATE_EMAIL) === true) {
echo "invalid email";
exit();
}
//valid email
else{
//prepared query
$query_name = "SELECT * FROM users WHERE user_name = ?";
$query_email = "SELECT * FROM users WHERE user_email = ?";
//prepared statements
$stmt_name = mysqli_prepare($conn, $query_name);
$stmt_email = mysqli_prepare($conn, $query_email);
//if bind failure
if((!mysqli_stmt_bind_param($stmt_name, "s", $user_name)) && (!mysqli_stmt_bind_param($stmt_email, "s", $user_email))){
echo "bind unsuccessfull";
exit();
}
else{
//if execution fails
if( !mysqli_stmt_execute($stmt_name) && !mysqli_stmt_execute($stmt_email)){
echo "stmt execution failed";
exit();
}
//else if execution success
else{
$result_name = mysqli_stmt_store_result($stmt_name);
$result_email = mysqli_stmt_store_result($stmt_email);
//rows
$row_name = mysqli_stmt_num_rows($stmt_name);
$row_email = mysqli_stmt_num_rows($stmt_email);
echo $row_name;
echo $row_email;
}
}
}
如果条件起作用,那么它看起来像中和&
之前的第一部分,而第二部分根本不起作用。我已尝试将其注册到数据库中现有的“电子邮件”,但结果仍然为0。
连接良好,工作正常!
如果您有任何帮助,我们将不胜感激>与其编写这么多复杂的代码,不如使用单个查询来完成您的工作
//validating email
if(!filter_var($user_email, FILTER_VALIDATE_EMAIL) === true) {
echo "invalid email";
exit();
}
else{
$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE user_name = ? OR user_email = ?");
mysqli_stmt_bind_param($stmt, 'ss', $user_name, $user_email);
if( !mysqli_stmt_execute($stmt)){
echo "stmt execution failed";
exit();
}else{
$result_name = mysqli_stmt_store_result($stmt_name);
$result_email = mysqli_stmt_store_result($stmt_email);
//rows
$row_name = mysqli_stmt_num_rows($stmt_name);
$row_email = mysqli_stmt_num_rows($stmt_email);
echo $row_name;
echo $row_email;
}
}
$query_name=“从user_name=?或user_email=?”的用户中选择*;
您不需要同时检查两次条件。如果有人通过电子邮件或用户名登录,则此查询将同时检查用户名和电子邮件。我会尝试使用或条件以及try/catch
块将这两个查询一起滚动,以便您可以在某些情况下抛出异常如果不满足某个条件,则分阶段执行
if( !isset( $user_email ) or !filter_var( $user_email, FILTER_VALIDATE_EMAIL ) === true ) {
exit("invalid email");
} else {
try{
if( isset( $user_name, $user_email ) ){
$sql='select `user_name`,`user_email` from `users` where `user_name` = ? or user_email = ?'
$stmt=$conn->prepare( $sql );
if( $stmt ){
$stmt->bind_param('ss', $user_name, $user_email );
$result=$stmt->execute();
if( $result ){
$stmt->store_result();
if( $stmt->num_rows == 1 ){
/* user name &/or email already exists */
$stmt->bind_result( $name, $email );
$stmt->fetch();
printf('whoohoo! - found user "%s" with email "%s"', $name, $email );
} else {
/* no record for username or email*/
/* sql query to insert new user */
}
$stmt->free_result();
$stmt->close();
} else {
throw new Exception('sql query failed to return any results');
}
} else {
throw new Exception('unable to prepare sql');
}
} else {
throw new Exception('username &/or email are missing');
}
}catch( Exception $e ){
echo $e->getMessage();
}
您可以从user\u name=?或user\u email=?的用户处进行类似于$query\u name=“SELECT*”的单个查询这样,您甚至不需要检查两个语句。1)尝试将&
更改为| |
,您需要两个条件都失败。其中一条语句可能失败,只是继续执行脚本。2) 你想让多个名字相同的人在你的网站上注册吗?因为您现在所做的只允许使用一个不同的名字。是的,我只想要一个不同的名字,而且我想知道我们是否可以在if
条件下使用两个准备好的语句。@AlivetoDie yes,谢谢,我确实检查了你的答案,它是这样工作的,但我想知道是只有user\u name
匹配还是只有user\u email
匹配,还是两者都匹配。因此,我创建了两个查询。@Orzoon它将处理每个条件,如用户名匹配或emil匹配或两者都匹配。实际上,它是一个注册表,所以我想知道是否只有“用户名”匹配或是否只有“电子邮件”匹配或两者都匹配。因此,我使用了两个不同的查询。通过使用我的查询,您可以同时检查这两个查询。在这种情况下,您可以匹配用户名和电子邮件进行登录。