站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
Xoops ORM对象关系映射2
”(章节)
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
===数据操作=== 上例讲解了如何基于XOOPS系统的安全机制编写向数据表插入数据的程序。基于XOOPS系统开发数据操作程序通过已封装的函数可以有这样一些便捷: #query函数已封装了安全机制 #prefix函数为表名增加前缀 #addSlashes函数自动处理magic_quote_gpc选项 虽然通过这些封装函数已能大幅度提升开发效率,但仍有不尽如人意的地方: #需要事先考虑并选择query函数还是queryF函数 #SQL语句需要拼写 #在XoopsObject对象中已保存有字段信息,但是SQL语句中还需要重复一遍 而在Frameworks库中,又进一步将这些函数封装成对象,可以直接以对象的方式操作数据。接下来本例将在上例的基础上,讲解基于Frameworks库如何开发增加、删除和修改数据记录程序。本例的文件夹结构如下: <pre> /modules/ormwrite /class /section.php /images /logo.png /sql /mysql.sql /templates /ormwrite_index.html /create.php /delete.php /edit.php /index.php /insert.php /save.php /xoops_version.php </pre> 其中xoops_version.php的内容如下: <pre> /modules/ormwrite/xoops_version.php <?php $modversion['name'] = "ORM对象关系映射 - 增加,删除和修改"; $modversion['version'] = 0.01; $modversion['description'] = "演示数据库的增加,删除和修改"; $modversion['author'] = <<<AUTHOR 胡争辉 QQ: 443089607 QQMail: hu_zhenghui@qq.com GTalk: huzhengh GMail: huzhengh@gmail.com Skype: huzhenghui" AUTHOR; $modversion['credits'] = ""; $modversion['license'] = "版权所有"; $modversion['image'] = "images/logo.png"; $modversion['dirname'] = "ormwrite"; $modversion["hasMain"] = 1; $modversion["sub"][0]["name"] = "新增"; $modversion["sub"][0]["url"] = "create.php"; $modversion["sqlfile"]["mysql"] = "sql/mysql.sql"; $modversion["tables"][] = "ormwrite_section"; $modversion["templates"][0]["file"] = "ormwrite_index.html"; $modversion["templates"][0]["description"] = "Template for index.php"; ?> </pre> 为便于对照学习,本例采用上例中的数据结构。mysql.sql的内容如下: <pre> /modules/ormwrite/sql/mysql.sql CREATE TABLE `ormwrite_section` ( /* 详见源代码 */ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1; </pre> 本例的数据对象和数据访问句柄也不需要额外的编码,与上例类似,section.php文件的源代码如下: <pre> /modules/ormwrite/class/section.php <?php /* 详见源代码 */ class OrmwriteSection extends ArtObject { function OrmwriteSection () { $this->ArtObject("ormwrite_section"); /* 详见源代码 */ } } class OrmwriteSectionHandler extends ArtObjectHandler { function OrmwriteSectionHandler($db) { $this->ArtObjectHandler($db, "ormwrite_section", "OrmWriteSection", "id", "caption"); return; } } ?> </pre> 在index.php中显示全部的数据项,和“数据查询”小节中的index.php类似,源代码如下: <pre> /modules/ormwrite/index.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $sectionhandler = xoops_getmodulehandler("section", "ormwrite"); /* @var $sectionhandler OrmwriteSectionHandler */ $xoopsOption["template_main"] = "ormwrite_index.html"; /* 详见源代码 */ ?> </pre> 对应的ormwrite_index.html模板源代码如下; <pre> /modules/ormwrite/templates/ormwrite_index.html <{strip}> <table> <tr> <!-- 详见源代码 --> <th> Delete </th> </tr> <{foreach item="sectionitem" key="key" from=$allsections}> <tr> <td> <a href="edit.php?id=<{$key}>"> <{$key}> </a> </td> <td> <a href="edit.php?id=<{$key}>"> <{$allsections.$key->getVar("caption")}> </a> </td> <td> <a href="delete.php?id=<{$key}>"> Delete </a> </td> </tr> <{/foreach}> </table> <{/strip}> </pre> 在模板中为Key列和Caption列增加了[[链接]]到编辑页面的链接,然后增加了一列链接到删除页面。效果如图2-12数据操作图2-12数据操作--列表所示。 <div> [[Image:xop99.png]] </div> 其中Key列和Caption列都有到编辑页面的链接,而Delete列有到删除页面的链接。 说明:从代码中可以看出,修改的范围都是在模板中,而没有修改index.php文件,这体现了XOOPS系统将逻辑与展现分离的优势。 本例中新增功能设计成了一个菜单项,单击该菜单项进入create.php页面,源代码如下: <pre> /modules/ormwrite/create.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; include XOOPS_ROOT_PATH."/header.php"; include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php"; $create_form = new XoopsThemeForm("Create Section", "create_form", "insert.php"); $create_form->addElement(new XoopsFormText("Section", "section", 20, 20)); $create_form->addElement(new XoopsFormButton("", "submit", _SUBMIT, "submit")); $create_form->display(); include XOOPS_ROOT_PATH."/footer.php"; ?> </pre> 由于本页面仅显示一个表单,所以没有使用表单。页面的效果如图2-13数据操作--新增所示。 <div> [[Image:xop100.png]] </div> 在Section文本框中输入要增加的名称,然后单击“提交”按钮,表单被将提交到insert.php页面。insert.php页面的源代码如下: <pre> /modules/ormwrite/insert.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $sectionhandler = xoops_getmodulehandler("section", "ormwrite"); /* @var $sectionhandler OrmwriteSectionHandler */ $section = $sectionhandler->create(); $section->setVar("caption", $_POST["section"]); $sectionhandler->insert($section); redirect_header("index.php"); ?> </pre> 在创建了数据操作句柄之后,调用create函数创建数据对象。 $section = $sectionhandler->create(); 其中create函数定义在_XoopsPersistableObjectHandler类中,用于创建一个新的数据对象。 <pre> /Frameworks/art/object.persistable.php function &create($isNew = true) {} </pre> 然后调用setVar函数设置caption字段的值。 $section->setVar("caption", $_POST["section"]); setVar函数定义在XoopsObject类中,用于设置数据对象的字段值。 <pre> /Kernel/object.php function setVar($key, $value, $not_gpc = false) {} </pre> 其中$key参数是字段的名称,$value参数是字段的值。接下来调用insert函数保存数据对象。 $sectionhandler->insert($section); insert函数是ArtObjectHandler类动态调用ArtObjectWriteHandler类的insert函数。定义如下: <pre> /Frameworks/art/object.write.php function insert(&$object, $force = true) {} </pre> 其中$object参数是数据对象,$force参数用于处理数据库安全策略,默认值是true,表示调用queryF函数,如果设置为 false,则调用query,可以借助XOOPS系统自身的数据安全策略。通过以上三个步骤就完成了上例中向数据库插入数据的过程。下面对照讲解。 一,在setVar函数中会自动处理magic_quote_gpc,因此不需要像上例调用$myts->addSlashes($_REQUEST["section"]。 二,数据调用句柄的构造函数中包含了表名,所以不需要像上例中调用$xoopsDB->prefix("ormproxy_section")。 三,insert函数中自动构造SQL语句并执行query函数,所以不需手工构造SQL语句及调用query函数。 构造的SQL语句如下所示。 INSERT INTO xoops_ormwrite_section (caption) VALUES ('xoops_version.php'); 插入数据后调用redirect_header函数重定向到列表页。就可以在列表页上看到刚插入的数据了。 在列表页面的模板中,为Key列和Caption列都增加了到edit.php页面的链接,增加了数据项之后,就可以在列表页单击这些链接进入到edit.php页面。源代码如下: <pre> /modules/ormwrite/edit.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $myts = MyTextSanitizer::getInstance(); /* @var $myts MyTextSanitizer */ $sectionhandler = xoops_getmodulehandler("section", "ormwrite"); /* @var $sectionhandler OrmwriteSectionHandler */ if (true === isset($_GET["id"])) { $section = $sectionhandler->get($myts->stripSlashesGPC($_GET["id"])); } /* @var $section OrmwriteSection */ if (false === isset($section)) { redirect_header("index.php"); } include XOOPS_ROOT_PATH."/header.php"; include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php"; $edit_form = new XoopsThemeForm("Edit Section", "edit_form", "save.php"); $edit_form->addElement(new XoopsFormHidden("id", $section->getVar("id"))); $edit_form->addElement(new XoopsFormLabel("Id", $section->getVar("id"))); $edit_form->addElement(new XoopsFormText("Section", "section", 20, 20, $section->getVar("caption"))); $edit_form->addElement(new XoopsFormButton("", "submit", _SUBMIT, "submit")); $edit_form->display(); include XOOPS_ROOT_PATH."/footer.php"; ?> </pre> 编辑页面中首先需要判断是否设置了待编辑的数据的id,然后调用数据访问句柄的get函数获取数据对象。get函数定义在_XoopsPersistableObjectHandler类中。 <pre> /Frameworks/art/object.persistable.php function &get($id = null, $tags = null) {} </pre> 其中$id参数是主键的值,get函数将按传入的参数作为主键的键值查询数据库并返回数据对象。Frameworks库将自动完成对值转义、构造SQL语句、执行和转换成数据对象的工作。例如本例中id是1时,将得到如下的SQL语句。 SELECT * FROM xoops_ormwrite_section WHERE id = '1'; 如果数据库中没有相应的记录,则get函数将返回NULL,此时应当跳转到列表页面。如果返回数据对象,则显示页面并显示表单。由于该对象已有主键,所以应当在表单中包含主键,而且该主键不允许被用户直接编辑,通常采用隐藏域。 $edit_form->addElement(new XoopsFormHidden("id", $section->getVar("id"))); XoopsFormHidden是隐藏域类,定义在formhidden.php中。 <pre> /class/xoopsform/formhidden.php class XoopsFormHidden extends XoopsFormElement {} </pre> XoopsFormHidden类继承自XoopsFormElement类,XoopsFormHidden类的构造函数如下: <pre> /class/xoopsform/formhidden.php function XoopsFormHidden($name, $value) {} </pre> 其中$name参数是隐藏域的名称,$value参数是隐藏域的值。表单通过隐藏域就维护了数据对象的主键,另一方面,为便于用户识别,也应当显示该主键。 $edit_form->addElement(new XoopsFormLabel("Id", $section->getVar("id"))); XoopsFormLabel是表单标签类,定义在formlabel.php中。 <pre> /class/xoopsform/formlabel.php class XoopsFormLabel extends XoopsFormElement {} </pre> XoopsFormLabel类继承自XoopsFormElement类,XoopsFormHidden类的构造函数如下: <pre> /class/xoopsform/formlabel.php function XoopsFormLabel($caption="", $value="", $name=""){} </pre> 其中$caption参数是标签的名称,$value参数是标签的内容。表单中通过标签可以显示提示信息,与前面讲解的XoopsFormText 类、XoopsFormButton类、XoopsFormHidden类不同的是XoopsFormLabel类并不实际对应于HTML中的表单元素。而只是普通的页面元素,这体现了XOOPS系统的面向对象的便捷之处。显示的页面如图2-14数据编辑--编辑所示。 <div> [[Image:xop101.png]] </div> 编辑内容后,单击“提交”按钮,数据将提交到save.php页面中。 <pre> /modules/ormwrite/save.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $myts = MyTextSanitizer::getInstance(); /* @var $myts MyTextSanitizer */ $sectionhandler = xoops_getmodulehandler("section", "ormwrite"); /* @var $sectionhandler OrmwriteSectionHandler */ if (true === isset($_POST["id"])) { $section = $sectionhandler->get($myts->stripSlashesGPC($_POST["id"])); } /* @var $section OrmwriteSection */ if (false === isset($section)) { redirect_header("index.php"); } $section->setVar("caption", $_POST["section"]); $sectionhandler->insert($section); redirect_header("index.php"); ?> </pre> save.php页面的功能类似于将edit.php和insert.php两个页面组合起来。前半部分像edit.php页面一样,根据输入的 id获取数据对象。后半部分和insert.php页面一样,将输入的参数设置给数据对象,然后用数据访问句柄更新。生成的SQL语句如下所示。 UPDATE xoops_ormwrite_section SET caption = 'xoops_version.php' WHERE id = '1'; 值得注意的是,对于新对象和已存在的对象,都是调用insert函数,开发人员不需要进行额外的判断,Frameworks库中已封装好相应的判断了。 说明:本例为了便于演示,所以将新建数据和更新数据分开编辑,在实际开发中,借助于Frameworks库的封装,可以将新建数据和更新数据两个过程合并在一起。请读者自行练习。 更新完成后调用redirect_header函数跳转到列表页面,可以看到更新后的内容。在列表页面的Delete列提供了到删除页面的链接。删除页面的源代码如下: <pre> /modules/ormwrite/delete.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $myts = MyTextSanitizer::getInstance(); /* @var $myts MyTextSanitizer */ $sectionhandler = xoops_getmodulehandler("section", "ormwrite"); /* @var $sectionhandler OrmwriteSectionHandler */ if (true === isset($_GET["id"])) { $section = $sectionhandler->get($myts->stripSlashesGPC($_GET["id"])); } /* @var $section OrmwriteSection */ if (false === isset($section)) { redirect_header("index.php"); } $sectionhandler->delete($section, true); redirect_header("index.php"); ?> </pre> 删除页面的前半部分与编辑页面和保存页面类似,都是依据输入参数选择出相应的数据对象,并判断数据对象是否存在。然后调用delete函数删除数据对象。 $sectionhandler->delete($section, true); delete函数是ArtObjectHandler类动态调用ArtObjectWriteHandler类的delete函数,定义如下: <pre> /Frameworks/art/object.write.php function delete(&$obj, $force = false) {} </pre> 其中$object参数是数据对象,$force参数用于处理数据库安全策略,默认值是true,表示调用queryF函数,如果设置为false,则调用query,可以借助XOOPS系统自身的数据安全策略。如果传入的id值为1,则构造SQL语句如下: DELETE FROM xoops_ormwrite_section WHERE id = '1'; 本例中$force参数没有使用默认值false,而是设置为true。这是因为从列表页面到删除页面使用链接,而链接是GET请求,所以设置$force参数的值为true来强制执行。在删除后重定向列表页面,可以看到该数据项已被删除。
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)