0

私は現在、10ページにまたがり、100をはるかに超える入力を持つ、かなり大きなphpフォームを構築しています。各入力は DB に格納されます。これを行うためのより簡単で効率的な方法があるかどうか疑問に思っていました。私は最初のページでさえ終わっておらず、すでに変数を追跡するのに問題があります. ヒントやコメントをいただければ幸いです。ありがとう!

私が現在していること。これを行うことを想像してください x 10 -

フォーム例

<form action="/db" method="post">

<div class="field-container">
    <label for="name" class="default-label">Company Name:</label>
    <input type="text" name="billing_company_name" id="name" size="50">
    <input type="hidden" name="username" value="<?php echo $current_user->user_login . "\n";?>">
</div>

<div class="field-container">
    <label for="name" class="default-label">Contact Person:</label>
    <input type="text" name="billing_contact_person" id="name" size="50">
</div>

<div class="field-container">
    <label for="name" class="default-label">Address:</label>
    <input type="text" name="billing_address" id="name" size="50">
</div>

<div class="field-container">
    <label for="name" class="default-label">City:</label>
    <input type="text" name="billing_city" id="name" size="50">
</div>

<div class="field-container">
    <label for="name" class="default-label">State:</label>
    <input type="text" name="billing_state" id="name" size="5">
</div>

<div class="field-container">
    <label for="name" class="default-label">ZIP:</label>
    <input type="text" name="billing_zip" id="name" size="8">
</div>

<div class="field-container">
    <label for="name" class="default-label">Phone:</label>
    <input type="text" name="billing_phone" id="name" size="50">
</div>

<div class="field-container">
    <label for="name" class="default-label">Email Address:</label>
    <input type="text" name="billing_email" id="name" size="50">
</div>

<input type="submit" value="Go To Step 2">
</form>

データの保存

// Insert data into mysql
$sql="INSERT INTO Forms (Form_date, username, billing_company_name,  
billing_contact_person, billing_address, billing_city, billing_state, billing_zip,  
billing_phone, billing_email)

VALUES (NOW(),'$username', '$billing_company_name', '$billing_contact_person',   
'$billing_address', '$billing_city', '$billing_state', '$billing_zip', 
'$billing_phone', 
'$billing_email' )";
$result = mysql_query($sql); 
4

3 に答える 3

1

私はテンプレート エンジンのファンですが、もちろん純粋な PHP で作成することもできます。必要なすべての値を単一のテーブル、つまり tb1 に挿入することをお勧めします 次に、これを使用します

X.php

  include '../../smarty/libs/Smarty.class.php';
  Class X extends Smarty {
  public function assignArray($query, $result_name='') {

  $data = mysql_query($query);

  $results = array();
   while ($row = mysql_fetch_assoc($data))
  $results[] = $row;

  if ($result_name != '') {
    $this->assign($result_name, $results);
    $this->assign($result_name.'_count', count($results));
  } else
  return $results;

}  
}

$x = new X();
$query = "SELECT name, size, label, flag, value, hidden
        FROM tb1 
        WHERE flag = 1";

    /*
    name                    |   size    |   label           |   flag    |   value   |   hidden      |
    -------------------------------------------------------------------------------------------------
    billing_company_name    |   50      |   Company Name    |   1       |   login   |   username    |
    billing_contact_person  |   50      |   Contact Person  |   0       |   NULL    |   NULL        |
    billing_state           |   5       |   State           |   0       |   NULL    |   NULL        |
    -------------------------------------------------------------------------------------------------
    */



$x->assignArray($query, 'result');

 //not neccessary to select flag, value, hidden

 $query1 = "SELECT name, size, label, flag, value, hidden 
        FROM tb1 
        WHERE flag = 0";
 $x->assignArray($query1, 'result1');
 $x->smarty->display('billings.tpl');

課金.tpl:

<form action="/db" method="post">

{section name=i loop=$result1}
<div class="field-container">
<label for="name" class="default-label">{$result1[i].label}</label>
<input type="text" name="{$result1[i].name}" id="name" size="{$result1[i].size}">
<input type="hidden" name="{$result1[i].hidden}" value="{$result1[i].value}">
</div>
{/section}

{section name=i loop=$result}
<div class="field-container">
<label for="name" class="default-label">{$result[i].label}</label>
<input type="text" name="{$result[i].name}" id="name" size="{$result[i].size}">
</div>
{/section}

<input type="submit" value="Go To Step 2">
</form>

もちろん、データベースから value="" フィールドを読み取ることができない場合でも、動的な値を取得するために currentUser メソッドを反復処理できます。

于 2013-03-28T20:11:16.030 に答える
0

私があなたの立場なら、構成配列を使用します (ラベル、フィールド名、入力タイプ、Db 列名などを格納します)。次に、その配列を使用して、フォーム クエリと挿入クエリの両方を生成します。

(Zend や Symfony のようなフレームワークでこれを行う方が簡単かもしれませんが、フォームのためだけにフレームワークを使用する予定はないと思います)

于 2013-03-28T17:02:51.327 に答える
0

フォームの値をデータベースのテキスト フィールドに保存し、key=>values の配列を json_encode して、データのデータベース列を 1 つしか持たず、フィールドを増減して収容できるように拡張できます (json_decode でデータを元に戻すことができます)。 )。ただし、このようにすると、特定の列で mysql の標準フィルターとソート手法を直接使用することはできません。両方を行うこともできます。mysql を使用して検索またはソートする必要があることがわかっているフィールド用に別の列を用意し、残りを json_encoded テキスト列に入れます。これにより、データベースを簡素化できます。コードとフォームに関しては、構成配列を設定し、そこからフォームを構築することによって提案されたことを実行します (これには、構成配列を適切な html/php コードに変換するスクリプトを作成する必要があります) またはクラスを見つけますすでにそれを行うことができます。

于 2013-03-28T17:13:27.843 に答える