使用 MySQLi 检查用户名是不是已存在

Posted

技术标签:

【中文标题】使用 MySQLi 检查用户名是不是已存在【英文标题】:Check if the username already exists with MySQLi使用 MySQLi 检查用户名是否已存在 【发布时间】:2013-04-29 08:36:07 【问题描述】:

在创建新用户之前,我尝试检查输入字段中的用户名和电子邮件是否已存在于我的数据库中。

这是 login.php

<?php
session_start();
$pseudo = $_POST['pseudo'];
$mail = $_POST['mail'];

$pseudo=mysql_real_escape_string($pseudo);
$pseudo=ltrim($pseudo);
$pseudo=rtrim($pseudo);

$mail=mysql_real_escape_string($mail);
$mail=trim($mail);

$sql=mysqli_connect('localhost','root','','bdd_name');
$query=("SELECT COUNT(*) FROM t_people WHERE 'PEO_PSEUDO'='".$pseudo."' OR 'PEO_MAIL'='".$mail."'");
$result = mysqli_prepare($sql,$query);

    mysqli_stmt_execute($result);
    mysqli_stmt_store_result($result);

if (mysqli_stmt_num_rows($result) == 0) 
  echo 1;
 
 else 
 echo 2;
 
mysqli_stmt_free_result($result);
mysqli_stmt_close($result);
?>

这是我的 javascript 的一部分:

var pseudo=$("#pseudo").val();
var mail=$("#mail").val();
    $.ajax(
        type: "POST",
        url: "login.php",
        data: pseudo:pseudo, mail:mail
        ).done(function(result) 
            if (result==1) 
                good();
            
            else if (result==2) 
                bad();
            
        );

谁能告诉我这是怎么回事?

我从几个小时就开始了,我一无所知......

【问题讨论】:

这是使用准备好的语句的错误方式。如果您真的想使用这种语法,请使用mysqli_real_escape_string。您是否看到错误消息? 当我尝试 mysqli_real_escape_string 时,它一直在加载。我不知道为什么。而且我不知道如何显示错误消息,实际上我很菜鸟。 在您打开连接之后使用它,但同样,以正确的方式使用准备好的语句,就像他的回答中描述的redreggae。使用error_reporting(E_ALL); 显示错误消息。 谢谢,我会阅读文档中的错误函数。 【参考方案1】:

您在查询中使用了错误的运算符来转义使用反引号运算符,如下所示

"SELECT COUNT(*) FROM t_people WHERE `PEO_PSEUDO`='".$pseudo."' OR `PEO_MAIL`='".$mail."'"

【讨论】:

谢谢。我没有注意到,但结果还是一样。 -1 用于反制有效方法。他想知道是否已经使用了电子邮件或登录,而不是数据库中出现了多少电子邮件/登录,因此不使用LIMIT 1 只是一种浪费,因为知道是否有0non 0 就足够了符合给定条件的行。 @MarcinOrlowski 我在下面的答案中添加了LIMIT 1。但是COUNT(*) 总是有 1 行?! @regreggae 是的,理论上你是正确的。它应该始终为 0 或 1 行,但没有 LIMIT db 在找到第一行后不会停止。这就是我的观点。 谢谢。我刚刚添加了限制 1。【参考方案2】:

有些事情出了问题。 不要使用mysql_real_escape_string,因为您正在使用mysqli_*。请改用mysqli_real_escape_string。但最好使用mysqli_stmt_bind_param,因为您正在使用准备好的语句。如果你使用COUNT(*),你总是会得到 1 行。

$pseudo = $_POST['pseudo'];
$mail = $_POST['mail'];

$query = "SELECT * FROM t_people WHERE PEO_PSEUDO = ? OR PEO_MAIL = ? LIMIT 1";
$stmt = mysqli_prepare($sql, $query);
mysqli_stmt_bind_param($stmt, 'ss', $pseudo, $mail);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$numRows = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);

使用COUNT(*)(效率更高)如下:

$query = "SELECT COUNT(*) as numrows FROM t_people WHERE PEO_PSEUDO = ? OR PEO_MAIL = ?";
...
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $numRows);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

// work with $numRows

【讨论】:

哇,它现在可以工作了。谢谢: $sql=mysqli_connect('localhost','root','','bdd_name'); $query = "SELECT COUNT(*) as numrows FROM t_people WHERE PEO_PSEUDO = ? OR PEO_MAIL = ? LIMIT 1"; $stmt = mysqli_prepare($sql, $query); mysqli_stmt_bind_param($stmt, 'ss', $pseudo, $mail); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $numRows); mysqli_stmt_fetch($stmt);回声 $numRows; mysqli_stmt_close($stmt);

以上是关于使用 MySQLi 检查用户名是不是已存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSTL 检查会话中是不是存在已登录用户?

如何检查文件中是不是已存在用户名并将其积分添加给他?

检查用户是不是已存在于 localStorage

检查用户 phone_number 是不是已存在于 aws cognito 用户池中

使用 PHP 检查用户名和电子邮件是不是已经存在 [重复]

如何检查 Twilio.Device 处理程序是不是已存在