2011-01-20 11 views
0

私は「bottom1.php」というページを持っています.16個の選択メニュー、labled rating1-rating16があります。 ユーザがこのフォームを送信すると、次のページは次のようになりますスクリプトました:投稿データを配列にインポートする

//pulling data from post into array. 
import_request_variables("p", "form_"); 
$scores= array($form_rating1,$form_rating2,$form_rating3,$form_rating4,$form_rating5,$form_rating6,$form_rating7,$form_rating8,$form_rating9,$form_rating10,$form_rating11,$form_rating12,$form_rating13,$form_rating14,$form_rating15,$form_rating16); 
//putting array into session 
$_SESSION['scores']=$scores; 

ユーザーは、追加の16回の選択が行われた別のページにリダイレクトされ、その後、同じスクリプトが唯一、RANです今回は配列が "scores2"としてセッションに格納されます。

ユーザーに各アレイの出力が表示され、ユーザーが値が正しいことを確認すると、スコアの各メンバーとscores2の配列が解析され、別の変数に入れられてデータベースに挿入されます。

私はこれを達成するための基本的な方法であることを知っていますが、その唯一の方法はわかります。

この方法は5.2.13のPHP設定で動作しましたが、5.1.6の設定のサーバーに切り替えました。このスクリプトは動作しません。このスクリプトは私のサイトにとって非常に重要です。ご協力いただきありがとうございます!解析スクリプトは次のようになります

$fpage=$_SESSION['scores']; 
$spage=$_SESSION['scores2']; 

$score1 = $fpage['0']; 
$score2 = $fpage['1']; 
$score3 = $fpage['2']; 
$score4 = $fpage['3']; 
$score5 = $fpage['4']; 
... 
$score31 =$spage['13']; 
$score32 =$spage['14']; 
$score33 =$spage['15']; 

そして、私は$ SCORE1挿入 - 私のDBに$ score33を...

+1

どのように動作しませんか?エラー報告/ログオンですか?その場合、どのようなエラーが表示されますか?そうでない場合は、オンにすることはできますか? 5.1.6よりもPHPバージョンが必要なコードは何もないので、これをさらにデバッグする必要があります。 –

+0

また、btw、ポスト変数rating [0]、rating [1]などの名前を付けて実際に配列をポストすることができます –

+0

私はサーバー管理者ではないので、わかりません。セッションを制限する設定が可能でしょうか? (私はこれを上記で編集します)私の出力はすべてデータベース内で0ですから。 – Ryan

答えて

0

作業同じ理由でregister_globals()が悪い考えであったため、まったく安全ではありません。内部変数の1つに 'form_'を付加すると、ユーザはその値を上書きして、その変数の使用方法に応じて有害なコードを注入する可能性があります。

これを行うより良い方法は、array_filter()またはpreg_grep()を使用してアレイを新しい配列に直接フィルタリングすることです。

オリバーA.の解決策は、配列キーがすべて 'form_rating'の形式になっているが、元のスクリプトでは 'form_'という接頭辞が仮定されている場合にのみ機能します。次のように

preg_grepを使用することができる:

$keys = preg_grep('/^form_/', array_keys($_POST)); 
$scores = array(); 
foreach ($keys as $key) { 
    $scores[$key] = $_POST[$key]; 
} 
+0

私はその保護を追加しますが、私は間違ってセッションから配列を呼び出すのでなければ、配列が正常に送信されていないように見えますか? – Ryan

+0

あなたはsession_start()を呼び出していますか?あなたのアプリケーションの始めに?古いサーバーがセッションを自動的に開始するように設定されていて、新しいサーバーがセッションを開始していない可能性があります。 – cmendoza

0

私は今、この権利をテストするためにPHPの的環境を持っていますが、これはありません動作するはずです:

$scores = array(); 
    for($i=1;array_key_exists("form_rating{$i}",$_POST);$i++){ 
     $scores[] = $_POST["form_rating{$i}"]; 
    } 

編集:私は、あなたがやっている方法をテストし、

+0

array_key_existsはブール値を返します。 –

+0

の場合、このように使用することはできません。@Elzo Valugiは本当ですか? forループの2番目の式はbooleanを返さなければなりません!私はちょうどコードをテストし、それは動作します(ok私は小さなタイプミスを持っていました。3 'r'でアレイを書きました)あなたforループがどのように動作するか考えていますか? –

+0

私は条件の中に$ iが見当たらず、永遠に走ると思っていました。 –

-1

PHPは、その後のバージョンを変更したときにスクリプトが動作しない場合:

  1. エラー
  2. がためPHP Changelogをチェックしてくださいするlogsをチェック関数や制御構造が変更されると、スクリプトが停止します。

5.1と5.2の間で切り替えるときに、それは私に多くのことを起こることだけで問題がエルビス演算子です:?PHP 5.1で認識されていません

これは、サーバーが持つのと同じ種類の構成で開発すること、または生産に達する前にこの問題を検出できる単体テストと自動展開を実装することが重要な理由です。

関連する問題