|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
兴趣可能会慢慢消亡,所以适当培养兴趣会激发自己无线的乐趣,有了乐趣,编程有啥难的。数据|数据库 引见
checkbox是一个十分有效的页面表单项,在让用户停止多重选择的情形下,它乃至可以答应用户选择全体项目或是一个都不选。然而,虽然这是一个十分优异的表单位素,但在咱们的任务中,在若何准确地保留选择项这方面总存在一些易搅浑的情形产生。本文将描写在遵守好的数据库设计准绳的办法下,若何把checkbox选择项准确地保留在数据库中。
请求
本文将论述若何把选择项准确地保留在用户数据库中的办法。虽然这里包含了有效的PHP代码,但我将从数据库设计的概念来表达它们,所以,你可以很便利地利用任何一个数据库和办事器端剧本言语来完成。我只是想供应一个若何做的办法,让你能使用于你本人的站点中。假如你想运转这里的源码,你需求装置php、mysql和收集办事器。
例1:雇用站点
假设你被请求做一个雇用类的网站,答应求职的软件开辟人员填写他们的妙技,让雇主能会见这个站点并依据求职者的妙技找到适合的员工。你也晓得,一个开辟人员具有的妙技会多于一个,因而你决意如许设计你的站点。
每个求职者将答应会见本站,注册一个用户,而且输出他的妙技,Checkbox就派上用处了,你能够想作如许的一页:
__ PHP __ MySQL __ Zope
__ Perl __ Javascript __ JSP
[提交]
每个求职都可以选择他所具有的妙技。明显关于分歧人来讲这选择项是分歧的。一团体能够会是PHP和Mysql,其它人能够只是JSP。你将若何保留这些选择呢?一个很天然的设法是针对每一个选项建一个字段,如许入手下手可以正常任务。然而随后你能够会发明,当你想扩大或调剂时,费事就来了,你能够不能不修正你的表布局。
好的办法应是如许的:
你应有一个用户表包括用户的注册信息,如用户名、暗码和其它一些你需求的甚么内容。假设你直接利用本文前面给出的源码,你要建一个复杂的表以下:
id username
1 User1
2 User2
3 User3
咱们先建一个表 "const_skills" 用以下的 SQL 语句:
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, 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
这个表只是让用户可以选择响应的妙技,如今,再建一个表 lookup_skills 用以下的SQL:
SQL> CREATE TABLE lookup_skills (
id int not null auto_increment primary key,
uid int,
skill_id int );
这个表lookup_skills的目标是供应从用户表到开辟妙技表之间的一个映照关系。换句话说,它让咱们保留开辟者和他们有的妙技,如,当求职者完成选择点击提交时,咱们将填写这个表用checkbox中被选定的那些值。关于每个选上的妙技,咱们在这个表中加一笔记录,记下用户id及所选项的id。(想必人人都清晰了吧。我译到这,嘿嘿…)
在咱们看这个拔出纪录的代码之前,咱们先设计一下这个页面,应有的内容有一个表单,咱们可以查询的数据库而且取checkbox标签从const_skills表中,建这个checkbox表单项。
代码以下:
< ?php
/* insert code to connect to your database here */
/* get the checkbox labels */
$skills = get_checkbox_labels("const_skills");
/* create the html code for a formatted set of
checkboxes */
$html_skills = make_checkbox_html($skills, 3, 400, "skills[]");
? >
< html >
< body >
< br >
< form name="skills" method="POST" action="insertskills.php" >
Check off your web development skills:
< ? echo "$html_skills"; ? >
< br >
< input type="submit" value="Submit" >
< /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"。个中 "get_checkbox_labels" 查询表const_skills 而且前往一个对象数组,每个对象有一个id值和响应的妙技称号。咱们传送这个数组和其它一些参数给"make_checkbox_html" ,这个函数将前往一个字串,用来生成checkbox的html代码。如今咱们把这个字串拔出html文件来生成咱们需求的包括有各类妙技选择的表单。注重我并没有传送变量 $checked 给"make_checkbox_html",这个参数是一个咱们要显示的checked的对象数组。假如一个用户学会了一项新的妙技,咱们可以供应一个“编纂妙技“页,显示的checkbox框中保留的用户的妙技项应是被事后 checked。
用这类办法来静态创立一个表单相对用一个固定的html代码来生成妙技checkbox的优点在哪?嗯,也许咱们答应求职者选择一个在咱们的表const_skills华夏先没有的项目,如DHTML,如许,咱们可以将它拔出表const_skills中,然后,求职者来会见咱们的站点,就会发明多了一个DHTML选项。这一切无需调剂html文件。
拔出 lookup_skills
如今咱们已创立了这个表单,上面咱们需求保留这个用户所选的妙技。在make_checkbox_html函数中,咱们用skill[]挪用每个选择项元素,意味着咱们可以以数组元素的模式会见每一个选择项。如许咱们可以拔出把这个选择拔出表lookup_skill中。假如用户选中5个选项,咱们就在lookup_skill中拔出5笔记录。记住在表lookup_skills中每笔记录只要两个字段用户id和妙技id。在我的这个例子站点中,用户可以注册,然后能创立/编纂他们的简介。你能够要用session来保留userid,当他们登录后。但若何办理userid超越了本文的局限。
上面的代码,咱们假定咱们能够会见这个userid用这个变量名$uid,上面就是拔出纪录的函数代码:
/* the function we call to insert.
the $skills argument is the skills array that
is sent to the script when the user hits the submit button
*/
function insert_skills($uid, $skills) {
/* first, we'll delete any entries this user already has
in the table */
purge_lookup("lookup_skills", $uid);
/* now create the sql insert query */
$query = create_checkbox_query($skills, "lookup_skills", $uid);
/* execute the query */
mysql_query($query);
}
/* helper function for insert_skills().
removes all rows in $table with $uid */
function purge_lookup($table, $uid) {
$q = "DELETE FROM $table, WHERE uid = '$uid'";
mysql_query($q);
}
/* helper function for insert_skills().
generates the sctual SQL query */
function create_checkbox_query($arr, $table, $uid) {
$q = "INSERT INTO $table (uid, skill_id) VALUES";
foreach ($arr as $check) {
$q .= " ( $uid , $check )" . ",";
}
/* remove the last comma and return */
return substr($q, 0, -1);
}
?>
很复杂吧。如今你晓得若何从表const_skill读纪录来静态创立一个表单,也晓得若何保留用户选择的妙技到表lookup_skills中。上面咱们要做甚么?让咱们看一下搜刮吧
搜刮
当一个雇主来找一个收集开辟人员时,他离开你的搜刮页面,你可以显示一样的一个表单而且答应他选择他想要雇员具有的妙技。你取到了他选中的妙技的数组,然后你可以遍历这个数组,用一个SQL语句找出具有此妙技的求职者,你可以显示这个列表或了局,并答应搜刮者点一个项目显示它的具体信息。上面的这个函数描写了若何创立这个查询语句:
/* builds a query to search for the skills
checked off in the $skills array */
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";
}
/* remove the final OR */
$query = substr($query, 0, -2);
$query .= ")";
$count = count($skills);
$query .= " GROUP BY user.username HAVING count(user.username) >= $count";
$query .= ";";
return $query;
}
}
?>
假如履行了搜刮 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两种妙技的求职者的username。假如你想要找具有个中任一个妙技的求职者,你可以用 PHP *OR* Javascript ,假如你想显示不异的纪录,你可以去失落最初的"GROUP BY..." 子句。
总结
好了,就是如许。checkboxes是一个优异的表单位素,正如本文所议论的。我但愿这有助于你用它们来任务,创立一个数据驱动的网站。学会了生成静态网页,现在你应该接触一下XML了,恩,XML也了解了,那么AJAX你也得接触接触吧?AJAX完了....然后... |
|