2016-08-27 4 views
0

****注**:私はこのサイトでこの質問をしています。その論理は私には得られず、まだそれを実装することができません。したがって、これは最初の質問の編集版であり、より簡潔に、おそらくより明確になるため、私はうまくいってより多くの回答を得ることができます。 **静的および動的データをMySQLデータベースにPHPフォームから1つのサブミッションで挿入する方法

私はMySQL(完全な初心者)と共にPHPを学び始めました。質問とオプションの表を含むデータベースをクイズの一部として作成しました私が学ぶのを助けるためのアプリプロジェクト。私はPHPで処理されたフォームを通して質問とオプションを提出することで、データベースを移植するのは良い学習体験と考えていました。一言で言えば

Iが午前問題はこれで、私は、次の形式を有する:

形態の[dataentry形態]

http://i.stack.imgur.com/3S0gu.png 質問部(可変行)単一フィールド定数メタデータ

 <div class="questinfo"> 
      <div class="questmetadata"> 

      <select name="questfield[0][subject_id]"> 
       <option>BA</option> 
       <option>MY</option> 
       <option>PA</option> 
       <option>BB</option> 
       <option>CC</option> 
       <option>UA</option> 
       <option>HM</option> 
       <option>CG</option> 

      </select> 
      <input name="questfield[0][chapter_id]"> 

      <input name="questfield[0][topic_id]"> 
      <input name="questfield[0][is_active]"> 
      <select name="questfield[0][type]"> 
       <option>P</option> 
       <option>L</option> 
      </select> 

      <select name="questfield[0][level]"> 
       <option>1<option> 
       <option>2 II<option> 
       <option>3<option> 
      </select> 

      </div> 

      <div class="questrow"> 
      <input name="questfield[1][questid]"> 
      <input name="questfield[1][numero]"> 
      <textarea name="questfield[1][question]"></textarea> 
      </div> 

<div class="questfield"> 
      <input name="questfield[2][id]"> 
      <input name="questfield[2][numero]"> 
      <input name= "questfield[2][is_active]"> 
      <textarea name="questfield[2][question]"></textarea> 
     </div> 


      <div class="questrow"> 
      <input name="questfield[3][questid]"> 
      <input name="questfield[3][numero]"> 
      <textarea name="questfield[3][question]"></textarea> 
      </div> 

オプションセクションのフォーム。独自の対応するメタデータフィールドを持つ可変オプションフィールド。

<div class="optionfield"> 
     <input type="text" name ="optionfield[0][optid]"> 
     <input type="text" name ="optionfield[0][choice]"> 
     <input type="text" name ="optionfield[0][question_numero]"> 
     <input type="checkbox" name ="optionfield[0][is_answer]"> 

     </div> 

     <div class="optionfield"> 
     <input type="text" name ="optionfield[1][optid]"> 
     <input type="text" name ="optionfield[1][choice]"> 
     <input type="text" name ="optionfield[1][question_numero]"> 
     <input type="checkbox" name ="optionfield[1][is_answer]"> 
     </div> 


     <div class="optionfield"> 
     <input type="text" name ="optionfield[2][optid]"> 
     <input type="text" name ="optionfield[2][choice]"> 
     <input type="text" name ="optionfield[2][question_numero]"> 
     <input type="checkbox" name ="optionfield[2][is_answer]"> 
     </div> 


     <div class="optionfield"> 
     <input type="text" name ="optionfield[3][optid]"> 
     <input type="text" name ="optionfield[3][choice]"> 
     <input type="text" name ="optionfield[3][question_numero]"> 
     <input type="checkbox" name ="optionfield[3][is_answer]"> 
     </div> 


This is the corresponding PHP; only the first row is entered into the question table but the options table has all four rows.(because unlike for the questions section of the form, all the column entries in the options table by necessity must correspond to a distinct field in the form) 

    $optsql=" INSERT INTO 

    options 


    SET 
    optid=:optid, 
    question_numero=:question_numero, 
    choice=:choice, 
    is_answer=:is_answer, 
    answer_explanation=:answer_explanation"; 

