ホームページ > php教程 > php手册 > チェックボックスのデータをPHPのデータベースに保存

チェックボックスのデータをPHPのデータベースに保存

WBOY
リリース: 2016-06-21 08:58:36
オリジナル
1035 人が閲覧しました

データ|データベース

はじめに

チェックボックスは、ユーザーに複数の選択を許可する場合に、すべての項目を選択することも、何も選択しないこともできる非常に便利なページ フォーム項目です。ただし、これは優れたフォーム要素ですが、私たちの作業では、選択内容を適切に保存する方法について常に混乱が生じます。この記事では、適切なデータベース設計原則に従って、チェックボックスの選択をデータベースに正しく保存する方法について説明します。

要件

この記事では、選択内容をユーザー データベースに正しく保存する方法について説明します。ここには便利な 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;
}

? >
このコードは非常にシンプルなので、すぐに読むことができます。主な作業は、「get_checkbox_labels」と「make_checkbox_html」の 2 つの関数によって実行されます。このうち、「get_checkbox_labels」は const_skills テーブルをクエリし、各オブジェクトには id 値と対応するスキル名が含まれています。この配列とその他のパラメーターを「make_checkbox_html」に渡すと、この関数はチェックボックスの HTML コードの生成に使用される文字列を返します。次に、この文字列を HTML ファイルに挿入して、さまざまなスキルの選択を含む必要なフォームを生成します。変数 $checked を「make_checkbox_html」に渡していないことに注意してください。このパラメータは、表示したいチェックされたオブジェクトの配列です。ユーザーが新しいスキルを学習した場合、ユーザーの保存されたスキル項目を事前にチェックする必要があるチェックボックスを表示する「スキルの編集」ページを提供できます。

この方法を使用してフォームを動的に作成する場合と、固定 HTML コードを使用してスキル チェックボックスを生成する場合の利点は何ですか?そうですね、DHTML など、もともとテーブル const_skills にない項目を求職者が選択できるようにすると、求職者がサイトにアクセスしたときにその項目を見つけることができます。 DHTML オプションがもう 1 つあります。これはすべて、HTML ファイルを調整することなく実行できます。

lookup_skills を挿入

このフォームを作成したので、このユーザーが選択したスキルを保存する必要があります。 make_checkbox_html 関数では、skill[] を使用して各オプション要素を呼び出します。これは、各オプションに配列要素としてアクセスできることを意味します。このようにして、この選択をテーブル lookup_skill に挿入できます。ユーザーが 5 つのオプションを選択した場合、lookup_skill に 5 つのレコードが挿入されます。 lookup_skills テーブルの各レコードには、ユーザー ID とスキル ID の 2 つのフィールドしかないことに注意してください。私のサイト例では、ユーザーは登録してプロフィールを作成/編集できます。ログイン時にセッションを使用してユーザー ID を保存したい場合があります。ただし、ユーザー ID を管理する方法については、この記事の範囲を超えています。

次のコードでは、この変数名 $uid を使用してこのユーザー ID にアクセスできると想定しています。レコードを挿入するための関数コードは次のとおりです。


/* 関数。
$skills 引数は、ユーザーが送信ボタンを押したときに
スクリプトに送信されるスキル配列です。
*/
function insert_skills($uid, $skills) {

/* まず、このユーザーがテーブル内に
持っているエントリをすべて削除します */
purge_lookup("lookup_skills", $uid);

/* を作成します。 SQL 挿入クエリ */
$query = create_checkbox_query($skills, "lookup_skills", $uid);

/* クエリを実行します */
mysql_query($query); }

/* insert_skills() のヘルパー関数。
$uid を持つ $table 内のすべての行を削除します */
function purge_lookup($table, $uid) {
$q = " DELETE FROM $table , WHERE uid = '$uid'";
mysql_query($q);
}

/* insert_skills() のヘルパー関数。
実際の SQL クエリを生成します*/
function create_checkbox_query($arr, $table, $uid) {
$q = "INSERT INTO $table (uid, skill_id) VALUES";

foreach ($arr as $check) ) {
$q .= " ( $uid , $check )" . ",";
}

/* 最後のカンマを削除して return */
return substr($ q, 0, -1);
}

?>

とても簡単です。これで、const_skill テーブルからレコードを読み取ってフォームを動的に作成する方法と、ユーザーが選択したスキルを lookup_skills テーブルに保存する方法がわかりました。次に何をしましょうか?検索を見てみましょう
検索

雇用主が Web 開発者を探しに来て、あなたの検索ページに来たとき、同じフォームを表示して、彼が望むスキルを持っている従業員を選択できるようにすることができます。彼が選択したスキルの配列を取得すると、配列を反復処理して SQL ステートメントを使用して、このスキルを持つ求職者を検索できます。また、リストまたは結果を表示し、検索者が項目をクリックしてその項目を表示できるようにすることもできます。詳細。 。次の関数は、このクエリの作成方法を説明しています。


/* $skills 配列でチェックオフされたスキル
を検索するクエリを構築します */

function skill_search( $skills) {
if (!empty($skills)) {
$query = "SELECT DISTINCT user.username
FROM user, const_skills, lookup_skills
WHERE lookup_skills.uid = user.id
AND lookup_skills.skill_id = const_skills.id ";

$query .= " AND (";
foreach ($skills as $check) {
$query .= " const_skills .id = $check OR";
}

/* 最後の OR を削除 */
$query = substr($query, 0, -2);
$query .= ") ";

$count = count($skills);
$query .= " GROUP BY user.username HAVING count(user.username) >= $count";

$query .= ";";
return
}
}

?> PHP と Javascript の検索が実行される場合、この関数は次のステートメントを返します:

SELECT DISTINCT user.username FROM user, const_skills, lookup_skills WHERE lookup_skills.uid = user.id AND lookup_skills.skill_id = const_skills.id AND ( const_skills.id = 3 OR const_skills.id = 5 ) GROUP BY user.username HAVING count(user) .username) >= 2;

この関数は、選択した項目の論理積を返します。つまり、PHP と Javascript を選択した場合、PHP とユーザー名のみが返されます。 Javascript の 2 つのスキルを持つ求職者の割合。これらのスキルのいずれかを備えた候補者を見つけたい場合は、PHP *OR* Javascript を使用できます。同じレコードを表示したい場合は、最後の "GROUP BY..." 句を削除できます。


まとめ

さて、以上です。この記事で説明したように、チェックボックスは優れたフォーム要素です。この記事が、データドリブンな Web サイトの作成に協力できることを願っています。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート