はじめに
チェックボックスは、ユーザーに複数の選択を許可する場合に、すべての項目を選択することも、何も選択しないこともできる非常に便利なページ フォーム項目です。ただし、これは優れたフォーム要素ですが、私たちの作業では、選択内容を適切に保存する方法について常に混乱が生じます。この記事では、適切なデータベース設計原則に従って、チェックボックスの選択をデータベースに正しく保存する方法について説明します。
要件
この記事では、選択内容をユーザー データベースに正しく保存する方法について説明します。ここには便利な PHP コードが含まれていますが、データベース設計の観点から表現するので、任意のデータベースおよびサーバー側スクリプト言語を使用して簡単に実装できます。私は、あなた自身のサイトに適用できるハウツーを提供したいだけです。ここでソースコードを実行したい場合は、php、mysql、および Web サーバーをインストールする必要があります。
例 1: 採用サイト
雇用主がこのサイトにアクセスして、求職者のスキルに基づいて適切な従業員を見つけることができるように、求職中のソフトウェア開発者がスキルを記入できる採用 Web サイトの作成を依頼されたとします。また、開発者は複数のスキル セットを持っていることもわかっているため、そのようにサイトを設計することにします。
すべての求職者がこのサイトにアクセスし、ユーザーとして登録し、自分のスキルを入力できるようになります。次のようなページを作成すると便利です:
__ PHP __ MySQL __ Zope
__ Perl。 __ Javascript __ JSP
[送信]
すべての求職者は、自分が所有するスキルを選択できます。明らかに、選択肢は人によって異なります。 1 つは PHP と MySQL であり、もう 1 つは単なる JSP である可能性があります。これらの選択内容をどのように保存しますか?自然なアイデアは、オプションごとにフィールドを作成して、最初は正常に機能するようにすることです。しかし、拡張または調整するときに問題が発生し、テーブル構造を変更しなければならない場合があります。
良い方法は次のようになります:
ユーザー名、パスワード、その他必要なコンテンツなどのユーザーの登録情報を含むユーザー テーブルが必要です。この記事で後述するソース コードを直接使用する場合は、次のように単純なテーブルを作成する必要があります:
id username
1 User1
2 User2
3 User3
まず、次の SQL を使用してテーブル "const_skills" を作成します。ステートメント:
SQL> CREATE TABLE const_skills (
id int not null Primary key,
value varchar(20) ); 次にスキルを追加します:
SQL> INSERT INTO const_skills(id, value) VALUES (1, " PHP") ;
SQL> INSERT INTO const_skills(id, value) VALUES (2, "MySQL");
SQL> INSERT INTO const_skills(id, value) VALUES (3, "Zope");
SQL> INSERT INTO const_skills (id, 値) VALUES (4, "Perl");
SQL> INSERT INTO const_skills(id, value) VALUES (5, "Javascript");
SQL> INSERT INTO const_skills(id, value); JSP") ;
const_skills は次のようになります:
id value
1 PHP
2 MySQL
3 Zope
4 Perl
5 Javascript
6 JSP
このテーブルでは、ユーザーが対応するスキルを選択できるようにするだけです。テーブル lookup_skills は次の SQL を使用します:
SQL> CREATE TABLE lookup_skills (
id int not null auto_increment Primary key,
uid int,
skill_id int );
このテーブル lookup_skills の目的は次のとおりです。ユーザーテーブルから開発スキルテーブルへの情報とそれらの間のマッピング関係。言い換えれば、開発者と彼らが持つスキルを保存できるため、候補者が選択を完了して送信をクリックすると、チェックボックスで選択された値をフォームに入力することになります。選択したスキルごとに、このテーブルにレコードを追加し、ユーザー ID と選択したアイテムの ID を記録します。 (これは誰もが知っていると思います。これは私が翻訳したものです、ふふ…)
レコードを挿入するコードを確認する前に、まずこのページをデザインしましょう。コンテンツ用のフォームが必要です。データベースにクエリを実行して、チェックボックス ラベルは、このチェックボックス フォーム項目を const_skills テーブルから作成します。
代码如下:
< ?php
/* ここにデータベースに接続するコードを挿入します */
/* チェックボックスのラベルを取得します */
$skills = get_checkbox_labels("const_skills");
/* フォーマットされた
チェックボックスのセットの HTML コードを作成します */
$html_skills = make_checkbox_html($skills, 3, 400, "skills[]");
? >
< html >
<本体>
< br>
< form name="skills" method="POST" action="insertskills.php" >
Web 開発スキルをチェックしてください:
< ?エコー "$html_skills"; ? >
< br>
< input type="submit" value="submit" >
< /フォーム>
< /ボディ>
< /html >
< ?php
function get_checkbox_labels($table_name) {
/* 配列を作成します */
$arr = array();
/* クエリを構築します */
$query = "SELECT * FROM $table_name";
/* クエリを実行します */
$qid = mysql_query($query);
/* 結果セットの各行は
オブジェクトとしてパッケージ化され、配列に入れられます */
while($row= mysql_fetch_object($qid)) {
array_push($arr, $row);
}
$arr を返す;
}
/* チェックボックスの選択肢を適切にフォーマットした表を印刷します。
$arr は選択肢を含むオブジェクトの配列です
$num はテーブルに表示する幅の要素の数です
$width はテーブルタグの幅パラメータの値です
$name はチェックボックスの名前ですarray
$checked は、チェックする必要がある要素名の配列です
*/
function make_checkbox_html($arr, $num, $width, $name, $checked) {
/* html を保持する文字列を作成します * /
$str = "";
/* 作ってください */
$str .= "< table width="$width" border="0" >n";
$str .= "< tr >n";
/* テーブルの最後に終了 tr タグを追加するかどうかを決定します */
if (count($arr) % $num != 0) {
$closeTR = true;
}
$i = 1;
if (isset($checked)) {
/*
チェック済みとして表示したいチェックボックスの配列を渡した場合 */
foreach ($arr as $ele) {
$str .= "< td >foreach ($checked as $entry) {
if ($entry == $ele- >value) {
$str .= "checked";
続けてください。
}
}
$str .= " >";
$str .= "$ele- >value";
if ($i % $num == 0) {
$str .= "< /tr >n< tr >";
} else {
$str .= "< /td >n";
}
$i++;
}
} else {
/* チェックボックスを印刷したいだけです。チェックはありません */
foreach ($arr as $ele) {
$str .= "< td >< input type="checkbox" name="$name" value="$ele- >id " >";
$str .= "$ele- >value";
if ($i % $num == 0) {
$str .= "< /tr >n< tr >";
} else {
$str .= "< /td >n";
}
$i++;
}
}
/* 必要に応じて、終了 tr タグを付加します */
if ($closeTR == true) {
$str .= "< /tr >< /table >n";
} else {
$str .= "< /table >n";
}
$str; を返します。
}
? >