-3

我正在制作一个登录系统,这是我的脚本。我不知道出了什么问题,可能是查询。

<?php
$username = $_POST['Username'];
$password = $_POST['password'];
//connect to database
$username = stripslashes($username);
$username = mysql_real_escape_string($username);
$Dbhost = 'localhost' ;
$dbname = 'users';
$dbuser = 'root';
$dbpass = '';
mysql_connect ($Dbhost , $dbuser , $dbpass);

//query

$query = "SELECT Password
FROM UsPa
WHERE Username = '$username';";

if (mysql_query($query) == $password){
header('Location: page1.html');
}
else{
header('Location: login.html');
}
?>

它不会转到 page1.html。我想弄清楚;有任何建议、意见或疑虑吗?

4

3 回答 3

3

如果我正确阅读了您的帖子并理解了问题,那么页面永远不会重定向到 page1 的原因是因为条件永远不正确。

由于您必须从 mysql 查询中提取信息才能使用它(mysql_fetch_assoc/array/object),因此您将条件设置为 false。

如果发布的密码(上线前请确保输入安全!)需要与输出匹配,则需要使用上述条件之一解析查询调用。

话虽如此,根据您所需的最终结果,这里最可能需要的函数将是 mysql_num_rows。

以防万一,我将在此处发布这两个可能问题的示例。

如果您需要检查用户名和密码是否匹配,请执行以下操作:

<?php
// Posted data -- please check and secure -- this is not secure, as it stands.
$username = $_POST['Username'];
$password = $_POST['password'];

//connect to database
$username = stripslashes($username);
$username = mysql_real_escape_string($username);
$Dbhost = 'localhost' ;
$dbname = 'users';
$dbuser = 'root';
$dbpass = '';
mysql_connect ($Dbhost , $dbuser , $dbpass);

//query
$query = mysql_query("SELECT `Password` FROM `UsPa` WHERE `Username` = '$username' AND `Password` = '{$password}' LIMIT 1");
if (mysql_num_rows($query) == 1)
{
    header('Location: page1.html');
}
else
{
    header('Location: login.html');
}
?>

或者,如果您实际上只是想检查用户名,然后出于某种原因检查密码,请使用它。

<?php
// Posted data -- please check and secure -- this is not secure, as it stands.
$username = $_POST['Username'];
$password = $_POST['password'];

//connect to database
$username = stripslashes($username);
$username = mysql_real_escape_string($username);
$Dbhost = 'localhost' ;
$dbname = 'users';
$dbuser = 'root';
$dbpass = '';
mysql_connect ($Dbhost , $dbuser , $dbpass);

//query
$query  = mysql_query("SELECT `Password` FROM `UsPa` WHERE `Username` = '$username';");
$result = mysql_fetch_assoc($query);
if ($result['Password'] == $password)
{
    header('Location: page1.html');
}
else
{
    header('Location: login.html');
}
?>

考虑到这一点,我建议采取最重要的行动,因为除了检查数据库并验证结果的输出之外,做任何事情都是没有意义的。

编辑:虽然你说你是编程新手,这可能是告诉你这个的最好机会,因为你可以学习这个而不是 mysql_ - 你应该看看 mysqli_

I代表Improved,是mysql引擎的更新版本。

在 mysql_ 上使用 mysqli_ 的原因是 mysql_ 现在已弃用,并且在以后的 php 版本中它可能无法使用 - 任何人都猜测是什么版本,但总有一天会发生。

两者在语法上没有太大区别,但可能值得研究一个数据库类并在以后使用它,这将使切换数据库变得更加容易(例如 mysql_ 到 mysqli_ ) 而不必让您编辑代码的每个文件。

作为编程新手,这对您现在可能意义不大,但绝对值得研究以节省您以后的时间,但是当您学习时,只需学习它而不是必须通过您的代码进行更改是有意义的另一天。

于 2013-10-20T00:05:20.847 回答
1
if (mysql_query($query) == $password){

这条线不起作用。mysql_query() 不返回与$password.

你需要做:

$result = mysql_query($query);
$data = mysql_fetch_assoc($result);
$user_password = $data['Password'];

if ($user_password == $password) {
...

考虑到这一点,即使您只是在学习,也不应该使用 mysql。它已被弃用。至少,学习使用 mysqli。

于 2013-10-19T23:56:32.223 回答
-1

编辑:您正在将 mysql_query 结果资源与用户的密码字符串进行比较,尝试像这样添加 fetch_assoc() :

$username = $_POST['Username'];
$password = $_POST['password'];
//connect to database
$username = stripslashes($username);
$username = mysql_real_escape_string($username);
$Dbhost = 'localhost' ;
$dbname = 'users';
$dbuser = 'root';
$dbpass = '';
mysql_connect ($Dbhost , $dbuser , $dbpass);

//query
$query = "SELECT Password
FROM UsPa
WHERE Username = '$username';";

$result = mysql_query($query);
$row = mysql_fetch_assoc($result);

if ($row['Password'] === $password){
    header('Location: page1.html');
}else{
    header('Location: login.html');
}

我会使用 mysqli 而不是已弃用的 mysql php 函数。我还建议使用准备好的语句,您不需要使用带斜杠和转义来清理您的输入。尝试使用这些资源。 http://php.net/manual/en/book.mysqli.php

您的带有 mysqli 和准备好的语句的代码看起来像这样(未经测试)

$username = $_POST['Username'];
$password = $_POST['password'];
$Dbhost = 'localhost' ;
$dbname = 'users';
$dbuser = 'root';
$dbpass = '';

$query = "SELECT Password
FROM UsPa
WHERE Username = '?";

$db = new mysqli($Dbhost, $dbuser, $dbpass, $dbname);
$stmt = $db->stmt_init();

$stmt->prepare($query))

$stmt->bind_param("s",$username);
$stmt->execute();
$stmt->bind_result($dbPw);
$stmt->fetch();

if ( $dbPw === $password ) {
    header('Location: page1.html');
} else{
    header('Location: login.html');
}

$stmt->close();
于 2013-10-19T23:56:50.287 回答