$conn
正确连接到数据库。
数据库的用户表包含以下字段ID,名称,电子邮件,用户名和密码。表中的一个条目包含 benedict 作为用户名的值。
代码:
$userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
$userslist->bind_param("s",$user);
$usersresult=$userslist->execute();
if($userslist->num_rows>0)
{
$userErr="Username already exists";
$errors++;
}
问题:
当我输入用 benedict 作为值的用户名(存储在$ user中)时,代码不会检测到重复的ID,尽管已经有了这样的用户名。此外,打印时$userslist->num_rows
显示为0。
相反,以下代码正确识别出已存在重复的ID并打印错误。 (这证明没有连接错误或表错误)
$query="SELECT * FROM users WHERE username='".$user."'";
$qresult=mysqli_query($conn,$query);
if($qresult->num_rows>0)
{ $userErr="Username already exists";
$errors++;
}
我知道唯一密钥和PDO是更好的解决方案。但是为什么在使用预准备语句时它不能打印出正确的结果。
答案 0 :(得分:1)
受影响的行结果为: -1 表示查询返回了错误,因此未执行。
检查查询列/表名称中的错误等。
您的连接是否有效?
请尝试以下方法进行调试:
$userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
$userslist->bind_param("s",$user);
$usersresult=$userslist->execute();
print_r($conn->error);
答案 1 :(得分:0)
我建议使用PDO开始,它对数据库查询更安全。 http://php.net/manual/en/book.pdo.php。我还建议您使用计数而不是SELECT *。这是一个浪费的检查,看看是否存在一行,使用计数会更有效。
你可以这样使用PDO。
$stmt = $db->prepare("SELECT count(1) FROM users WHERE username=?");
$stmt->execute(array($user));
$result = $stmt->fetch();
if($result)
{
if($result[0] == 1) echo "Username already taken";
else "username free";
}
else
{
echo "error";
}
答案 2 :(得分:0)
因此错误不受影响行:检查查询失败的原因:
`
<?php
$userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
$userslist->bind_param("s",$user);
$usersresult=$userslist->execute();
if($userslist->num_rows>0)
{
$userErr="Username already exists";
$errors++;
}
elseif($userlist->affected_rows == -1) {
echo 'An error occurred: ' . $conn->error;
}
&GT?; ` 但是你确实意识到,在检查和实际插入之间的几毫秒内,可能会有另一个用户插入完全相同的名字?
添加:当用户名为唯一索引时如何执行此操作:
<?php
$userslist = $conn->prepare("INSERT INTO users (username, name, etc) VALUES (?,?, ?)");
$userslist->bind_param("sss",$user, $name, $etc);
$usersresult=$userslist->execute();
if($conn->errno == 1062) {
$userErr="Username already exists";
$errors++;
}
elseif($conn->errno) {
echo 'An error occurred: ' . $conn->error;
}
else {
if($userlist->affected_rows == 1) {
echo 'success';
}
else {
echo 'unknown why not inserted';
}
}
?>
答案 3 :(得分:0)
你可以这样做。
if(mysqli_num_rows($userslist) > 0){
echo "username already exists"
}
答案 4 :(得分:0)
你试过了吗?
$conn = new mysqli("localhost","user","password","db");
$sql = "SELECT * FROM users where username='".$_POST['username']."'";
$result = $conn->query($sql);
$count = $result->num_rows;
if($count > 0)
{
echo "Username ".$_POST['username']." already exists!";
}