我使用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' ) ;
}
}
答案 0 :(得分: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使用面向对象的样式。
和<{p}的WHERE
子句
WHERE Username='$User' and Password='$Pass'
我注意到你正在使用MD5。如果是这种情况,则非常气馁,因为它已经过时并被视为“破损”。
我建议您使用CRYPT_BLOWFISH或PHP 5.5的password_hash()
功能。对于PHP&lt; 5.5使用password_hash() compatibility pack
。
另外,关于SQL注入,这是您的代码所适用的,use mysqli
with prepared statements或PDO with prepared statements,,它们更安全。
答案 1 :(得分:0)
@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'";
答案 2 :(得分:0)
获得$ count的正确方法是
$count = $result->rowCount();
如果还有其他问题,我会在此答案中添加更多内容。