-2

我真的不明白为什么这不起作用,我被返回到正确的标题但该项目仍在数组中!

这是从数组中删除的代码:

<?php
session_start();
if ( !isset($_SESSION['username']) )
{
  header("Location:loginform.php");
  exit();
}

foreach ($_SESSION['list'] as $key => $disk)
{
  if (($_SESSION['list'][$key]['bookisbn']) - ($_GET['bookisbn'])== 0)
  {
    unset($_SESSION['list'][$key]);
    break;
  }
}
header("Location: ".$_GET['location']);
exit();
?>

感谢您提供的任何帮助

4

4 回答 4

0

这只是一个猜测,但问题可能在于

$_GET['bookisbn']

被视为字符串。因此,如果将其转换为 int,则 if 语句将返回 true,从数组中删除该项目。

引入这段代码:

// Casting the ISBN to an integer here
$bookISBN = (int) $_GET['bookisbn'];

if( ($_SESSION['list'][$key]['bookisbn'] - $bookISBN) == 0 ) {
    // Unset item
}
于 2012-04-09T14:18:39.963 回答
0

在标题之前尝试 session_write_close() 。也许是不储蓄。

你也可以这样做:

$mydata = $_SESSION['list'] ;

//do something with $mydata

$_SESSION['list'] = $mydata;

这将使代码更容易阅读,如果您有其他类型的错误,这样您就不会再犯同样的错误。

于 2012-04-09T14:19:07.550 回答
0

我会听 Artragis,但也试试这个:

每个变量都有括号,但实际上是减法必须等于零。所以,而不是:

if (($_SESSION['list'][$key]['bookisbn']) - ($_GET['bookisbn'])== 0)
{
    unset($_SESSION['list'][$key]);
    break;
}

尝试:

if (($_SESSION['list'][$key]['bookisbn'] - $_GET['bookisbn']) == 0)
{
    unset($_SESSION['list'][$key]);
    break;
}

编辑:

我还将 Session 和 GET 变量都转换为 INT,就像提到的其他海报之一一样。

于 2012-04-09T14:19:32.697 回答
-1

您需要调试和测试是否可以访问带有 unset 的行。

您需要调试意味着您需要验证每个程序的步骤和每个变量。
您需要测试是否可以访问带有未设置的行,这意味着您必须在未设置时回显某些内容:

foreach ($_SESSION['list'] as $key => $disk)
{
  var_dump("---\n",$_SESSION['list'][$key]['bookisbn'],$_GET['bookisbn']);
  var_dump($_SESSION['list'][$key]['bookisbn'] - $_GET['bookisbn']);
  var_dump($_SESSION['list'][$key]['bookisbn'] - $_GET['bookisbn'] == 0);

  if ($_SESSION['list'][$key]['bookisbn'] - $_GET['bookisbn'] == 0)
  {
    unset($_SESSION['list'][$key]);
    var_dump($_SESSION['list']);
    break;
  }
}
//comment out header to prevent moving out of page
#header("Location: ".$_GET['location']);
exit();

运行此代码并查看是否有任何值错误或意外。

于 2012-04-09T14:35:05.343 回答