$questsql=" INSERT INTO questions 

      SET 
      questid=:questid, 
      numero=:numero, 
      question=:question, 
      subject_id=:subject_id, 
      chapter_id=:chapter_id, 
      topic_id=:topic_id, 
      type=:type, 
      level=:level, 
      is_active=:is_active 

     "; 


$optstmt=$clsdb->prepare($optsql); 
$queststmt=$clsdb->prepare($questsql); 



    foreach($_POST['optionfield'] as $optinput){ 

    $optdata= array(

     'optid'=>$optinput['optid'], 
     'question_numero'=>$optinput['question_numero'], 
     'choice'=>$optinput['choice'], 
     'answer_explanation'=>$optinput['answer_explanation'], 
     'is_answer'=>$optinput['is_answer']); 

$optstmt->execute($optdata); 


} 

foreach($_POST['questfield'] as $questinput){ 

$questdata= array(

     'questid'=>$questinput['questid'], 
     'numero'=>$questinput['numero'], 
     'question'=>$questinput['question'], 
     'subject_id'=>$questinput['subject_id'], 
     'chapter_id'=>$questinput['chapter_id'], 
     'topic_id'=>$questinput['topic_id'], 
     'type'=>$questinput['type'], 
     'level'=>$questinput['level'], 
     'is_active'=>$questinput['is_active']); 

     $queststmt->execute($questdata); 

} 

フォームには2つのセクションにあります質問と対応するオプションボタンを提出するが、異なる(オプションと質問)データベースのテーブルにデータを挿入1に対応しています。上の画像では、フォームの質問セクションに4行のフィールドがあります(スタイルや不足を許してください)。最初の行はメタデータ用で、その下の3行(テキストボックスで終わる)はデータベースに入力する3つの個別の質問行を表します。メタデータ行には、3つの質問行のそれぞれの列を埋めるデータが含まれています一度データベースに提出されました。私の現在のPHPコードでは、適切なメタデーダとともに1つの質問行しか挿入されません。私が欲しいのは以下の通りです:

[欲望の結果]

http://i.stack.imgur.com/9LpJP.pngしかし、(代わりにゼロの)【選択メタデータがフォームのために選択されているものに基づいて変更すべき記入メタデータ与えられた提出と同時に挿入された任意の数の行について同じであることが可能である。

上記のコードに基づいて、マーティン法という名前のユーザーは、以下のソリューション提案:「文字列への変換矢印」:ただし、上記のコードが通知エラーを返し

foreach($_POST['questfield'] as $key => $value){ 
//static vars(metadata) 
$questdata[$key] = $value; 
foreach($_POST['optionfield'] as $key => $value){ 
    //changing vars(answers) 
    $questdata[$key] = $value; 
    //Write to db 
    $stmt->execute($query); 
} 

}

を私は、execute関数に渡した$ questdataが多次元配列であることがわかった。さらに、私はこのコードのロジックを理解していません。質問とオプションのために別々の挿入クエリとプリペアドステートメントがありましたが、上記のコードでは1つのステートメントとクエリ($クエリ)のみが暗示されています。 "$クエリ" ?また、コードでは、 "optionfield"配列を渡して$ questdataに要素を割り当てるネストされたforeachループがありますが、それは主に質問表に関係する問題の解決にどのように適合しますか?誰でも、マーティンのソリューションのロジックを精緻化し、提供されたデータに基づいてどのように実装することができますか、独自のソリューションを提供することはできますか?ありがとうございました。

+0

あなたの入力は配列としてサーバーに送信されます。値を取得するためにループする必要がある配列。これを見るには、あなたのPHPでvar_dump($ _POST)を使って、送られてくるデータを見てください。 – jeff

+0

あなたが偉大な、特に現在の結果と望ましい結果であると思われるデータの例を説明することができれば。 – Parfait

+0

Kayb、私の例はコピー貼り付けコードではないと思われました。 $ queryは、 'INSERT INTO questions'クエリで、questdata配列からビルドする必要があります。 INSERT INTOの質問SET questid = $ questdata ['questid']、numero = $ questdata ['numero']、........ –

