db = $db; //文档的大分类 //在数组中设置文档分类 //"中文名称" => "数据库中标识" $this->ptype = array( "新闻" => "news", "想法" => "idea", "帮助" => "help", "关于" => "about" ); $this->tbl_archives = "archive"; $this->tbl_categorys = "ar_category"; $this->tbl_catalog = "ar_catalog"; $this->tbl_tag = "ar_tag"; $this->DefaultFetchMode = "PDO::FETCH_BOTH"; } /* 写入关系表 不能外部调用 */ private function ToCatalog($aid,$cid,$uuid='',$status=0){ if(empty($aid) || !is_numeric($aid)) { return false; } if(empty($cid) && empty($uuid)) { return false; } $data = array( "aid" => $aid, "cid" => $cid, "status" => $status ); if(!empty($uuid)) { $data['uuid'] = $uuid; } if($this->db->insert($this->tbl_catalog,$data)) { return true; }else{ return false; } }//ToCatalog() //写入关系表,外部只能调用此接口 public function AddToCatalog($aid,$cid,$uuid='',$status=0) { if(!is_numeric($aid)) { return false; } if(!is_array($cid) && !is_numeric($cid)) { return false; } if(is_array($cid) && count($cid)<1) { return false; } if(is_array($cid)) { foreach($cid as $v) { $this->ToCatalog($aid,$v,$uuid,$status); } return true; }else{ return $this->ToCatalog($aid,$cid,$uuid,$status); } }//AddToCatalog //删除一个关系 function DeleteCatalog($id) { $sql = "DELETE FROM ".$this->tbl_catalog." WHERE id=$id"; @$this->db->exec($sql); } /* * 更改栏目 ChangeCatalog() */ function ChangeCatalog($aid,$typeid,$uuid='',$status=0){ try{ $sql = "SELECT * FROM ar_catalog WHERE aid=$aid"; $sth = $this->db->query($sql); $rows = $sth->fetchAll(); $types = array(); foreach($rows as $k=>$v) { $types[] = $v['cid']; if(!in_array($v['cid'],$typeid)) { //删除一个栏目 $this->DeleteCatalog($v['id']); } } foreach($typeid as $v) { if(!in_array($v,$types)) { //添加一个栏目 $this->ToCatalog($aid,$v); } } return true; }catch(Exception $e){ return $e->getMessage(); } }//ChangeCatalog //修改文档状态 function ChangeStatus($aid,$pub){ if(empty($aid) || !is_numeric($aid)) { return false; } if(!is_bool($pub)) { return false; } $data = array( "is_pub" => $pub ); if($this->db->update($this->tbl_archives,$data,"id=$aid")) { return true; }else{ return false; } }//修改文档状态 //删除文档 function DeleteArchives($aid){ if(empty($aid) || !is_numeric($aid)) { return false; } $this->DeleteTags($aid); $sql = "DELETE FROM ".$this->tbl_archives." WHERE id=$aid"; @$this->db->exec($sql); $sql = "DELETE FROM ".$this->tbl_catalog." WHERE aid=$aid"; @$this->db->exec($sql); return true; }//DeleteArchives //写入标签关系 function MakeTags($aid,$keywords){ $keywords = trim($keywords); if(empty($aid) || !is_numeric($aid)) { return false; } if(preg_match("/,/",$keywords)) { $tag = explode(",",$keywords); }else{ if($this->db->insert($this->tbl_tag,array("id"=>$aid,"tag"=>$tag))) { return true; }else{ return true; } } if(is_array($tag)) { foreach($tag as $v) { $v = trim($v); if($v!='') { $this->db->insert($this->tbl_tag,array("id"=>$aid,"tag"=>$v)); } } } return true; }//MakeTags //读取标签 function GetTags($aid,$limit=0){ if(empty($aid) || !is_numeric($aid)) { return false; } $sql = "SELECT * FROM ".$this->tbl_tag." WHERE id=$aid"; if(!empty($limit)) { $sql .= " LIMIT $limit"; } $sth = $this->db->query($sql); $rows = $sth->fetchAll(); $keywords = array(); foreach($rows as $k=>$v) { $keywords[] = $v['tag']; } return $keywords; }//GetTags //删除标签 function DeleteTags($aid){ if(empty($aid) || !is_numeric($aid)) { return false; } $sql = "DELETE FROM ".$this->tbl_tag." WHERE id=$aid"; @$this->db->exec($sql); return true; }//DeleteTags /* * addArchive() 添加档案 * * @param array $data * * @return int; */ function addArchive($data,$typeid,$keyword='') { $data = $this->scanField($data); if($data == false) { return 0; } //执行SQL语句后返回插入文章表的ID $sql = "INSERT INTO ".$this->tbl_archives." (userid,title,description,image,source,ts_published,is_pub,body) VALUES ( ".$data['userid'].", ".$data['title'].", ".$data['description'].", ".$data['image'].", ".$data['source'].", ".$data['ts_published'].", ".$data['is_pub'].", ".$data['body']." ) RETURNING id"; try{ $sth = $this->db->prepare($sql); if($sth->execute()) { $temp = $sth->fetch(PDO::FETCH_ASSOC); $newAid = $temp['id']; $this->AddToCatalog($newAid,$typeid); if(!empty($keyword)) { $this->MakeTags($newAid,$keyword); } return $newAid; }else{ return 0; } }catch(Exception $e) { return 0; } }//addArchive() /* * updateArchive() 更改文档 * * @param array $data * * @return int */ function updateArchive($aid,$data,$typeid,$keyword='') { if(!is_numeric($aid)) { return 0; } $data = $this->scanField($data); if($data == false) { return 0; } $sql = "UPDATE ".$this->tbl_archives." SET userid=".$data['userid'].", title=".$data['title'].", description=".$data['description'].", image=".$data['image'].", source=".$data['source'].", ts_published=".$data['ts_published'].", is_pub=".$data['is_pub'].", body=".$data['body']." WHERE id=$aid"; try{ if($this->db->exec($sql)) { if(!empty($keyword)) { $this->DeleteTags($aid); $this->MakeTags($aid,$keyword); } $this->ChangeCatalog($aid,$typeid); return $aid; }else{ return 0; } }catch(Exception $e) { return 0; } } //扫描字段 function scanField($data){ if(!is_array($data)) { return false; } //对特殊字段进行特别处理 $data['title'] = $this->replaceHtml($data['title']); $data['description'] = $this->replaceHtml($data['description']); //将参数过滤一遍,如果是字符型字段 //就执行db->quote() foreach($data as $k=>$v) { if(!is_numeric($v) || !is_bool($v)) { $data[$k] = $this->db->quote($v); } } return $data; }//scanField //过滤UTF-8字符的html代码 function replaceHtml($html) { $newString = htmlentities($html, ENT_QUOTES, "UTF-8"); return $newString; } /************* 读取 ****************/ /* * makeArchiveUrl() * 创建一个文档的链接 * 连接地址需要和路由规则对应 * * @param array $parts * * @return string; */ public function makeArchiveUrl($parts) { $http_host = "http://".$_SERVER ['HTTP_HOST']; $controller = "archives"; $url = $http_host."/".$controller."/".$parts['ptype']."/".$parts['type_code']."/archive-".$parts['archive_id'].".html"; //$url = $http_host."/".$controller."/".$parts['type_code']."/".$parts['archive_id']; return $url; } public function makeCategoryUrl($parts) { $http_host = "http://".$_SERVER ['HTTP_HOST']; $controller = "archives"; $url = $http_host."/".$controller."/".$parts['ptype']."/".$parts['type_code'].""; return $url; } /* * getArchiveUrl() * 通过文档ID和栏目ID获得某个文档的url * 仅适用于单个栏目的文档且已经得知其栏目ID * 如果是多个栏目的文档,则获取第一个栏目的文档连接 * * @param int $aid * * @return string; */ function getArchiveUrlByCid($aid,$cid=0) { if(empty($aid) || !is_numeric($aid)) { return false; } $ecField = array($aid); $wheresql = ""; if(!empty($cid) && is_numeric($cid)) { $wheresql = " AND c.id=? "; $ecField[] = $cid; } $sql = "SELECT arc.id,c.id as cid,c.title,c.code,c.ptype FROM ".$this->tbl_archives." arc LEFT JOIN ".$this->tbl_catalog." ct ON arc.id=ct.aid LEFT JOIN ".$this->tbl_categorys." c ON ct.cid = c.id WHERE arc.id=? $wheresql LIMIT 1"; $sth = $this->db->prepare($sql); $sth->execute($ecField); $row = $sth->fetch(PDO::FETCH_BOTH); $url_parts = array( "ptype"=>$row['ptype'], "type_code"=>$row['code'], "archive_id"=>$row['id'] ); return array( 'archive_url'=>$this->makeArchiveUrl($url_parts), 'type_title'=>$row['title'], 'type_id'=>$row['cid'], 'type_url'=>$this->makeCategoryUrl($url_parts), ); }//getArchiveUrlByCid() function getArchive($code='') { $sql = "select a.* from ".$this->tbl_archives." a left join ".$this->tbl_catalog." ac on a.id=ac.aid left join ".$this->tbl_categorys." c on ac.cid=c.id "; if (!empty($code)) $sql.=" where c.code='".$code."'"; $rs=$this->db->query($sql); $rows=$rs->fetchAll(); return $rows; } function getOneArchive($title,$ptype='news') { $sql="update ".$this->tbl_archives." set click=click+1"; $this->db->query($sql); $sql = "select a.* from ".$this->tbl_archives." a left join ".$this->tbl_catalog." ac on a.id=ac.aid left join ".$this->tbl_categorys." c on ac.cid=c.id "; $sql.=" where a.title=? and c.ptype=?"; $sth=$this->db->prepare($sql); $sth->execute(array($title,$ptype)); $rows=$sth->fetch(); return $rows; } }