仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2941|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP中在数据库中保留Checkbox数据

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-16 00:24:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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完了....然后...
飘飘悠悠 该用户已被删除
沙发
发表于 2015-2-16 01:09:28 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
乐观 该用户已被删除
板凳
发表于 2015-3-1 09:20:01 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
小女巫 该用户已被删除
地板
发表于 2015-3-7 23:37:05 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
谁可相欹 该用户已被删除
5#
发表于 2015-3-15 16:51:00 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
精灵巫婆 该用户已被删除
6#
发表于 2015-3-19 07:16:48 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
活着的死人 该用户已被删除
7#
发表于 2015-3-21 21:13:14 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
兰色精灵 该用户已被删除
8#
发表于 2015-3-27 23:09:26 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
admin 该用户已被删除
9#
发表于 2015-4-7 17:07:00 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
再现理想 该用户已被删除
10#
发表于 2015-4-11 07:10:04 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
飘灵儿 该用户已被删除
11#
发表于 2015-4-12 17:45:51 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
爱飞 该用户已被删除
12#
发表于 2015-4-26 04:43:18 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
只想知道 该用户已被删除
13#
发表于 2015-4-27 02:26:43 | 只看该作者
爱上php,他也会爱上你。
灵魂腐蚀 该用户已被删除
14#
发表于 2015-5-1 04:11:38 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
老尸 该用户已被删除
15#
发表于 2015-5-1 06:13:51 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
分手快乐 该用户已被删除
16#
发表于 2015-6-29 21:10:30 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
山那边是海 该用户已被删除
17#
发表于 2015-6-29 22:06:18 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
金色的骷髅 该用户已被删除
18#
发表于 2015-7-5 01:02:36 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
海妖 该用户已被删除
19#
发表于 2015-7-9 19:22:39 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
冷月葬花魂 该用户已被删除
20#
发表于 2015-7-10 06:02:19 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 15:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表