PHP+XML 制作简单的留言本 图文教程


Posted in PHP onNovember 02, 2009

1. 留言显示页面

2. 发布留言,并允许上传图片

3. 输入密码登录后可以删除留言。

1. 文件目录

 

PHP+XML 制作简单的留言本 图文教程

upfile是保存上传图片的目录。

2. 主要界面

(1)首页,显示留言页面

 

 

 PHP+XML 制作简单的留言本 图文教程

(2)发表留言页面

PHP+XML 制作简单的留言本 图文教程

 

3. XML文档格式,名称为data.xml

 

PHP+XML 制作简单的留言本 图文教程

各字段的含义不多说,各元素的值看起来有点怪,是因为我使用了base64_encode对字符串进行了编码。

 

4 主要页面代码

(1)add.php

此页只是纯粹的HTML代码

<form action="saveadd.php" enctype="multipart/form-data" method="post" name="myform" onsubmit="return go(this)">
<table border="1" width="600">
 <tr>
  <td>作者</td>
  <td align="left"><input type="text" name="author" size="10"></td>
 </tr>
 <tr>
  <td>标题</td>
  <td align="left"><input type="text" name="title" size="50"></td>
 </tr>
 <tr>
  <td>表情</td>
  <td align="left">
   <select name="smiles" size="1" onchange="change_img();">
   <option value="smile.gif">微笑</option>
   <option value="biggrin.gif">耿直</option>
   <option value="victory.gif">胜利</option>
   <option value="tongue.gif">舌头</option>
   <option value="titter.gif">窃笑</option>
   <option value="cry.gif">哭泣</option>
   <option value="curse.gif">生气</option>
   <option value="huffy.gif">愤怒</option>
   <option value="mad.gif">疯狂</option>
   <option value="sad.gif">哀伤</option>
   <option value="shocked.gif">震惊</option>
   <option value="shy.gif">害羞</option>
   <option value="sleepy.gif">困倦</option>
   <option value="sweat.gif">汗</option>
   </select>
   <img src="smiles/smile.gif" name="img">
  </td>
 </tr>
 <tr>
  <td>内容</td>
  <td align="left"><textarea name="content" cols="70" rows="10"></textarea></td>
 </tr>
 <tr>
  <td>截图</td>
  <td align="left"><input type="file" name="upfile" size="50"></td>
 </tr>
 <tr>
  <td colspan="2"><input type="submit" value="提交"/></td>
 </tr>
</table>
</form>

(2)savadd.php

用于保存留言信息

<?php
if(!$_POST["author"] || !$_POST["content"]) 
{
 echo "<meta http-equiv=\"refresh\" content=\"2;url=index.php\">\n";
 echo "你没有填写留言姓名或内容,2秒钟返回首页";
 exit();
}else{
 $imgflag=0;   //用于判断是否需要上传图片
 function random($length)   //此函数用于生成一个随机的图片文件名(不含扩展名),以防止与现有图片重复
 {
  $hash = 'IMG-';
  $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
  $max = strlen($chars) - 1; 
  for($i = 0; $i < $length; $i++)    //从上面的字符串中随机找length长度个字符
  {
   $hash .= $chars[mt_rand(0, $max)];
  }
  return $hash;
 }

 function fileext($filename)   //此函数用于获取上传文件的扩展名
 {
  return substr(strrchr($filename, '.'), 1);
 }
 

 if($_FILES["upfile"]["name"]!=""){
  $uploaddir="upfile/";   //图片保存路径
  $type=array("jpg","gif","bmp","jpeg","png");   //允许上传的文件类型

  if(!in_array(strtolower(fileext($_FILES['upfile']['name'])),$type))   //如果上传的文件的扩展名不符合要求
  {
   echo "<meta http-equiv=\"refresh\" content=\"2;url=index.php\">\n";
   $text=implode(",",$type);
   echo "您只能上传以下类型文件: ",$text,"<br>";
   exit();
  }
  else
  {
   $filename=explode(".",$_FILES['upfile']['name']);
   do
   {
    $filename[0]=random(10);
    $randname=implode(".",$filename);     //得到的最终随机生成的文件名(连同扩展名)
    $uploadfile=$uploaddir.$randname;
   } while(file_exists($uploadfile));

   if (move_uploaded_file($_FILES['upfile']['tmp_name'],$uploadfile)){   //保存上传的图片到upfile文件夹
    echo "上传图片成功";
    $imgflag=1;
   }
   else{
    echo "上传图片失败!";
    $imgflag=0;
   }

  }
 }

//获取其他表单域

 $author=base64_encode($_POST["author"]);  
 $content=base64_encode(ereg_replace("\r\n","<br>",$_POST["content"]));
 $smiles=base64_encode($_POST["smiles"]);
 if($_POST["title"]){
  $title=base64_encode($_POST["title"]);
 }else{
  $title=base64_encode("无标题");
 }
 $addtime=date("Y-m-d");
 if($imgflag==1){  //如果有上传图片
  $photo=base64_encode($randname);
 }else{  //否则将photo元素的值设置为NONE
  $photo="NONE";
 }

 $dom=new DOMDocument('1.0','gb2312');   //指定XML的格式
 $dom->load("data.xml");     //加载
 $root=$dom->getElementsByTagName("messages");   //获取根节点
 $root=$root->item(0);       
 $last_id=$root->lastChild->firstChild->nodeValue;  //获取最后一个message的第一个子节点(即id节点)的值
 $id=$last_id+1;  //新增消息的id
 settype($id,"string");  //将其转换为字符型

 $message=$root->appendChild(new DOMElement('message'));  //添加message节点
 $el_id=$message->appendChild(new DOMElement('id'));  //添加message节点的各个子节点
 $el_id->appendChild($dom->createTextNode($id));

 $el_author=$message->appendChild(new DOMElement('author'));
 $el_author->appendChild($dom->createTextNode($author));

 $el_title=$message->appendChild(new DOMElement('title'));
 $el_title->appendChild($dom->createTextNode($title));

 $el_smiles=$message->appendChild(new DOMElement('smiles'));
 $el_smiles->appendChild($dom->createTextNode($smiles));

 $el_content=$message->appendChild(new DOMElement('content'));
 $el_content->appendChild($dom->createTextNode($content));

 $el_addtime=$message->appendChild(new DOMElement('addtime'));
 $el_addtime->appendChild($dom->createTextNode($addtime));

 $el_photo=$message->appendChild(new DOMElement('photo'));
 $el_photo->appendChild($dom->createTextNode($photo));

 $dom->save("data.xml");  //保存XML

 echo "<meta http-equiv=\"refresh\" content=\"2;url=index.php\">\n";
 echo "谢谢您的留言,2秒钟返回首页";

}
?>

