在阿帕奇环境下,首先我在HTML页面里通过循环导出了数据库里文章的内容(标题,content),然后点击“修改”,跳转到另一个页面,然后我在action.PHP里使用save()语句,但是没有实现功能。下面是代码:HTML页面代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head><body>
<div  style="margin:0 auto;">
   <a  href="__URL__/tian">添加文章</a>
<table border="1"  style=" text-align:center">
<tr>
  <td>文章标题</td>
    <td>内容</td>
  <td>发布日期</td>
  <td>操作</td>
</tr>
    <volist name="bingo" id="vo">
<tr>
  <td>    {$vo.title}</td>
    <td>   {$vo.content}</td>
    <td> {$vo.pubdate}</td>  <td ><a href="__URL__/find/id/{$vo.id}" style=" text-decoration:none;color:#000">查看</a
  ><a href="__URL__/make/id/{$vo.id}" style="text-decoration:none;;color:#000">&nbsp;编辑</a>
  &nbsp;<a href="__URL__/del/" style="text-decoration:none;color:#000">删除</a></td>
</tr></volist></table>
</div>
点击编辑后,跳转到编辑页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body><form id="make" method="post" action="save/id/{$vo.id}">
文章标题:<input type="text" value="{$info.title}"><br>
文章内容:<textarea rows="30" cols="30">{$info.content}</textarea><br>
<input type="submit" value="提交">
   <input type="reset" value="重置">
</form>
</body>
</html>
action.php代码:
class IndexAction extends Action{
    public function save(){
        $article=D("article");
    $a["title"]=$_POST["title"];
        $id=$_GET["id"];
            $a["content"]=$_POST["content"];
            $a["pubdate"]=date("Y-M-D");
        $article->add($a);
        $article->where("id='$id'")->save($a);
        $this->display("body");}
}
求大神查找错误并讲解!!!谢谢!

解决方案 »

  1.   

    用的tinkphp吗?
    在save之后输出sql语句看看
    echo $article->getLastSql();exit;
      

  2.   

    手册有详细的说明,可一查询在ThinkPHP中使用save方法更新数据库,并且也支持连贯操作的使用。用法
     save($data='',$options=array())
     
    参数
     data:要保存的数据,如果为空,则取当前的数据对象。options:为数组的时候表示操作表达式,通常由连贯操作完成;为数字或者字符串的时候表示主键值。默认为空数组。
     
    回调接口
     更新前_before_update(&$data,$options)更新成功后 _after_update($data,$options)
     
    返回值
     如果查询错误或者数据非法返回false如果更新成功返回影响的记录数
     
    相关方法
     通常配合连贯操作where、field、order等一起使用
      $User = M("User"); // 实例化User对象// 要修改的数据对象属性赋值$data['name'] = 'ThinkPHP';$data['email'] = '[email protected]';$User->where('id=5')->save($data); // 根据条件保存修改的数据为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。因此下面的代码不会更改数据库的任何记录$User->save($data); 除非使用下面的方式:$User = M("User"); // 实例化User对象// 要修改的数据对象属性赋值$data['id'] = 5;$data['name'] = 'ThinkPHP';$data['email'] = '[email protected]';$User->save($data); // 根据条件保存修改的数据如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。$User = M("User"); // 实例化User对象// 要修改的数据对象属性赋值$data['name'] = 'ThinkPHP';$data['email'] = '[email protected]';$User->where('id=5')->data($data)->save(); // 根据条件保存修改的数据使用create方法的例子:$User = M("User"); // 实例化User对象// 根据表单提交的POST数据创建数据对象$User->create();$User->save(); // 根据条件保存修改的数据上面的情况,表单中必须包含一个以主键为名称的隐藏域,才能完成保存操作。如果只是更新个别字段的值,可以使用setField方法。用法
     setField($field,$value='')
     
    参数
     field:要更新的字段名,如果是数组,则表示更新多个字段。value:要更新的值,当field为数组的时候value值无效。
     
    返回值
     如果查询错误返回false如果更新成功返回影响的记录数
     
    相关方法
     必须配合连贯操作where一起使用
     使用示例:$User = M("User"); // 实例化User对象// 更改用户的name值$User-> where('id=5')->setField('name','ThinkPHP');setField方法支持同时更新多个字段,只需要传入数组即可,例如:$User = M("User"); // 实例化User对象// 更改用户的name和email的值$data = array('name'=>'ThinkPHP','email'=>'[email protected]');$User-> where('id=5')->setField($data);而对于统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法。用法
     setInc($field,$step=1)字段值增长setDec($field,$step=1)字段值减少
     
    参数
     field:要更新的字段名。step:增长或者减少的数值,默认为1。
     
    返回值
     如果查询错误返回false如果更新成功返回影响的记录数
     
    相关方法
     必须配合连贯操作where一起使用
      $User = M("User"); // 实例化User对象$User->where('id=5')->setInc('score',3); // 用户的积分加3$User->where('id=5')->setInc('score'); // 用户的积分加1$User->where('id=5')->setDec('score',5); // 用户的积分减5$User->where('id=5')->setDec('score'); // 用户的积分减1 四、删除数据(Delete)在ThinkPHP中使用delete方法删除数据库中的记录。用法
     delete($options=array())
     
    参数
     options:为数组的时候表示操作表达式,通常由连贯操作完成,如果没有传入任何删除条件,则取当前数据对象的主键作为条件;为数字或者字符串的时候表示主键值。默认为空数组。
     
    回调接口
     删除成功后 _after_delete($data,$options)
     
    返回值
     如果查询错误返回false如果删除成功返回影响的记录数
     
    相关方法
     通常配合连贯操作where、field、order等一起使用
      示例如下:$User = M("User"); // 实例化User对象$User->where('id=5')->delete(); // 删除id为5的用户数据$User->where('status=0')->delete(); // 删除所有状态为0的用户数据delete方法可以用于删除单个或者多个数据,主要取决于删除条件,也就是where方法的参数,也可以用order和limit方法来限制要删除的个数,例如:// 删除所有状态为0的5 个用户数据 按照创建时间排序$User->where('status=0')->order('create_time')->limit('5')->delete(); 
      

  3.   

    $article = M("article");  
    $a["title"]=$_POST["title"];
    $id=$_GET["id"];
    $a["content"]=$_POST["content"];
    $a["pubdate"]=date("Y-M-D");
    $article->where("id='$id'")->save($a); 
    $this->display("body");或者
    $article = M("article");
     
    $a["title"]=$_POST["title"];
    $id=$_GET["id"];
    $a["content"]=$_POST["content"];
    $a["pubdate"]=date("Y-M-D");$article->ave($a); 可以根据具体情况改一下
      

  4.   

    拜托兄弟:
    <input type="text" name="title" value="{$info.title}"><br>
    文章内容:<textarea name="content" rows="30" cols="30">{$info.content}</textarea><br>form 表单提交的时候把 标题 和内容 的 name 值加上 行(╯3╰)