0

まず、こんにちは、私の質問を読んでくれてありがとう。これは要件の組み合わせが少し奇妙に思えるかもしれません。問題が最初から最も効率的な方法で始まっていないことはすでに認識していますが、これは変更できないパラメーターです。少なくとも現時点では。

2 つの html テーブルを含む html フォームがあります。これらのテーブルのそれぞれで、さまざまな読み取り専用入力フ​​ィールドの値を他の (ユーザー) 入力フィールドから計算するために、さまざまな JS 計算が行われます。最初のテーブルの最終合計は、計算後に 2 番目のテーブルの最初の値として使用されます。2 番目のテーブルは静的なままなので、定義された数の入力があります。これは問題の一部ではありません、最初のテーブルのデータに依存しています。

最初のテーブルには、1 つの物理テーブル行に 6 つの入力フィールド (3 つのテキスト、1 つの選択、2 つのテキストボックス) があります。この行には、行全体を複製して下に追加し、新しく生成された 6 つのフィールドのそれぞれに増分値を追加するボタンもあります。これにより、ユーザーは必要な数の行を追加でき、それぞれに同じ 6 つのフィールドが含まれます。最初の (デフォルト) フィールドには、次のような値があります。

"texta_1"、"textb_1"、"textc_1"、"textboxa_1"、"textboxb_1"、"select_1"

追加の JS 生成行は、次の命名形式に従います。

"texta_2"、"textb_2"、"textc_2"、"textboxa_2"、"textboxb_2"、"select_2"、"texta_3"、"textb_3
"、"textc_3"、"textboxa_3"、"textboxb_3"、"select_3"
など

これを拡張できる範囲/数に定義された制限はありませんが、これを使用してアクセスできる小さなグループがそれ以上入力する必要がないことを意味するために使用されることを意図していますが、一度に10行。

この時点までのすべてが完全に機能します。問題は、このフォームが投稿されたら、上記のテーブルからすべてのデータを収集し、mysql データベースに保存する前にユーザーに再表示できるようにする必要があることです。

php5 (LAMP スタックで使用されている 5.3.3 - Debian/Apache2/MySQL 5.1.66/PHP 5.3.3)内で、6 つのフィールドごとにすべての入力を収集し、それらをにスローする方法を知る必要があります。リストと配列の両方。どの機能が必要になるかはよくわかりません (私の PHP の能力はどちらも優れたものではなく、3 年も古くなっています)。DBには、1つの領域内のすべてのデータを一緒に保存できるようにするための適切な準備があります-つまり、texta_1、texta_2、texta_3、texta_5などはすべて、列のDBに一緒に保存する必要があります。 「db_texta」という名前です。

また、これらの 6 つの DB 列のそれぞれを対象としたデータを foreach ループに投入して、DB に送信する前に表示する必要があります。もちろん、後で DB から再度抽出するときも同様です。

プロセスのこの部分は、より大きなプロセス全体の中の1 つのステップであることを指摘しておくことが重要かもしれません。これはデータ収集の 2 番目の部分であり、最後の部分ではありません。ユーザーが個人情報を入力する前に、これは上記のステップが開始される前にすでに DB に送信されているため、この情報を待機する DB エントリが既に配置されており、これが DB に送信されると、ユーザーがスキャンした画像をアップロードしてこのエントリに関連付けられるようにするために必要な 3 番目の手順です。しかし、私はそのどれもがこの差し迫った問題にとって重要だとは思いません。私がそれについて間違っている場合は、私に知らせてください!

最初のフォーム内に投稿されたものを取得し、正しい形式で確認するために適切にリストし、6 つのフィールドのそれぞれの不明な番号をまとめて DB に保存し、データを抽出して再利用できるようにするにはどうすればよいですか?後で?

現時点で持っている PHP コードをそこに貼り付けようとします。完全に完成したわけではありませんが、意図とそれがどこに向かっているのか、または行こうとしていることがわかります。

コード:

ここの最大文字スペースをわずかに超えているように見えるため、貼り付けサービスでコードを貼り付けました。全体的なコードは、目的の機能を完全に理解するのに役立つと思います。最初の質問を投稿する前に、ここですべてのベースをカバーしようとしています。ただし、これが「してはいけない」ことである場合はお詫び申し上げます。:) 完全なコードはhttp://pastie.org/8391018#で見ることができます。

