****注**:私はこのサイトでこの質問をしています。その論理は私には得られず、まだそれを実装することができません。したがって、これは最初の質問の編集版であり、より簡潔に、おそらくより明確になるため、私はうまくいってより多くの回答を得ることができます。 **静的および動的データを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ループがありますが、それは主に質問表に関係する問題の解決にどのように適合しますか?誰でも、マーティンのソリューションのロジックを精緻化し、提供されたデータに基づいてどのように実装することができますか、独自のソリューションを提供することはできますか?ありがとうございました。
あなたの入力は配列としてサーバーに送信されます。値を取得するためにループする必要がある配列。これを見るには、あなたのPHPでvar_dump($ _POST)を使って、送られてくるデータを見てください。 – jeff
あなたが偉大な、特に現在の結果と望ましい結果であると思われるデータの例を説明することができれば。 – Parfait
Kayb、私の例はコピー貼り付けコードではないと思われました。 $ queryは、 'INSERT INTO questions'クエリで、questdata配列からビルドする必要があります。 INSERT INTOの質問SET questid = $ questdata ['questid']、numero = $ questdata ['numero']、........ –