データ|データベース
はじめに チェックボックスは、ユーザーに複数の選択を許可する場合に、すべての項目を選択することも、何も選択しないこともできる非常に便利なページ フォーム項目です。ただし、これは優れたフォーム要素ですが、私たちの作業では、選択内容を適切に保存する方法について常に混乱が生じます。この記事では、適切なデータベース設計原則に従って、チェックボックスの選択をデータベースに正しく保存する方法について説明します。 要件 この記事では、選択内容をユーザー データベースに正しく保存する方法について説明します。ここには便利な 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 us まず、次の SQL ステートメントを使用してテーブル "const_skills" を作成します。 > 次にスキルを追加します: SQL> INSERT INTO const_skills(id, value) VALUES (1, "PHP"); , "MySQL "); SQL> INSERT INTO const_skills(id, value) VALUES (3, "Zope"); SQL> INSERT INTO const_skills(id, value) VALUES (4, "Perl"); SQL> INSERT INTO const_skills(id, value) VALUES (5, "Javascript"); SQL> INSERT INTO const_skills(id, value) VALUES (6, "JSP");あなたのconst_skillsは次のようになります: id value 1 PHP 2 MySQL 3 Zope 4 Perl 5 Javascript 6 JSP このテーブルでは、ユーザーは対応するスキルのみを選択できます。次に、次の SQL を使用して別のテーブル lookup_skills を作成します: 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, "スキル[]> < >< form name="skills" method="insertskills.php" > Web 開発スキルをチェックしてください: < > <入力タイプ="送信" < /form > < /body > < /html > < ?php function get_checkbox_labels($table_name) { /* make an array */ $arr = array(); /* construct the query */ $query = "SELECT * FROM $table_name"; /* execute the query */ $qid = mysql_query($query); /* each row in the result set will be packaged as an object and put in an array */ while($row= mysql_fetch_object($qid)) { array_push($arr, $row); } return $arr; } /* Prints a nicely formatted table of checkbox choices. $arr is an array of objects that contain the choices $num is the number of elements wide we display in the table $width is the value of the width parameter to the table tag $name is the name of the checkbox array $checked is an array of element names that should be checked */ function make_checkbox_html($arr, $num, $width, $name, $checked) { /* create string to hold out html */ $str = ""; /* make it */ $str .= "< table width="$width" border="0" >n"; $str .= "< tr >n"; /* determine if we will have to close add a closing tr tag at the end of our table */ if (count($arr) % $num != 0) { $closingTR = true; } $i = 1; if (isset($checked)) { /* if we passed in an array of the checkboxes we want to be displayed as checked */ foreach ($arr as $ele) { $str .= "< td >< input type="checkbox" name="$name" value="$ele- >id""; foreach ($checked as $entry) { if ($entry == $ele- >value) { $str .= "checked"; continue; } } $str .= " >"; $str .= "$ele- >value"; if ($i % $num == 0) { $str .= "< /tr >n< tr >"; } else { $str .= "< /td >n"; } $i++; } } else { /* we just want to print the checkboxes. none will have checks */ 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++; } } /* tack on a closing tr tag if necessary */ if ($closingTR == true) { $str .= "< /tr >< /table >n"; } else { $str .= "< /table >n"; } return $str; } ? > |