(3)index.php

本页面用于显示留言信息

<p><a href="add.php">添加留言</a></p>

<?php
$dom=new DOMDocument('1.0','gb2312');   
$dom->load("data.xml");       //加载
$root=$dom->getElementsByTagName("messages"); 
$root=$root->item(0);      
$message=$root->getElementsByTagName("message");   //获取所有message节点

$message_count=$message->length;   //计算有多少条留言
echo "当前共有".$message_count."条留言";

if($message_count==0){
 echo "暂时没有留言\n";
}else{
?>
<table border="1" width="700">
<?php
 for($i=$message_count-1;$i>=0;$i--)    //我们需要对留言按倒序排列
 {
  $msg=$message->item($i);

  foreach($msg->childNodes as $child)   //message节点的各个子节点
  {
   if($child->nodeName=="id")
   {
    $id=$child->nodeValue;
   }
   if($child->nodeName=="author")
   {
    $author=$child->nodeValue;
   }
   if($child->nodeName=="title")
   {
    $title=$child->nodeValue;
   }
   if($child->nodeName=="smiles")
   {
    $smiles=$child->nodeValue;
   }
   if($child->nodeName=="content")
   {
    $content=$child->nodeValue;
   }
   if($child->nodeName=="photo")
   {
    $photo=$child->nodeValue;
   }
   if($child->nodeName=="addtime")
   {
    $addtime=$child->nodeValue;
   }

  }
  echo "<tr>";
  echo "<td align=left bgcolor=#CCCCFF>";
  echo $id.".<img src='smiles/".base64_decode($smiles)."'>".base64_decode($title)." - ".base64_decode($author)." [".$addtime."] ";  
  if(isset($_SESSION["password"]) && $_SESSION["password"]!="")  //如果输入了密码显示删除链接
  {
   echo "[<a href='del.php?id=".$id."'>删除</a>]";
  }
  echo "</td></tr>";
  echo "<tr><td align=left>".base64_decode($content)."</td></tr>";
  if($photo!="NONE")
  {
   echo "<tr><td align=left><img src='upfile/".base64_decode($photo)."'></td></tr>";
  }
 }
?>
<?php
}
?>
</table>
<?php
 if(isset($_SESSION["password"]) && $_SESSION["password"]!=""){
?>
<p><a href="logout.php">退出管理</a></p> 
<?php
}else{
?>
<p><a href="login.php">登陆管理</a></p> 
<?php
}
?>

 

(4) 删除留言

<?php
if(isset($_SESSION["password"]) && $_SESSION["password"]!="")
{

    $dom=new DOMDocument; 
    $dom->load("data.xml");      
    $root=$dom->getElementsByTagName("messages"); 
    $root=$root->item(0);
 foreach($root->childNodes as $msg)
 {
  if($msg->firstChild->nodeValue==$_GET["id"])   //如果message节点的id子节点的值跟要删除的id相等
  {
   $photo=$msg->lastChild->nodeValue;
   if($photo!="NONE"){   //如果留言包含图片,还应该将图片删除
    $photo_path="upfile/".base64_decode($photo);
    $flag=unlink($photo_path);
    if($flag){
     echo "删除图片成功<br>";
    }
   }

   $root->removeChild($msg);
   break;
  }
 }
 $dom->save("data.xml");

?>

删除留言成功,2秒钟返回首页
<meta http-equiv="refresh" content="2;url=index.php">
<?php
}else{
?>
您还未登陆,2秒钟返回登陆页面
<meta http-equiv="refresh" content="2;url=login.php">
<?php
}
?>

PHP 相关文章推荐
PHP和XSS跨站攻击的防范
Apr 17 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
php获取文件后缀的9种方法
Mar 22 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
PHP常用正则表达式精选(推荐)
May 28 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
CI框架简单分页类用法示例
Jun 06 PHP
php 调用远程url的六种方法小结
Nov 02 #PHP
PHP 程序员应该使用的10个组件
Oct 31 #PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 #PHP
php UTF8 文件的签名问题
Oct 30 #PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 #PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 #PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 #PHP
You might like
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PDO::quote讲解
2019/01/29 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
python简单实现获取当前时间
2016/08/27 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
软件设计的目标是什么
2016/12/04 面试题
教师队伍管理制度
2014/01/14 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
感恩节寄语2015
2015/03/24 职场文书
敬业奉献模范事迹材料(2016精选版)
2016/02/26 职场文书
德劲DE1108畅想
2021/04/22 无线电