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初学者常见问题集合 修正版(21问答)
Mar 23 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
php自动加载的两种实现方法
Jun 21 PHP
PHP计数器的实现代码
Jun 08 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
php compact 通过变量创建数组
Nov 15 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
javascript数组去掉重复
2011/05/12 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
使用JS动态显示文本
2017/09/09 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python之PyUnit单元测试实例
2014/10/11 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python机器人行走步数问题的解决
2018/01/29 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
办理退休介绍信
2014/01/09 职场文书
环保专项行动方案
2014/05/12 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
部队2014年终工作总结
2014/11/27 职场文书
公务员政审材料
2014/12/23 职场文书
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android