使用PHP/MySQLi查询返回错误结果的Ajax调用

使用PHP/MySQLi查询返回错误结果的Ajax调用,php,mysql,select,mysqli,Php,Mysql,Select,Mysqli,我正在尝试检查数据库中是否已经存在输入值 到目前为止,我得到了以下信息,但这总是返回“无效”(即使我输入了匹配值),因此我猜测我的SELECT查询后的部分或if Else逻辑中有错误 有人能告诉我怎么做吗 我的JS: $('#btnCheck').click(function() { var username = $('#username').val(); $.ajax({ url: 'userSubmit.php', type: 'POS

我正在尝试检查数据库中是否已经存在输入值

到目前为止,我得到了以下信息,但这总是返回“无效”(即使我输入了匹配值),因此我猜测我的SELECT查询后的部分或if Else逻辑中有错误

有人能告诉我怎么做吗

我的JS:

$('#btnCheck').click(function() {   
    var username = $('#username').val();

    $.ajax({
        url: 'userSubmit.php',
        type: 'POST',
        data: {username: username},
        success: function(response){
            if(response == 'valid') {
                alert('Valid');
            } else {
                alert('Invalid');
            }
        }
    });
});
$username = $_POST['username'];      
$conn = new mysqli($host, $username, $password, $database);
if($conn->connect_error) {
    die("Connection Error: " . $conn->connect_error);
}
$stmt = $conn->prepare("SELECT username FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

if($stmt->num_rows > 0) {
    echo "valid";
} else {
    echo "invalid";
}
我的PHP:

$('#btnCheck').click(function() {   
    var username = $('#username').val();

    $.ajax({
        url: 'userSubmit.php',
        type: 'POST',
        data: {username: username},
        success: function(response){
            if(response == 'valid') {
                alert('Valid');
            } else {
                alert('Invalid');
            }
        }
    });
});
$username = $_POST['username'];      
$conn = new mysqli($host, $username, $password, $database);
if($conn->connect_error) {
    die("Connection Error: " . $conn->connect_error);
}
$stmt = $conn->prepare("SELECT username FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();

if($stmt->num_rows > 0) {
    echo "valid";
} else {
    echo "invalid";
}

您需要调用
store_result()
,以便在调用
num_rows
之前实际记录行数:

...
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows > 0) {
    ...
必须调用
store\u result()
的原因是,如果没有此函数,则不会实际获取任何结果,因此行数(
num\u rows
)将为
0

有关
num_行
,请参考官方文档:

...
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows > 0) {
    ...
返回结果集中的行数。使用 mysqli_stmt_num_rows()取决于是否使用 mysqli_stmt_store_result(),用于在 语句句柄


此链接是。

在调用
num\u rows
之前,您需要调用
store\u result()
,以便实际记录行数:

...
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows > 0) {
    ...
必须调用
store\u result()
的原因是,如果没有此函数,则不会实际获取任何结果,因此行数(
num\u rows
)将为
0

有关
num_行
,请参考官方文档:

...
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows > 0) {
    ...
返回结果集中的行数。使用 mysqli_stmt_num_rows()取决于是否使用 mysqli_stmt_store_result(),用于在 语句句柄


有一个链接是。

没有理由使用
num_rows
,这不仅容易混淆、误用,而且如果误用还会导致性能问题

只需获取
COUNT(1)
,然后从SQL结果的第一行获取一列

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli($host, $username, $password, $database);
$conn->set_charset('utf8mb4');

$stmt = $conn->prepare("SELECT COUNT(1) FROM users WHERE username = ?");
$stmt->bind_param("s", $_POST['username']);
$stmt->execute();
$exists = $stmt->get_result()->fetch_row()[0];

if($exists) {
    echo "valid";
} else {
    echo "invalid";
}

如果您出于某种奇怪的原因想要坚持使用
num\u rows
,则必须在语句上调用
store\u result()
,然后从语句中获取
num\u rows
,或者调用
get\u result()
并读取返回结果集中
num\u rows
的值

没有理由使用
num_rows
,这不仅容易混淆、误用,而且如果误用还会导致性能问题

只需获取
COUNT(1)
,然后从SQL结果的第一行获取一列

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli($host, $username, $password, $database);
$conn->set_charset('utf8mb4');

$stmt = $conn->prepare("SELECT COUNT(1) FROM users WHERE username = ?");
$stmt->bind_param("s", $_POST['username']);
$stmt->execute();
$exists = $stmt->get_result()->fetch_row()[0];

if($exists) {
    echo "valid";
} else {
    echo "invalid";
}


如果您出于某种奇怪的原因想要坚持使用
num\u rows
,则必须在语句上调用
store\u result()
,然后从语句中获取
num\u rows
,或者调用
get\u result()
并读取返回结果集中
num\u rows
的值

$stmt->num_rows
的实际值是多少?您是否在浏览器的开发工具中查看了请求/响应以查看实际返回的内容?使用
die($conn->connect_error)是一个非常糟糕的主意
在您的代码中,因为它可能会泄漏敏感信息。更多解释请参见本文:关于您最近的问题的最后一点说明。在阵列上不使用while。使用fetch\u,您必须使用foreach,
$stmt->num\u rows
的实际值是多少?您是否在浏览器的开发工具中查看请求/响应以查看实际返回的内容?使用
die($conn->connect\u error)是一个非常糟糕的主意
在您的代码中,因为它可能会泄漏敏感信息。更多解释请参见本文:关于您最近的问题的最后一点说明。在阵列上不使用while。有了fetch_,你就可以用foreach了,非常感谢。这正是我们所缺少的!还有一个问题:它仍然无法识别我的结果,因为它似乎在我在PHP中回显的文本前面包含一个符号(“有效”/“无效”)。当我在JQuery中提醒它时,它会在我的文本前面显示这个符号。我怎样才能摆脱这个问题,使结果只是我的文本?@keewee279关于你的另一个问题,我认为这可能值得单独提问。但是,如果在PHP代码中没有
echo
,那么在返回值之前出现一个符号\字符将非常奇怪。请确保在你的新问题中包括一个例子。根据我之前的评论,它仍然返回无效。我现在只在提示结果时看到一个difference,但在其他情况下仍然对任何值无效。@keewee279这很奇怪。您是否尝试过在PHP中转储
num_rows
的值以查看它包含的内容?如果用户名匹配,SQL语句应该至少返回1行。我似乎必须修剪输出,不知道为什么,但它可以与您的解决方案一起工作,所以我现在就接受它。再次感谢你的帮助!谢谢。这正是我们所缺少的!还有一个问题:它仍然无法识别我的结果,因为它似乎在我在PHP中回显的文本前面包含一个符号(“有效”/“无效”)。当我在JQuery中提醒它时,它会在我的文本前面显示这个符号。我怎样才能摆脱这个问题,使结果只是我的文本?@keewee279关于你的另一个问题,我认为这可能值得单独提问。但是,如果在PHP代码中没有
echo
,那么在返回值之前出现一个符号\字符将非常奇怪。请确保在你的新问题中包括一个例子。根据我之前的评论,它仍然返回无效。我现在只在提示结果时看到一个difference,但在其他情况下仍然对任何值无效。@keewee279这很奇怪。您是否尝试过在PHP中转储
num_rows
的值以查看它包含的内容?如果用户名匹配,SQL语句应该至少返回1行。我似乎必须修剪输出,不知道为什么,但它可以工作