【问题标题】:Ajax call with PHP / MySQLi query returning wrong results [duplicate]使用 PHP / MySQLi 查询返回错误结果的 Ajax 调用 [重复]
【发布时间】:2020-02-13 03:36:00
【问题描述】:

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

到目前为止,我得到了以下信息,但这总是返回“无效”(即使我输入了匹配值),所以我的猜测是我的 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');
            }
        }
    });
});

我的 PHP:

$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";
}

【问题讨论】:

  • $stmt->num_rows 的实际值是多少?
  • 您是否在浏览器的开发者工具中查看了请求/响应以查看实际返回的内容?
  • 在代码中使用die($conn->connect_error); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
  • 关于您最近的问题的最后一点。你不要在数组上使用while。使用 fetch_all 你必须使用 foreach

标签: php mysql select mysqli


【解决方案1】:

没有理由使用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_rows,您要么必须在语句上调用store_result(),然后从语句中获取num_rows,要么调用get_result() 并读取@987654328 的值@ 在返回的结果集上。

【讨论】:

    【解决方案2】:

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

    ...
    $stmt->execute();
    $stmt->store_result();
    
    if($stmt->num_rows > 0) {
        ...
    

    你必须调用store_result()的原因是没有这个,实际上并没有获取任何结果,因此行数(num_rows)将是0

    参考num_rows的官方文档:

    返回结果集中的行数。指某东西的用途 mysqli_stmt_num_rows() 取决于你是否使用 mysqli_stmt_store_result() 缓冲整个结果集在 语句句柄。

    链接是here

    【讨论】:

    • 非常感谢。这正是这里所缺少的!还有一个问题:它仍然无法识别我的结果,因为这似乎包含我在 PHP 中回显的文本前面的符号(“有效”/“无效”)。当我在 JQuery 中提醒它时,它会在我的文本前面显示这个符号。我怎样才能摆脱这个,结果只是我的文字?
    • @keewee279 关于您的其他问题,我认为这可能值得单独提出。但是,如果您在 PHP 代码中没有 echo'd 它,那么在返回值之前出现符号\字符会很奇怪。请确保在您的新问题中包含一个示例
    • 根据我之前的评论,它仍然返回我无效。我现在只在提醒结果时看到不同之处,但对于任何值仍然无效。
    • @keewee279 这很奇怪。您是否尝试在 PHP 中转储 num_rows 的值以查看其中包含的内容?如果用户名匹配,则 SQL 语句应至少返回 1 行
    • 看来我不得不修剪输出,不知道为什么,但它适用于您的解决方案,所以我现在接受它。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多