繰り返しますが、texta_[ ] スタイルの命名を使用すると JS フォームの機能が壊れるため、この質問では要件を達成するための代替方法を探しています。

返信と時間をいただき、ありがとうございます。

4

2 に答える 2

1

各フィールドのプレフィックス (texta、textb、textc など) が既にわかっている場合は、これを使用して開始できます。これは、フィールドが見つからなくなるまでループします。texta_12let's say andtexta_14が noのtexta13場合、12 で壊れてそこで停止することに注意してください。

#   This array will contain the data.
$Res = array();

#   This variable will contain our current count. Start at 0.
$i=0;

#   We loop to the infinite !
while(TRUE){
    #   +1
    $i++;

    #   Are we done ?
    if(isset($_POST['texta_'.$i]) === FALSE){
        break;
    }

    #   We create our sub-array
    $Res[$i] = array(
        'text_a'     => $_POST['texta_'.$i], // Already tested...
        'text_b'     => (isset($_POST['textb_'.$i]) === TRUE ? $_POST['textb_'.$i] : ''),
        'text_c'     => (isset($_POST['textc_'.$i]) === TRUE ? $_POST['textc_'.$i] : ''),
        'text_box_a' => (isset($_POST['textboxa_'.$i]) === TRUE ? $_POST['textboxa_'.$i] : ''),
        'text_box_b' => (isset($_POST['textboxb_'.$i]) === TRUE ? $_POST['textboxb_'.$i] : ''),
        'select'     => (isset($_POST['select_'.$i]) === TRUE ? $_POST['select_'.$i] : '')
    );
}

#   We print our results
print_r($Res);

これはテストされていませんが、コンセプトは機能します。

編集:

わかりました-これはあなたのニーズに合うと思います:

#   This array will contain the data.
$Res = array(
    'text_a'     => array(),
    'text_b'     => array(),
    'text_c'     => array(),
    'text_box_a' => array(),
    'text_box_b' => array(),
    'select'     => array()
);

#   This variable will contain our current count. Start at 0.
$i=0;

#   We loop to the infinite !
while(TRUE){
    #   +1
    $i++;

    #   Are we done ?
    if(isset($_POST['texta_'.$i]) === FALSE){
        break;
    }

    #   We create our sub-array
    $Res['text_a'][$i] = $_POST['texta_'.$i];
    $Res['text_b'][$i] = (isset($_POST['textb_'.$i]) === TRUE ? $_POST['textb_'.$i] : '');
    $Res['text_c'][$i] = (isset($_POST['textc_'.$i]) === TRUE ? $_POST['textc_'.$i] : '');
    $Res['text_box_a'][$i] = (isset($_POST['textboxa_'.$i]) === TRUE ? $_POST['textboxa_'.$i] : '');
    $Res['text_box_b'][$i] = (isset($_POST['textboxb_'.$i]) === TRUE ? $_POST['textboxb_'.$i] : '');
    $Res['select'][$i] = (isset($_POST['select_'.$i]) === TRUE ? $_POST['select_'.$i] : '');
}

#   Here you can use a delimiter to merge them into one string
$TextA = implode('^', $Res['text_a']);

#   However, if you just want to store the data into one field in a more complex but more stable way, I suggest:
#   JSON
$TextA = json_encode($Res['text_a']);

#   Serialization
$TextA = serialize($Res['text_a']);

#   Now, $TextA is one big string that you can save into one MySQL field (make sure the field type is big enough for the length of the string).
#   You can read back the json using json_decode or unserialize

#   We print our results
print_r($Res);

MySQL ストレージ フィールドの長さ制限:

TINYTEXT    256 bytes    
TEXT        65,535 bytes        ~64kb
MEDIUMTEXT  16,777,215 bytes    ~16MB
LONGTEXT    4,294,967,295 bytes ~4GB

あなたの場合、1文字が1バイトになります。

ドキュメンテーション:

于 2013-10-10T02:22:14.287 に答える
1

使用するだけです - これにより、すべての要素がすぐそこにname="texta[]"ある配列が自動的に作成されます。$_POST['texta'][0..n]

于 2013-10-09T23:40:53.487 に答える