我用PHP和Mysql为登录页面编写了一个简单的代码但它总是在条件 (if) 中返回 false 值。怎么了?这是我的代码:
..... (successfully connected to database)
$User = $_POST['username'];
$Pass = md5($_POST['password']);
$sql = "SELECT ID FROM users WHERE Username=$User and Password=$Pass";
$result = $conn->query($sql);
$count = mysql_num_rows($result);
if($count == 1) {
$_SESSION['username'] = $User;
header( 'Location: panel.php' ) ;
}
else {
header( 'Location: login.php?status=1' ) ;
}
}
我的印象是,您在使用mysqli_
函数时$result = $conn->query($sql);
然后使用mysql_
函数mysql_num_rows()
之后使用面向对象的样式进行连接。
-
mysql_
不支持此方法。
根据手册
的面向对象的连接样式示例http://php.net/manual/en/mysqli.query.php:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
这些不同的 API 不会相互混合。
旁注:如果不是这种情况,那么您需要向我们展示您用于连接到数据库的 API。
另外,事实上,在注释中已经建立了您需要在WHERE
子句中引用变量的事实。
因此,您需要更改
$count = mysql_num_rows($result);
自
$count = mysqli_num_rows($result);
或
$count = $result->num_rows;
根据 http://php.net/manual/en/mysqli-result.num-rows.php 使用面向对象的样式。
以及 WHERE
条款
WHERE Username='$User' and Password='$Pass'
我注意到您正在使用MD5。如果是这种情况,强烈建议不要这样做,因为它很旧并且被认为是"破损的"。
我建议您使用 CRYPT_BLOWFISH 或 PHP 5.5 的 password_hash()
函数。对于 PHP <5.5,请使用 password_hash() compatibility pack
。
另外,关于SQL注入,这是你的代码所受的,将mysqli
与预准备语句一起使用,或者将PDO与预准备语句一起使用,它们要安全得多。
@Fred-ii-是正确的。
$sql = "SELECT ID FROM users WHERE Username=$User and Password=$Pass";
将导致此查询发送到数据库:
SELECT ID FROM users WHERE Username=user and Password=password
你需要引用user
和password
,否则MySQL不会知道它们是字符串:
$sql = "SELECT ID FROM users WHERE Username='$User' and Password='$Pass'";
获得$count的正确方法是
$count = $result->rowCount();
如果还有其他问题,我会在这个答案中添加更多内容。