array_shift导致我丢失存储在 $_SESSION 中的数组中的元素


array_shift causing me to lose elements in an array stored in $_SESSION

>更新 - 我没有找到问题。我假设删除评论的人是对的,并且 Asset.php 或 array_shift() 被调用了两次。我确实在另一个文件中发现了一个最佳位置,该文件处理表单对象并允许我按预期操作数组而无需删除额外的元素。留下这个以防有人想浏览它。


我有一个由控制器运行的网站.php该网站根据通过开关运行的 GET 值显示不同的页面。相关案例是:

case 'pgImportAsset': {
  require_once FORMS_DIR.'/Asset.php';
  $form = new ImportAssetForm(&$smarty, &$req);
  if(!empty($_SESSION['list'])){
    $form->processTo(&$smarty, array('pg'=>   'pgImportAsset'));
  } else {
    $form->processTo(&$smarty, array('pg'=> 'pgListClip'));
  }
  break;
}

$_SESSION['list'] 变量是一个数组,用于存储来自上传这些文件的 Java 小程序的文件名字符串。数组被完美初始化为类似

Array
(
  [0] => 0.jpg
  [1] => 1.jpg
  [2] => 2.jpg
  [3] => 3.jpg
  [4] => 4.jpg
)

等等。这就是它变得奇怪的地方。数组递减的一行位于资产中.php

$this->filename=array_shift($_SESSION['list']);

数组将进入该页面的实例,我将在该行之前和之后有一个print_r语句。即使数组包含所有 5 个元素,也会显示两个 print 语句。

Array
(
  [0] => 1.jpg
  [1] => 2.jpg
  [2] => 3.jpg
  [3] => 4.jpg
)
Array
(
  [0] => 2.jpg
  [1] => 3.jpg
  [2] => 4.jpg
)

它变得更奇怪了。在 Asset.php 中的那行之后不久,我就有了这一行(我使用的是 smarty)。

$smarty->assign('filename',$this->filename);

这显示为第一个元素,在本例中为 0.jpg。然后,值 $this->文件名被发送到数据库,而无需任何代码行更改它。最终存储在数据库中的是 1.jpg。

我完全迷茫和困惑。请帮忙。

有关它的更多信息,Asset.php 使用一个名为 ImportAssetForm 的对象,该对象扩展了 PEAR 中的 QuickForm 库以及其他几个库,包括 DB 和其他一些库。

这最初不是我的代码,我只是负责更改它。PEAR图书馆可能有点过时了,但我对PEAR没有知识,无法进入并彻底改造网站。

我在多年使用会话时遇到了类似的问题;)

试试这家伙在这里说什么:PHP 会话数据未保存

我不知道这在内部是什么意思,我只是向自己解释 会话变量更改不够快:)

我遇到的问题是由于代码中的错误检查而导致脚本重新加载。由于我不想破坏这一点,所以我将数组的处理移动到另一个没有执行两次的位置。