如何更正此错误 注意:会话已启动且索引未定义


How do i correct this error Notice: A session had already been started and Undefined index

我需要有人来纠正我的错误,这是错误

Notice: Undefined index: login in C:'xampp'htdocs'bank'index.php on line 10
Notice: Undefined index: password in C:'xampp'htdocs'bank'index.php on line 10
Notice: A session had already been started - ignoring session_start() in C:'xampp'htdocs'bank'header.php on line 2

$result = mysql_query("SELECT * FROM customers WHERE loginid='$_POST[login]' AND accpassword='$_POST[password]'"); if(mysql_num_rows($result) == 1)

if(isset($_POST['password'],$_POST['login']))
{
    //Your new, safe, PDO/mysqli query
}

至于会话,如果您没有不同的包含,只需删除重复的session_start(),如果文件有时是独立的,有时是整个项目的一部分,请添加以下检查:

//PHP >= 5.4
if(session_status()==PHP_SESSION_NONE) session_start();
//PHP < 5.4
if(session_id()=='') session_start();

这将检查会话是否已启用,但尚未启动任何会话。

本答案中涵盖了有关更安全的数据库处理的信息,请务必检查该答案中的链接

Notice: Undefined index: login意味着在您的数组中,没有以"login"作为索引的条目。因此,在您的情况下,这意味着 $_POST 不包含"登录"密钥。您必须验证这些索引是否存在。

isset($_POST['login'])是一个很好的方法。

array_key_exists('login', $_POST)是另一种方式。

会议通知

你有一个会话从某个地方开始,然后在C:'xampp'htdocs'bank'header.php的第二行再次出现。如果 PHP>= 5.4.0,您应该这样做:

if (session_status() == PHP_SESSION_NONE) {
  session_start();
  }

如果 PHP <5.4.0

if(session_id() == '') {
  session_start();
  }

这可以在这里看到:检查PHP会话是否已启动。

未定义的索引和其他问题

但是,您的代码存在以下问题:

  • 它受制于SQL注入。
  • mysql_*不再安全了。您应该使用 PDO 或 MySQLi 来处理数据库。
  • 您是否认真地将密码以纯文本形式存储在数据库中?您需要正确散列它们。

修复它(PHP>= 5.5):

$DB = new PDO(/* CORRECT PARAMETERS HERE */);
if (isset($_POST['login']) && isset($_POST['password'])) {
  $STH = $DB->prepare("SELECT * FROM customers WHERE loginid = ?");
  $STH->execute(array($_POST['login']));
  $Result = $STH->fetch();
  if(password_verify($_POST['password'], $Result['password'])) {
    /* Do what you need to do */
    }
  }

对于 PHP <= 5.5,您需要添加一个库来使用 if(password_verify(...)) 。查看password_compat库以获取更多信息,但基本上是这样的:

include "password_compat.php";
$DB = new PDO(/* CORRECT PARAMETERS HERE */);
if (isset($_POST['login']) && isset($_POST['password'])) {
  $STH = $DB->prepare("SELECT * FROM customers WHERE loginid = ?");
  $STH->execute(array($_POST['login']));
  $Result = $STH->fetch();
  if(password_verify($_POST['password'], $Result['password'])) {
    /* Do what you need to do */
    }
  }

对于未定义,您需要检查变量是否像这样设置。

if (isset($_POST[login]) && isset($_POST[password])) {
    // your code here
}

对于 A 会话已启动

您已经在header.php以外的其他地方使用了session_start()。 所以你需要从任何一个页面中删除它