ThinkPHP建立简单的新闻站(二) -增删修查

ThinkPHP的超链接

       ThinkPHP将模板输出之前会进行模板替换,将预定义的一些特殊字符进行替换操作。下面几个就是最常用的替换规则,你可以将其写在index.html页面中看看效果。

__URL__ :会替换成当前模块的URL地址,例如:/Myweb/index.php/Index

__APP__ :会替换成当前项目的URL地址,例如:/Myweb/index.php

__PUBLIC__ :会被替换成当前网站的公共目录 通常是 /Public/,例如:/Myweb/Public

__ROOT__ :会替换成当前网站的地址,例如:/Myweb

以上几个是最常用的,除此以外还有:

__GROUP__:会替换成当前分组的URL地址

__ACTION__:会替换成当前操作的URL地址

__SELF__: 会替换成当前的页面URL

以上字符替换出来的结果是可自行测试。

读取新闻

       上一章我们读取了新闻并做成列表,本章我们来读取新闻内容。

       首先在Tpl/Index下新建HTML页面info.html。打开Lib/Action下的IndexAction.class.php文件,添加与刚刚这个页面同名的方法:

public function info(){

       $this->display();

}

然后我们修改下index.html页面,将

<td>{$mynews.fTitle}</td>

修改为

<td><a 链接="__URL__/info/id/{$mynews.fID}">{$mynews.fTitle}</a></td>

然后回到控制器,读取指定新闻:

public function info(){

       $id=$_GET['id'];

       $DBnews=M('news');

       $res=$DBnews->where("fID='".$id."'")->find();

       $this->assign('title', '新闻站');

       $this->assign('news',$res);

       $this->display();

}

$id获取到在index.html中传的新闻fID值,然后使用where语句在表中查找。注意where放在find()之前。find()是只从表中取出一条数据,相当于select()加限制只取一条数据。但是find()与select()最大区别在于,find()取出的值是一维数组,select()取出值是二维数组,即便只取一条数据也是二维数组。最后把info.html页面内容写好即可

修改新闻

<div><a链接="__URL__/edit/id/{$news.fID}">修改新闻</a></div>

然后在Tpl/Index下新建一个edit.html页面。

<!DOCTYPE html>

<html>

<head>

<title>{$title}</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<h1 align="center">{$title}</h1>

<hr/>

<form action="__URL__/doedit" method="post">

<table>

       <tr>

              <td>标题</td>

              <td><input type="text" name="fTitle" value="{$news.fTitle}" /></td>

       </tr>

       <tr>

              <td>作者</td>

              <td><input type="text" name="fAuthor" value="{$news.fAuthor}" /></td>

       </tr>

       <tr>

              <td>内容</td>

              <td><textarea rows="10" cols="70" name="fContent">{$news.fContent}</textarea></td>

       </tr>

       <tr>

              <td><input type="hidden" name="fID" value="{$news.fID}" /></td>

              <td><button type="submit">提交</button></td>

       </tr>

</table>

</form>

</body>

</html>

再到控制器里写好该方法:

public function edit(){

       $id = $_GET['id'];

       $DBnews = M('news');

       $res = $DBnews->where("fID='" . $id . "'")->find();

       $this->assign('title', '新闻站');

       $this->assign('news', $res);

       $this->display();

}

这样就可以在文本框中显示出当前修改的新闻内容了。最后我们来做提交后的处理。看到上面代码中action里的内容想必你也应该知道了吧,在IndexAction.class.php中写一个doedit()方法:

public function doedit(){

       $data['fID']=$_POST['fID'];

       $data['fTitle']=$_POST['fTitle'];

       $data['fAuthor']=$_POST['fAuthor'];

       $data['fContent']=$_POST['fContent'];

       $data['fTime']=time();

       $DBnews=M('news');

       if($DBnews->save($data)){

              $this->success('修改成功!', '__URL__/index');

       }else{

              $this->error('修改失败!', '__URL__/index');

       }

}

       首先用$_POST[]分别接收每个提交的数据,然后分别放入一个数组中,然后使用save()来保存数据,ThinkPHP会自动根据主键fID 来查找更新的是哪条数据。最后用success()和error()函数来做页面跳转并提醒用户修改是否成功。在success()中第一个变量是提示信 息,第二个是跳转到的地址,error()使用方法相同。

       但是这样保存数据有个问题,在表单中有大量数据需要保存时,我们岂不是需要一个一个的用$_POST[]接收过来再处理,这会非常麻烦。那么有没有 方便的方法来做呢?ThinkPHP人性化的提供了create()方法来处理这种情况,下面就是用这种方法改写的doedit():