答えて

0

questfield配列からメタデータを壊す考えてみましょう。そして、INSERTクエリ、動的でquestfield値とともに再使用したものスカラー$_POSTフィールド(questidNUMERO問題)中:付き

HTML

<div class="questmetadata"> 
    <select name="subject_id"> 
     <option>BA</option> 
     <option>MY</option> 
     <option>PA</option> 
     <option>BB</option> 
     <option>CC</option> 
     <option>UA</option> 
     <option>HM</option> 
     <option>CG</option> 
    </select> 

    <input name="chapter_id"> 

    <input name="topic_id"> 
    <input name="is_active"> 

    <select name="type"> 
     <option>P</option> 
     <option>L</option> 
    </select> 

    <select name="level"> 
     <option>1<option> 
     <option>2 II<option> 
     <option>3<option> 
    </select> 
</div> 

questfieldのインデックスを調整してください。

<div class="questrow"> 
    <input name="questfield[0][questid]"> 
    <input name="questfield[0][numero]"> 
    <textarea name="questfield[0][question]"></textarea> 
</div> 

PHP

... 
foreach($_POST['questfield'] as $questinput){ 

    $questdata= array(
     'questid'=>$questinput['questid'],   // DYNAMIC FIELDS 
     'numero'=>$questinput['numero'], 
     'question'=>$questinput['question'], 
     'subject_id'=>$_POST['subject_id'],  // STATIC FIELDS 
     'chapter_id'=>$_POST['chapter_id'], 
     'topic_id'=>$_POST['topic_id'], 
     'type'=>$_POST['type'], 
     'level'=>$_POST['level'], 
     'is_active'=>$_POST['is_active'] 
    ); 

    $queststmt->execute($questdata); 
} 
+0

パフェ、私は画面から少し離れて、今朝あなたの解決策を試しました。マーティン・ローには、あなたが提案した構文を使って配列を取り込むことについてあなたのポストから学んだ。私はそれ以上の質問なしに実装することができたので、パフェの解を選んだ。 @Martin、あなたが個人的に私に連絡を取り合わないのであれば、あなたのコードで自分の目標をどのように達成できたかにはまだ興味があります。 – Kayb

0

あなたの質問が分かりません。しかし、データベースに書き込む必要があるデータがフィールドのいずれでも変更されない場合は、foreachループから除外します。 AllsoあなたのテーブルのVAR名は、フォームのフィールド名と一致する場合は、次のように変数を取り込むことにより、タイピングのアロット自分を救うことができます。彼らは、フォームのための静的なままと

foreach($_POST['questfield'] as $key => $value){ 
    //static vars(metadata) 
    $questdata[$key] = $value; 
    foreach($_POST['optionfield'] as $key => $value){ 
     //changing vars(answers) 
     $questdata[$key] = $value; 
     //Write to db 
     $stmt->execute($query); 
    } 
} 
+0

このフォームでは、 (quest_numero、id、および質問のみを含む)「questfields」。これらの質問フィールドは、私がsubmitを押すとforeachループが実行されたときにデータベースに行として入力されます。私の問題は、前述の同じメタデータを持つ静的部分は、foreachによってデータベースに入力された行の対応する列を埋める必要がありますが、静的データのコードはループ外に留まります。 – Kayb

+0

Kayb、この答えはまだあなたのために働くでしょう。 Parfaitのソリューションも同様に機能するはずです。 –

+0

Martin LawとParfaitの両方に、私はあなたの助けに感謝します。残念ながら私はそれを働かせることができませんでした。マーティン、あなたの提案は私に通知エラーをもたらしました: "文字列変換への配列"、そして多少の研究は、私が多次元($ questdata)配列を実行関数に渡すことができなかったことを示しています。 @ Parfait、私はあなたのソリューションを試して、SQL構文エラーがあります。それ以上の助けをいただければ幸いです。そんな初心者であることをお詫び申し上げます。 – Kayb

関連する問題