-1

我对 OOP(?如果这是 OOP,我不知道)语言有点陌生,我正在尝试使用 MySQLi 制作一个简单的登录过程。问题是,代码不起作用。我无法登录(并且它没有显示任何错误)并且我无法注册新帐户(同样的问题) - 就像代码已经死了一样。

我不确定我做对了,但这是我迄今为止最好的。因为我是 OOP 的新手(?)。

索引.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&auml;ndarnamnet eller l&ouml;senordet &auml;r fel!</div>";
                    }
                }
            ?>

我想如果我能解决第一个错误,我也可以解决第二个错误。谢谢!

4

3 回答 3

1

我建议您更改代码的许多内容:

  • mysql_real_escape_string()如果您使用的是 mysqli,请不要使用。您不能混合使用这些 API。

  • 无需转义返回的字符串md5(),因为它保证只包含十六进制数字。

  • 无论如何都不要使用mysqli_real_escape_string()——改用参数。

  • 始终检查是否prepare()execute()返回false;如果他们这样做,则报告错误并退出。

  • 您可以使用准备好的语句获得 mysqli 结果mysqli_stmt_store_result()

  • 如果您不需要SELECT *所有列,请不要这样做。在这种情况下,您已经拥有了$username,所以您真正需要获取的只是该id列。

  • 无需检查返回的行数,只需启动一个循环获取行(如果有)。由于您退出循环,因此仅当循环获取零行时才会输出“else”错误子句。

  • 考虑使用比 MD5 更强的密码散列函数。此外,在散列之前在密码中添加盐。阅读您可能错误地存储了密码

例子:

<?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&auml;ndarnamnet eller l&ouml;senordet &auml;r fel!</div>";
}
?>
于 2013-07-18T19:24:38.367 回答
0

在脚本顶部输入的一个很好的命令(在

ini_set('display_errors', 1);

这将在您的脚本上显示任何错误,而无需更新 php.ini(在许多情况下)。如果您尝试此操作并需要更多帮助,请在此处发布错误消息,我将能够提供更多帮助。

此外,如果您正在使用$_SESSION,您应该有

session_start();

在脚本的顶部

于 2013-07-18T19:04:01.173 回答
-1

确保您的 php 设置为在 php.ini 文件中显示错误。您需要自己对此进行一些研究,但这很容易做到。这样,您将能够看到错误是什么并从那里开始。

于 2013-07-18T19:02:56.960 回答