Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQLI(OOP?)-代码不';我根本不工作_Php_Oop_Mysqli - Fatal编程技术网

PHP MySQLI(OOP?)-代码不';我根本不工作

PHP MySQLI(OOP?)-代码不';我根本不工作,php,oop,mysqli,Php,Oop,Mysqli,我对OOP(如果这是OOP,我不知道)语言有点陌生,我正在尝试用MySQLi做一个简单的登录过程。问题是,代码不起作用。我无法登录(并且没有显示任何错误),也无法注册新帐户(同样的问题)-这就像代码已经失效或是其他什么 我不确定我是否做对了,但到目前为止,这是我最好的一次因为我是新来的OOP(?) Index.php: <?php if(isset($_POST['submit'])) { $username = my

我对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>";
                    }
                }
            ?>

确保您的php设置为在php.ini文件中显示错误。您需要自己对此进行一些研究,但这相当容易。这样,您就可以看到错误并从那里开始。

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

此外,如果您使用的是
$\u会话
,您应该

session_start();

在脚本顶部的下,我建议您更改代码:

ini_set('display_errors', 1);
  • 如果您正在使用mysqli,请不要使用
    mysql\u real\u escape\u string()
    。您不能混合使用这些API

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

  • 无论如何,不要使用
    mysqli\u real\u escape\u string()
    ,而是使用参数

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

  • 您可以使用
    mysqli\u stmt\u store\u result()
    从准备好的语句中获取mysqli结果

  • 如果不需要所有列,请不要
    选择*
    。在这种情况下,您已经拥有
    $username
    ,因此真正需要获取的只是
    id

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

  • 考虑使用比MD5更强大的密码散列函数。此外,在散列之前在密码中添加一个salt。请阅读

例如:

<?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>";
}
?>

您的if语句正在检查您是否有超过1行—我认为应该是
=1
。此外,您也应该在SELECT上使用一个准备好的语句和绑定变量—您使用的是mysqli,因此您可以使用其内置功能使您的代码更安全。若要随身携带,请确保
session\u start()
正在某个地方被调用。如果没有,您就无法访问
$\u SESSION
变量。为什么要同时使用
mysql\u real\u escape\u string()
mysqli()
呢?您的代码前面有类似的内容吗:
$mysqli=new mysqli(“example.com”、“user”、“password”、“database”)
?除了前面提到的所有内容之外,请确保您在数据库中输入的密码已使用MD5进行哈希运算。否则,它将永远找不到您的用户。此外,我建议使用比MD5更强大的工具,例如SHA256。PHP支持这一开箱即用的工具。请检查:这不是真正的答案,更多的是建议赌注适合评论部分。