1

更新- 問題は見つかりませんでした。コメントを削除した人は正しく、Asset.php または array_shift() のいずれかが 2 回呼び出されていたと思います。私が見つけたのは、フォーム オブジェクトを処理する別のファイルのスイート スポットで、余分な要素を削除することなく意図したとおりに配列を操作できました。誰かが閲覧したい場合に備えて、これを残しておいてください。


スイッチを介して実行されるGET値に応じて異なるページを表示するController.phpによって実行されるWebサイトがあります。関連するケースは次のとおりです。

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
)

等々。ここが変なところです。配列がデクリメントされる 1 行は、Asset.php にあります。

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

配列はそのページのインスタンスに入り、その行の直前と直後に print_r ステートメントがあります。配列が5 つの要素すべてを含む場合でも、2 つの 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->filename は、コード行を変更することなくデータベースに送信されます。最終的にデータベースに格納されるのは 1.jpg です。

私は完全に迷って混乱しています。助けてください。

詳細については、Asset.php は ImportAssetForm というオブジェクトを使用します。このオブジェクトは、PEAR の QuickForm ライブラリや、DB などの他のいくつかのライブラリを拡張します。

これはもともと私のコードではありません。変更を依頼されたばかりです。PEAR ライブラリはおそらく少し古くなっていると思いますが、私は PEAR を使ってサイトを完全に刷新する知識がありません。

4

2 に答える 2

0

私は長年のセッションでの作業で同様の問題を抱えています;)

この男がここで言っていることを試してください:PHPセッションデータが保存されていません

これが内部的に何を意味するのかわかりません。セッション変数の変更が十分に迅速ではなかったことを自分自身に説明します:)

于 2012-06-18T17:00:17.630 に答える
0

私が抱えていた問題は、コードのエラー チェックが原因でスクリプトがリロードされることでした。それを中断したくなかったので、配列の処理を 2 回実行されない別の場所に移動しました。

于 2012-07-16T16:44:53.590 に答える