我收到了这个错误:
捕获致命错误:第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
的所有变量名称,这一切都是正确的。关于如何解决这个问题的任何想法?
答案 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
约束。