PHP MySQLI(OOP?) - 代码根本不起作用

时间:2013-07-18 18:57:27

标签: php oop mysqli

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

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

3 个答案:

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

答案 1 :(得分:0)

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

ini_set('display_errors', 1);

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

此外,如果您使用$_SESSION,则应该

session_start();

在脚本下面的

答案 2 :(得分:-1)

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