public function doedit(){

       $DBnews=M('news');

       $DBnews->create();

       $DBnews->fTime=time();

       if($DBnews->save()){

              $this->success('修改成功!', '__URL__/index');

       }else{

              $this->error('修改失败!', '__URL__/index');

       }

}

       表单post和get传值,均可这样处理;但此方法前提是表单每个数据的name属性必须与数据库里的字段名相同。不然就像$DBnews->fTime=time();这样来接收和处理数据。

       一般在处理类似情况时,不会单独写一个doedit()方法,而是在edit()方法中既显示页面又处理更新。

添加新闻

加新闻原理跟修改新闻其实非常类似,就是把文本框里的数据保存到数据库中,只不过修改新闻是根据id修改,添加新闻是新增一条。

那么首先要在index.html页面加上一个添加新闻的连接:

<a链接="__URL__/add">添加新闻</a>

然后写add.html页面。讲之前的edit.html页面复制稍微修改即可:

<!DOCTYPE html>

<html>

<head>

<title>{$title}</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<h1 align="center">{$title}</h1>

<hr/>

<form action="__URL__/add" method="post">

<table>

       <tr>

              <td>标题</td>

              <td><input type="text" name="fTitle" /></td>

       </tr>

       <tr>

              <td>作者</td>

              <td><input type="text" name="fAuthor" /></td>

       </tr>

       <tr>

              <td>内容</td>

              <td><textarea rows="10" cols="70" name="fContent"></textarea></td>

       </tr>

       <tr>

              <td><input type="hidden" name="complete" value="true" /></td>

              <td><button type="submit">提交</button></td>

       </tr>

</table>

</form>

</body>

</html>

前面提到可将doedit和edit写在一起,这里就演示将doadd和add写在一起。首先仔细看add.html中,有这么一句代码:

<td><input type="hidden" name="complete" value="true" /></td>

这句告诉程序我们是要提交数据还是要显示这个页面。于是在IndexAction.class.php中可以这样写:

public function add() {

       if (!empty($_POST['complete'])) {

              $DBnews = M('news');

              $DBnews->create();

              $DBnews->fTime = time();

              if ($DBnews->add()) {

                     $this->success('添加成功!', '__URL__/index');

              } else {

                     $this->error('添加失败!', '__URL__/index');

              }

       } else {

              $this->assign('title', '新闻站');

              $this->display();

       }

}

删除新闻

其实删除操作是添加(Create),更新(Update),读取(Read),删除(Delete)这四个操作(统称CURD)中最简单的。

首先还是要修改下index.html页面,为每条新闻增加一个删除按钮

<a 链接="__URL__/delete/id/{$mynews.fID}">删除</a>

由于删除无需页面,直接写控制器即可,在IndexAction.class.php添加一个delete()方法:

public function delete() {

       $id = $_GET['id'];

       $DBnews = M('news');

       $res = $DBnews->where("fID='" . $id . "'")->delete();

       if ($res) {

              $this->success('删除成功!', '__URL__/index');

       } else {

              $this->error('删除失败!', '__URL__/index');

       }

}

       如果删除成功,其返回值也就是$res为被删除的条数,如果删除失败则返回false。所以我们只要判断下$res就可以了。这也说明了删除是可以一次性删除多条数据的,所以在进行删除操作时要仔细,别一下把整个表的数据都删了。

       删除操作还有一种写法是:$res = $DBnews->delete($id);

       因为当delete()内的参数为数字或者字符串的时候表示主键值。ThinkPHP很聪明地明白你在这里写的$id是对应数据库表里的fID这个字段。但不建议这样用,若不小心容易把整个表的数据都删掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值