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&amp;java(二)
Oct 09 PHP
PHP 5.0 Pear安装方法
Dec 06 PHP
Phpbean路由转发的php代码
Jan 10 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 PHP
深入php var_dump()函数的详解
Jun 05 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
PHP编写RESTful接口
2016/02/23 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
类和结构的区别
2012/08/15 面试题
尼克胡哲观后感
2015/06/08 职场文书
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android