获取错误:类mysqli的对象无法在第5行转换为字符串

时间:2017-02-14 02:10:49

标签: php mysqli

我收到了这个错误:

  

捕获致命错误:第5行的C:\ xampp \ htdocs \ gym \ userAvailability.php中无法将类mysqli的对象转换为字符串

这是代码:

<?php

function username_exists($username, $con){

    $sql = "SELECT * FROM admin WHERE username = '$username'";
    $result = mysqli_query($con, sql);
    $resultarr = mysqli_fetch_assoc($result);


    if(!mysqli_num_rows($result) == 1){
        return true;
    }else{
        return false;
    }
}

我还检查了.php文件中正在使用function username_exist的所有变量名称,这一切都是正确的。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

首先,这段代码容易受到SQL注入攻击 - 你应该使用带有占位符的预准备语句。你也在提取未使用的结果 - 所以你可以摆脱这个函数中的mysqli_fetch_assoc()

您的实际问题是$sql前面缺少一个美元符号,此处if(!mysqli_num_rows($result) == 1) {的逻辑是反向的。如果有结果,您基本上会得到!1 == 1,这是假的(!1变为0,因此您获得0 == 1)。因此,反向运算符!的结果是相反的。

清理了一下,修复了逻辑问题并添加了准备好的语句,看起来像这样

function username_exists($username, $con){
    $stmt = $con->prepare("SELECT * FROM admin WHERE username = ?");
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $stmt->store_result();
    $num_rows = $stmt->num_rows;
    $stmt->close();

    return $num_rows == 1 ? true : false;
}

如果在数据库中找到用户名,则此函数现在将返回true。您现在应该使用此功能,如

if (!username_exists($_POST['username'], $con) {
    /* Do the insert to the database here */
} else {
    /* The username was taken!
       Don't perform the INSERT query */
}

$username参数传递给函数时,请使用原始用户名(此处不要使用mysqli_real_escape_string(),因为我们正在使用预准备语句)。

您可能还希望在数据库中添加用户名列的UNIQUE约束。