我是OOP的新手(?如果这是OOP,我不知道)语言,我正在尝试使用MySQLi进行简单的登录过程。问题是代码不起作用。我无法登录(并且它没有向我显示任何错误)并且我无法注册新帐户(同样的问题) - 这就像代码已经死了或者什么。
我不确定我做得对,但到目前为止这是我最好的。因为我是OOP的新手(?)。
的index.php:
<?php
if(isset($_POST['submit'])) {
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string(md5($_POST['password']));
$userControl = "SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";
$userControlResult = $mysqli->query($userControl);
if($mysqli->num_rows($userControlResult) > 1) {
$userRow = $mysqli->fetch_assoc($userControlResult);
$dbid = $userRow['id'];
$dbuser = $userRow['username'];
$_SESSION['id'] = $dbid;
$_SESSION['username'] = $dbuser;
header("location: me.php");
die();
} else {
echo "<div class='errorField'>Användarnamnet eller lösenordet är fel!</div>";
}
}
?>
我想如果我能解决第一个错误,我也可以解决第二个问题。 谢谢!
答案 0 :(得分:1)
我建议更改您的代码的很多事情:
如果你正在使用mysqli,请不要使用mysql_real_escape_string()
。您无法混合使用这些API。
无需转义md5()
返回的字符串,因为它保证只包含十六进制数字。
无论如何都不要使用mysqli_real_escape_string()
- 请改用参数。
始终检查prepare()
或execute()
是否返回 false ;如果他们这样做,那么报告错误并退出。
您可以使用mysqli_stmt_store_result()
从准备好的声明中获取mysqli结果。
如果您不需要所有列,请不要SELECT *
。在这种情况下,您已经拥有$username
,因此您真正需要获取的是id
列。
无需检查返回的行数,只需启动循环获取行(如果有)。因为你退出循环,你的&#34;否则&#34;仅当循环获取零行时才会输出错误子句。
考虑使用比MD5更强的密码散列函数。此外,在散列之前向密码添加salt。阅读You're Probably Storing Passwords Incorrectly。
示例:
<?php
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$userControl = "SELECT id FROM users WHERE username=? AND password=?";
if (($userControlStmt = $mysqli->prepare($userControl)) === false) {
trigger_error($mysqli->error, E_USER_ERROR);
die();
}
$userControlStmt->bind_param("ss", $username, $password);
if ($userControlStmt->execute() === false) {
trigger_error($userControlStmt->error, E_USER_ERROR);
die();
}
$userControlResult = $userControlStmt->store_result();
while($userRow = $userControlResult->fetch_assoc()) {
$_SESSION['userid'] = $userRow["id"];
$_SESSION['username'] = $username;
header("location: me.php");
die();
}
// this line will be reached only if the while loops over zero rows
echo "<div class='errorField'>Användarnamnet eller lösenordet är fel!</div>";
}
?>
答案 1 :(得分:0)
一个很好的命令进入脚本的顶部(在
ini_set('display_errors', 1);
这将显示脚本上的任何错误,而无需更新php.ini(在许多情况下)。如果您尝试此操作并需要更多帮助,请在此处发布错误消息,我将能够提供更多帮助。
此外,如果您使用$_SESSION
,则应该
session_start();
在脚本下面的
答案 2 :(得分:-1)
确保您的php设置为在php.ini文件中显示错误。你需要自己做一些研究,但这很容易做到。这样,你就能看到错误是什么,并从那里开始。