编程规则与基本语法

 更新时间:2016年11月25日 15:15  点击:1707

过去的几周对我来说是一段相当复杂的经历。我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐趣。我从来没有被开除过,所以很难不去想得太多。我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人,所以我寄去了简历并获得了面试机会。在面试之间,我和其主要的程序员们在咨询电话中聊了聊,最后他们给我出了一套测试题,其中有一道很耐人寻味。
  找出以下代码的错误之处:
复制PHP内容到剪贴板
PHP代码:
<?function baz($y $z) {
    $x = new Array();
    $x[sales]  = 60;
    $x[profit] = 20:
    foreach($x as $key = $value) {
        echo $key+" "+$value+"<BR>";
    }
}

  你能找到几个呢?
  如果你发现函数参数列表中少了逗号、“new Array()”是不正确的、行末用了冒号而不是分号、foreach中没有用“=>”及用“+”来连接字符串,那恭喜你,你找到了所有的错误,你已经掌握了PHP编程的基础。
  现在我来说说我是怎么回答这道题的。我当然也找出了以上这些问题,但我更进一步。比如,你有没有发现在数组索引里没有用引号将字符串括起来?虽然这不会造成严重错误,但这是一个编码错误。另外,你注意到在echo一行它使用了双引号而不是单引号吗?使用了PHP开始标志的缩写形式?并且没有用“<br/>”而是用了“<BR>”?
  在找出了实际错误后,我又在上面找到的问题后面加了注释。这足够让这份答卷从“正确”转变为“发人深省”了,这也给我的申请加了不少分,所以他们决定聘用我。(但最后我拒绝了,因为我喜欢紧凑的生活节奏,并将自己的PHP技能奉献给我的客户,而不是一家涉猎电信市场的公司。我需要一个舞台来大展身手。)
  那么接下来就来看看我写的10条PHP编程习惯吧:
1、使用单引号括起来的字符串
  当使用双引号来括字符串时,PHP解释器会对其进行变量替换、转义等操作,如“n”。如果你只想输出一个基本的字符串,就用单引号吧,这样会节省一些资源。当然,如果你需要进行变量替换的,那就必须用双引号了,但其他情况下还是用单引号吧。
2、字符串的输出
  你认为以下哪一条语句的运行速度最快?
复制PHP内容到剪贴板
PHP代码:
print "Hi my name is $a. I am $b";
echo "Hi my name is $a. I am $b";
echo "Hi my name is ".$a.". I am ".$b;
echo "Hi my name is ",$a,". I am ",$b;
echo 'Hi my name is ',$a,'. I am ',$b;

  也许这看起来很奇怪,但事实上最后一条的运行速度是最快的。print比echo要慢,在字符串中进行变量替换时会慢,而连接字符串要比用逗号连接来得慢,最后一句则是第一个习惯的体现。所以,不在字符串中进行变量替换不仅会加快程序运行速度,也会让你的代码在任何语法高亮显示的编辑器中显得更为易懂(变量会被高亮显示出来)。很少人知道echo的参数可以用逗号连接,且速度会比字符串连接要来得快。最后再用上第一个习惯,那这条语句就非常好了。
3、在数组索引中使用单引号
  正如你在上面的测试题中所看到的,我指出了$x[sales]从严格意义上来说是错误的,索引应该被括起来,即$x['sales']。这是因为PHP会将没有括起来的索引辨认为“裸”字符串,并把它解释为一个常量。当找不到该常量的定义时,才将其解释为一个字符串,所以这条语句才是可运行的。把索引括起来可以省去这部分工作,如果将来正好要用这一字符串定义常量时也就不会有错误了。我甚至听说这样做要快七倍左右的时间,虽然我没有亲自测试过。更多关于这一话题的讨论,请看PHP手册“数组”一章中的的“数组的能与不能”一节。
4、不要使用开始标志的缩写形式
  你正在使用这样的符号吗?“<?”是非常糟糕的符号,它会引起与XML解释器的冲突。而且一旦你发布了这些代码,那么使用者就必须修改php.ini文件来打开对此符号的支持。所以实在没有理由去使用这种形式。用“<?php“吧。
5、尽量不要使用正则表达式
  在进行常规的字符串操作时,尽可能不要去使用正则表达式(preg和ereg系列函数)。str_replace函数要比preg_replace快得多,甚至strtr函数也要比str_replace来得快。省去这些不必要的麻烦吧,你的老板会感谢你的。
6、不要在循环声明中使用函数
  这个问题不单单出现在PHP中,你可以在其他语言的代码中经常看到:
差:for($i=0;$i<count($array);$i++){...}
好:$count=count($array);for($i=0;$i<$count;$i++){...}
  这因该很好解释,但许多人就是想少写一行代码而浪费了系统资源。如果在循环声明中使用了count函数,那每次循环都会调用一次。如果你的循环次数很多,那就会浪费非常多的时间。
7、永远不要使用register_globals和magic quotes
  这是两个很古老的功能,在当时(十年前)也许是一个好方法,但现在看来并非如此。老版本的PHP在安装时会默认打开这两个功能,这会引起安全漏洞、编程错误及其他的问题,如只有用户输入了数据时才会创建变量等。如今这两个功能都被舍弃了,所以每个程序员都应该避免使用。如果你过去的程序有使用这两项功能,那就尽快将其剔除吧。
8、一定要对变量进行初始化(这里的“初始化”指的是“声明”——译者注)
  当需要没有初始化的变量,PHP解释器会自动创建一个变量,但依靠这个特性来编程并不是一个好主意。这会造成程序的粗糙,或者使代码变得另人迷惑,因为你需要探寻这个变量是从哪里开始被创建的。另外,对一个没有初始化的变量进行递增操作要比初始化过的来得慢。所以对变量进行初始化会是个不错的主意。
9、对代码进行注释
  这个问题已经提过很多次了,但再多次也不够。我知道有些地方是不聘用不对代码进行注释的程序员的。我在前一次工作面试后和副总、面试官一起浏览我写的代码,当他们对我所做的代码注释印象深刻,还了解了一下我的这一习惯。一天之后,我得到了这个工作。
  我知道有些自称为PHP大师的人声称自己的代码写得很好,不需要添加什么注释。在我看来,这些人都是垃圾。学一写注释的规范和技巧,熟悉一下phpDocumentor或Doxygen之类的注释辅助软件,都是值得的。
10、遵循一个编程规范
  关于这一点,是你需要在面试中询问你潜在的老板的,问问他们正在使用什么编程规范。PEAR?Zend?内部规范?要提及你正在使用的编程规范,不管是你自己创建的,还是目前普遍流行的一种。对于PHP这种松松垮垮的语言来说,如果没有一个好的编程规范,那么那些代码就会看起来想一堆垃圾。发臭的,令人作呕的垃圾。一些基本的规范包括空格规范、打括号匹配、命名风格等。这对任何一个追求高质量的代码的人来说都是必须的。
  有人说:“我讨厌你的4个空格的缩进。”我要说,什么?用4个空格来缩进?这比用制表符过占用3个字符的空间。更重要的是,只要是使用比记事本高级的编辑器,你可以自定义制表符的缩进值。所以每个程序员都可以以其最习惯的方式来看代码。可以时设置为4,也可以设置为0(如果你是个受虐狂)。反正我不在乎,但你就是不能用空格来缩进!

首先我们来建立一个数据链接.

<?php
  mysql_connect('localhost','root','mailangel') or die('database server no exists!');
  mysql_select_db('vot') or die('database error!'); 
  mysql_query("SET NAMES 'gbk'");//set document charset encode
?>

下面就是读取数据以及分页的代码了.

<?php
      $page  =isset($_GET['page'])?$_GET['page']:1;     
     $sql ="select * from su_mon_vote order by id desc";
    $result =mysql_query($sql) or die('fail1'.mysql_error());
    $rs  =mysql_fetch_array($result);
    $rdcount =mysql_num_rows($result);
    if($rdcount){
    $pagesize =10;
    $pagecount=($rdcount % $pagesize)?(int)($rdcount / $pagesize)+1:$rdcount/$pagesize;//统计总页面 
    $start =($page>=1 && $page<=$pagecount)?$start=$pagesize*($page-1):$start=1;//取得超始记录
  
    $sql  ="Select * from su_mon_vote  order by id desc limit $start,$pagesize";
    $result =mysql_query($sql);
    while( $rs =mysql_fetch_array($result) ){
 
   ?>
  <tr>
    <td height="50" bgcolor="#FFFFFF"><?php echo $rs[0];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[7];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[9];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[8];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[10];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[1];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[2];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[3];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[4];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[5];?></td>
    <td align="left" valign="top" bgcolor="#FFFFFF"><?php echo $rs[6];?></td>
  </tr>
 
  <?php
  }
  }
  pagelist($page,$pagecount,$rdcount,'?page=',$pagesize);
  ?>

看到加粗那段代码了没,pagelist函数如下.

<?php
 function pagelist($page,$pagecount,$totalrecord,$url,$pagesize){ 
 if($page=="" || $page>$pagecount){exit();}
 echo("记录".$totalrecord."条 共".$pagecount."页 每页".$pagesize."条 <a href=".$url."1>&nbsp;首页</a>&nbsp;");
 if($page>1){ echo("<a href=".$url.($page-1).">&nbsp;上一页&nbsp;</a>"); }  
  if($page+9>$pagecount){ $current=$pagecount; }else{ $current=$page+9; } 
  for($i=$page;$i<=$current;$i++){ echo("<a href=".$url."$i class='sf'>$i</a>");  }
  if($pagecount>$page){ echo("<a href=".$url.($page+1).">&nbsp;下一页&nbsp;</a>"); } 
  echo("<a href=".$url.$pagecount.">&nbsp;末页</a>");
 }
 ?>

原创作品转载请注明:  www.111cn.net/phper/php.html

下面简单介绍这两个函数的用法:

string addcslashes(string str,string charlist):第1个参数str为待失物原始字符串,第2个参数charlist说明需要在原始串的哪些字符前加上字符“”。
string stripcslashes(string str):去掉字符串中的“”。

例:
<?php
$sql = "update book set bookname='let's go' where bookid=1";
echo $sql."<br>";
$new_sql = addcslashes($sql,"'");
echo $new_sql."<br>"; //update book set bookname='let's go' where bookid=1
$new_sql_01 = stripcslashes($new_sql);
echo $new_sql_01;  //update book set bookname='let's go' where bookid=1
?>

PHP中的命名空间用来解决大型PHP库(libraries)中作用域的问题,在PHP中,所有的类定义都是全局的,所以,当一个库的作者为这处库创建多种应用或公共API类的时候,他必须清楚其他库中相似功能是否存在的可能性并因而选择唯一的名称,来保证这些库可以被同时使用.通常用唯一的字符串加前缀的方法来解决,如数据库类被冠以My_Library_DB,等等.当这个库增加的时候,前缀也随着增加,这样导致很长的名字.命名空间使开发者在每次引用类的时候不使用长名称即可管理命名范
围.

定义
命名空间在每一个文件的开头以namespace 关键字来声明,如
<?php
    namespace MyProject::DB;
   
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
   
    function connect() { /* ... */  }
   
?>
相同的namespace 名称可以在多个文件中使用
namespace 包class,constant和function定义,但无free code
详解:
在命名空间内部,所有定义的class,function和constant名称被自动冠以命名空间名称,类名总是完整的名称,如,以上例子中的类使用MyProject::DB::Connection
来调用
创建的常量,名称是由命名空间名加上常量名,象类常量、命名空间常量只能为静态常量。

非完整修饰名(如名称不包含::),遵循如下:
非自动加载类在当前命名空间(冠以命名空间名称的)中查找
非自动加载全局命名空间中查找
Autoloading for name in current namespace is attempted.
如前者查找失败,则查找失败

非完整修饰函数名称(如名称不包含::)先在当前命名空间查找再在全局空间中查找
非完整修饰常量名称称在当前命名空间中查找再在全局定义的常量里查找

使用命名空间
每一个命名空间里的类和函数可使用全名来引用,如,MyProject::DB::Connection ,或MyProject::DB::Connection
<?php
    require 'MyProject/Db/Connection.php';
    $x = new MyProject::DB::Connection;
    MyProject::DB::connect();
?>
命名空间可以使用use操作符来引入到当前上下文(全局或命名空间)中,这个操作符参数如下:
<?php
/* ... */
use Some::Name as Othername;
// 简化应用
use Foo::Bar;
// 与其相同
use Foo::Bar as Bar;
?>
引入的名称工作如下:每次当解释器遇到局部名称Othername(单一名称或被::分隔的长名称),引入的名称Some::Name被替代
use只能用于全局范围内,非函数或类中,引入的名称从引入开始到当前文件结尾有效,推荐在文件最开始引入以避免冲突
<?php
    require 'MyProject/Db/Connection.php';
    use MyProject::DB;
    use MyProject::DB::Connection as DbConnection;
   
    $x = new MyProject::DB::Connection();
    $y = new DB::connection();
    $z = new DbConnection();
    DB::connect();
?>
全局空间
没有命名空间定义时,所有的类和函数都被放在全局空间内,因为在PHP支持命名空间前就是这样的.
在命名空间上下文中,被冠以::将指定来自全局空间里该名称
<?php
    namespace A::B::C;

/* 此函数为 A::B::C::fopen */
    function fopen() {
         /* ... */
         $f = ::fopen(...); // 全局函数
         return $f;
    }
?>
__NAMESPACE__
解释期间的常量__NAMESPACE__被定义为当前命名空间的名称,在命名空间外部,这个常量值为空字符串.
<?php
namespace A::B::C;
         
function foo() {
// do stuff
}
set_error_handler(__NAMESPACE__ . "::foo");
?>
规则
1.所有完整修饰名通过当前引入规则转化,如A::B::C已引入,C::D::E()被转化为A::B::C::D::e().
2.非完整修饰名通过当前引入规则转化(全名替换简名),如A::B::C已引入,new C()被转化为A::B::C().
3.在命名空间内部,调用当前命名空间内定义的非完整修饰函数名,在解释期间被认为是调用这些命名空间的函数
4.在命名空间内部(A::B),调用在当前命名空间内没有定义的非完整修饰名函数在运行期间被决定,以下是Foo()如何被决定
在当前命名空间内寻找函数A::B::foo().
尝试寻找和调用内部(internal)函数foo()
调用全局空间内用户定义的函数,使用::foo()
5.在命名空间内部(A::B),调用在当前命名空间内没有定义的非完整修饰名类在运行期间被决定,以下是 new C() 如何被决定.
在当前命名空间A::B::C中寻找类
尝试寻找和调用内部类C
尝试自动加载A::B::C
调用全局空间内用户自定义的类,使用new ::c()
6.调用完整修饰名的函数在运行期间被决定.以下是A::B::foo() 如何被决定
在当前命名空间内寻找函数A::B::foo().
调用全局空间内用户定义的函数,使用::foo()
7.调用完整修饰名的类的时候,是在运行的时候才按照想对应的命名空间来加载。比如 new A::B::C() 它是引用 命名空间是A::B下的C() 类
<?php
namespace A;
// 函数调用
foo();      // 先尝试调用命名空间A里定义的"foo
            // 再调用内部(internal)函数 "foo"
::foo();    // 调用全局范围内定义的"foo"
// 类引用
new B();    // 先尝试创建在命名空间A定义的B类的对象
            // 再创建内部类B对象
new ::B();  //新建全局域定义的B类的对象
// 来自其他命名空间的静态方法/命名空间
B::foo();   //先尝试调用来自命名空间"A::B"的函数foo()
            // 再调用内部类B的函数foo()
::B::foo(); //先尝试调用来自命名空间B的函数FOO()  
            //再调用全局域里B里的函数FOO()
//当前命名空间的静态方法/命名空间
A::foo();   //先调用命名空间"A::A" 里的函数FOO()
            // 再调用命名空间A里A类的函数foo()
            // 再尝试调用命名空间A里函数foo()
            // 再调用内部类A里的函数foo()
::A::foo(); // 先尝试调用命名空间A里函数foo()
            // 再调用全局域里A类的函数foo()
?>

好了,其它的都快完了我们就来看看index.php文件显示留方的页面吧.

<?php
 @session_start();
 include("global.php");
 
 if(isset($_GET['act']) && $_GET['act'] == 'del')
 {
  if(isset($_GET['mid']))
  {
   $mid = intval($_GET['mid']);
   if(mysql_query("DELETE FROM xx_guestbook WHERE mid={$mid}"))
   {
    echo("delete OK!");
    die("<script>window.location.href='{$_SERVER['PHP_SELF']}';</script>");
    //echo "<meta http-equiv=\"refresh\" content=\"1; url=index.php\">";
   }
   else echo("false");
  }
 }
?> 

<!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>
<style type="text/css">
<!--
body {
 background: #C7EDDD;
 text-align: center;
 margin: 0px;
 padding: 0px;
 font-size: 12px;
}
a {
 text-decoration: none;
 margin: 0px;
 padding: 0px;
}
.messagebox img {
 margin: 0px;
 padding: 0px;
}
.all {
 margin: 0px auto;
 padding: 0px 0px 10px;
 width: 780px;
 background: #C7EDCC;
 text-align: left;
}
.header {
 margin: 0px;
 padding: 0px;
 height: 90px;
 background: #DDDDDD;
 border-top: 5px solid #660066;
 border-right: 1px solid #660066;
 border-bottom: 1px solid #660066;
 border-left: 1px solid #660066;
}
.header h1 {
 font-size: 36px;
 font-weight: bold;
 margin: 0px;
 padding: 5px 10px 0px;
}
.header #menu {
 margin: 0px;
 padding: 25px 10px 0px;
 height: 20px;
 font-size: 14px;
 font-weight: bold;
 text-align: right;
}
.messagebox {
 margin: 20px 10px 0px;
 padding: 0px 0px 5px;
 width: 760px;
 border: 1px solid #33FFFF;
 background: #C7EDCC;
}
.messagebox a {
 text-decoration: none;
 margin: 0px;
 padding: 0px;
}
.messagebox-top {
 border-bottom: 1px dashed #00FFFF;
 margin: 0px;
 padding: 3px 0px 0px;
 height: 20px;
 background: #CCFFFF;
}
.messagebox-topl {
 margin: 0px 0px 0px 10px;
 padding: 0px;
 float: left;
}
.messagebox-topr {
 margin: 0px 5px 0px 0px;
 padding: 0px;
 float: right;
}
.messagebox-topc {
 margin: 1px;
 padding: 0px 20px;
}
.messagebox-show {
 margin: 5px 10px 0px;
 padding: 3px 3px 5px;
 overflow: hidden;
 border: 1px solid #00FFCC;
}
.messagebox-reply {
 border-top: 1px dashed #00FFCC;
 border-right-width: 1px;
 border-bottom-width: 1px;
 border-left-width: 1px;
 border-right-style: dashed;
 border-bottom-style: dashed;
 border-left-style: dashed;
 margin: 2px 10px 0px;
 padding: 2px 2px 5px;
 background: #E0EDDC;
}
.messagebox-replyt {
 font-weight: bold;
 color: #0000FF;
 margin: 0px 0px 5px;
 padding: 0px;
}
.pages {
 background: #00FFFF;
 margin: 5px 20px 0px;
 padding: 0px 0px 5px;
}
.foot {
 background: #E0EDDC;
 margin: 5px 0px 0px;
 padding: 5px;
 text-align: center;
}
-->
</style>

</head>

<body>
<div class="all">
<div class="header">
 <h1>求职留言本</h1>
    <div id="menu"><a href="index.php">首页</a>    <a href="madd.php">发表留言</a><?php
  if(!$_SESSION[user])
   echo "<a href=\"login.php\">登陆</a>";
  if($_SESSION[user])
   echo "<a href=\"logout.php\">退出</a>";
 ?>
    </div>
    <!-- menu -->
</div><!-- header -->
<?php
 $page = isset($_GET['page'])?intval($_GET['page']):1;
 $num=10;
 $total=mysql_num_rows(mysql_query("select * from xx_guestbook"));
 $pagenum=ceil($total/$num);
 
 if($page>$pagenum || $page<=0 || empty($page))
 {
     //header("location:index.php?page=1"); DEBUG
  $page = 1;
 }
 
  $offset=($page-1)*$num;
 
 $sql = "SELECT * FROM xx_guestbook ORDER BY posttime DESC LIMIT {$offset},{$num}";
 $query = mysql_query($sql);
 while($info = mysql_fetch_array($query))
 {
?> 

  <div class="messagebox">
    <div class="messagebox-top"><span class="messagebox-topl"><strong><a href="#"><a href="#"><?php echo("{$info['username']}"); ?> </a></strong>发表于 <?php echo("{$info['posttime']}"); ?></span> <span class="messagebox-topr"><a href="#"><img src="images/city.gif" alt="IP:<?php echo("{$info['ip']}"); ?>" /></a> <a href="mailto:<?php  echo("{$info['email']}"); ?>"><img src="images/email2.gif" alt="给TA发email:<?php  echo("{$info['email']}"); ?>" /></a> <a href="tencent://message/?uin=<?php  echo("{$info['oicq']}"); ?>&amp;Site=web&amp;Menu=yes"><img src="images/qq.gif" alt="QQ:<?php  echo("{$info['oicq']}"); ?>" /></a> <a href="<?php echo("{$info['weburl']}"); ?>" target="_blank"><img src="images/web.gif" alt="主页:<?php echo("{$info['weburl']}"); ?>" /></a></span>
    <?php
  if($_SESSION[user])
  {
 ?>
 <span class="messagebox-topc"><strong><a href="mreply.php?act=edit&amp;mid=<?php echo("{$info['mid']}"); ?>">编辑回复</a>&nbsp;&nbsp;&nbsp;&nbsp; <a onclick="var r=confirm(&quot;确认删除吗?&quot;)
  if (r==true)
    {
    window.location.href='<?php $_SERVER['PHP_SELF']; ?>?act=del&mid=<?php echo("{$info['mid']}"); ?>';
    }
  else
    {
    window.location.href='<?php $_SERVER['PHP_SELF']; ?>';
    }" href="#">删除</a></strong></span>
  <?php
        }
        ?>
  </div>
    <!-- messagebox-top -->
    <div class="messagebox-show"><?php echo("{$info['content']}"); ?></div>
    <!-- messagebox-show -->
    <?php
  if(!empty($info['reply']))
  {
  ?>
      <div class="messagebox-reply">
     
        <div class="messagebox-replyt">admin回复于:<?php echo("{$info['replytime']}"); ?></div>
      <?php echo("{$info['reply']}"); ?></div>
        <?php
        }
        ?>
    <!-- messagebox-reply -->
  </div>
  <!-- messagebox -->

<?php
 }
  $prepage = $page - 1;
  $nextpage = $page + 1;
 
?>

 

  <div class="pages">共 <strong><?php echo("$pagenum"); ?></strong> 页 当前第 <strong><?php echo("$page"); ?></strong> 页 <a href="index.php?page=1">第一页</a> <a href="index.php?page=<?php echo("$prepage"); ?>">上一页</a> <a href="index.php?page=<?php echo("$nextpage"); ?>">下一页</a> <a href="index.php?page=<?php echo("$pagenum"); ?>">最后一页</a> </div><!-- pages -->
 
  <div class="foot">
  菜根 <br />
  Copyright &copy; 菜根  xanxin <a href="http://phpvc.com">http://phpvc.com</a>  </div>
  <!-- foot -->
</div>
<!-- all -->
</body>
</html>
显示了当然会有留言页面喽,如下.

<?php
 @session_start();
 include("global.php");
 
 //获得IP地址 来自sablogX 1.6
 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
  $onlineip = getenv('HTTP_CLIENT_IP');
 } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
  $onlineip = getenv('HTTP_X_FORWARDED_FOR');
 } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
  $onlineip = getenv('REMOTE_ADDR');
 } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
  $onlineip = $_SERVER['REMOTE_ADDR'];
 }
 $onlineip = addslashes($onlineip);
 
 if($_POST['add'] == 'add')
 {
  $username = $_POST['username'];
  $username = htmlspecialchars($username);
  $username = trim($username);
  $qq = $_POST['qq'];
  $email = $_POST['email'];
  $email = htmlspecialchars($email);
  $weburl = $_POST['weburl'];
  $weburl = htmlspecialchars($weburl);
  $content = $_POST['content'];
  $ip = $onlineip;//$_SERVER['REMOTE_ADDR'];
  $posttime = date('Y-m-d H:i:s');
  
  $content = htmlspecialchars($content);
  $content = str_replace("","&nbsp;",$content);
  $content = str_replace(" ","&nbsp;",$content);
  $content = str_replace("\n","<br />",$content);
  
  $sql = "INSERT INTO xx_guestbook(username,email,weburl,oicq,content,posttime,ip) VALUES('$username','$email','$weburl','$qq','$content','$posttime','$ip')";
  if(mysql_query($sql))
  {
   echo("post OK!");
   die("<script>window.location.href='lyb.php';</script>");
   //echo "<meta http-equiv=\"refresh\" content=\"1; url=index2.php\">";
  }
  else
  {
   echo"false!";
  }
 }
 else
 {
?>


<!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>
<style type="text/css">
<!--
body {
 font-size: 12px;
 background: #FAFCFF;
}
-->
</style>
<script language=JavaScript>
function FrontPage_Form1_Validator(theForm)
{
  if (theForm.username.value == "")
  {
    alert("请填写昵称!");
 history.back();
    theForm.username.focus();
    return (false);
  }
  if (theForm.username.value.length<3)
  {
    alert("昵称至少应为3个字符!");
    theForm.username.focus();
    return (false);
  }
  if (theForm.username.value.length>15)
  {
    alert("昵称不能大于15个字符!");
    theForm.username.focus();
    return (false);
  }
  if(theForm.email.value!=""){
              var email1 = theForm.email.value;
              var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
              flag = pattern.test(email1);
              if(!flag){
              alert("邮件地址格式不对!");
     theForm.email.focus();
           return false;
     }
  }
 if(theForm.qq.value!="")
 {
       
  for (i=1;i<theForm.qq.value.length;i++){
      ct=theForm.qq.value.charAt(i);
       if (!(ct>='0'&&ct<='9'))
       {
     alert("QQ号码只允许输入0-9数字");
     theForm.qq.focus();
       return(false);
       }
  }
  }

  if (theForm.content.value == "")
  {
    alert("留言内容不能空!");
    theForm.content.focus();
    return (false);
  }
  if (theForm.content.value.length<5)
  {
    alert("留言内容最少5个字符!");
    theForm.content.focus();
    return (false);
  }
  if (theForm.weburl.value != "")
  {
   var weburl = theForm.weburl.value;
 var Expression = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/;
 var objExp = new RegExp(Expression);
 if(objExp.test(weburl) != true)
 {
  alert("url地址格式不对!");
      theForm.weburl.focus();
        return false;
 }
  }
 
   return (true);
}
</script>
</head>

<body>
<table width="681" border="0" cellspacing="0" cellpadding="0" align="center">
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="message" id="message" onsubmit="return FrontPage_Form1_Validator(this)">
    <tr>
      <td height="25" colspan="2" align="center"><strong>发表留言(带*为必填)</strong></td>
    </tr>
    <tr>
      <td width="109" height="25" align="right">呢称:&nbsp;</td>
      <td width="572" height="25"><label>
        <input name="username" type="text" class="input" id="username" value="<?php
   if($_SESSION[user])
       echo "{$_SESSION[user]}";
 ?>" />
        <font color="#000000">*</font>(<font color="#ff6600">*</font>为必填项)</label></td>
    </tr>
   
   
    <tr>
      <td height="25" align="right">QQ:&nbsp;</td>
      <td height="25"><label>
        <input name="qq" type="text" class="input" id="qq" />
      (纯数字)</label></td>
    </tr>
    <tr>
      <td height="25" align="right">E-mail:&nbsp;</td>
      <td height="25"><label>
        <input name="email" type="text" class="input" id="email" size="30" />
      (必须含有@)</label></td>
    </tr>
    <tr>
      <td height="25" align="right">个人主页(blog):&nbsp;</td>
      <td height="25"><label>
        <input name="weburl" type="text" class="input" id="weburl" size="30" />
      (以http://开关)</label></td>
    </tr>
    <tr>
      <td height="25" align="right">内容:&nbsp;</td>
      <td height="25"><label>
        <textarea name="content" cols="70" rows="15" class="input" id="content"></textarea>
        <font color="#000000">*</font></label></td>
    </tr>
    <tr>
      <td height="25">&nbsp;</td>
      <td height="25"><label>
        <input name="submit" type="submit" class="botton" id="submit" value="发表留言" />
        &nbsp;
        <input name="reset" type="reset" class="botton" value="重新填写" id="reset" />
        <input name="add" type="hidden" id="add" value="add" />
      </label></td>
    </tr>
  </form>
</table>
</body>
</html>
<?php
 }
?>

OK了简单的留言系统就OK了.

[!--infotagslink--]

相关文章

  • Vue 3.0中jsx语法的使用

    这篇文章主要介绍了Vue 3.0 中 jsx 语法使用,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下...2020-11-13
  • c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
  • 浅谈node.js中async异步编程

    1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
  • C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
  • C#编程总结(六)详解异步编程

    本篇文章主要介绍了C#异步编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。...2020-06-25
  • 理解javascript异步编程

    这篇文章主要为大家介绍了javascript异步编程,从浅入深的学习javascript异步编程,对javascript异步编程感兴趣的小伙伴们可以参考一下...2016-01-29
  • 基于RequireJS和JQuery的模块化编程——常见问题全面解析

    下面小编就为大家带来一篇基于RequireJS和JQuery的模块化编程——常见问题全面解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-04-17
  • 读Javascript高性能编程重点笔记

    这篇文章主要介绍了读Javascript高性能编程重点笔记,需要的朋友可以参考下...2016-12-31
  • 再谈JavaScript异步编程

    再谈JavaScript异步编程,简单描述了几种JavaScript异步编程模式,感兴趣的小伙伴们可以参考一下...2016-01-29
  • 探究JavaScript函数式编程的乐趣

    本文是函数式编程系列的第一篇文章,这里我会简要介绍一下编程范式,然后会直接介绍使用Javascript进行函数式编程的概念,需要的朋友可以参考下...2015-12-16
  • C#中方括号[]的语法及作用介绍

    C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。...2020-06-25
  • 详解JavaScript语言的基本语法要求

    JavaScript语言的基本语法要求有哪些呐?下面将为大家一一解答: 一、区分大小写 JavaScript语言区分字符大小写,两个字符串相同大小写不同,被认为是不同的字符串。JavaScript语言的关键字也区分大小写,按语法要求应...2015-11-24
  • JavaScript的基础语法和数据类型详解

    这篇文章主要介绍了JavaScript的基础语法和数据类型,保姆级的详细教程,万字长文详细的列出了JavaScript的各种语法,建议收藏系列,希望可以有所帮助...2021-09-29
  • 用PHP与XML联手进行网站编程

    一、小序 HTML简单易学又通用,一般的PHP程序就是嵌入在HTML语言之中实现的。但是随着WEB越来越广泛的应用,HTML的弱点也越来越明显了。XML的出现,弥补了这些不足,它提供...2016-11-25
  • C#语法相比其它语言比较独特的地方(一)

    这篇文章主要介绍了C#语法相比其它语言比较独特的地方(一),本文讲解了switch语句可以用来测试string型的对象、多维数组、foreach语句、索引器和Property等内容,需要的朋友可以参考下...2020-06-25
  • Go语言七篇入门教程六网络编程

    这篇文章主要为大家介绍了Go语言的网络编程,其中包含了Socket编程,Http编程以及RPC编程,本篇文章是Go语言七篇入门系列文章,有需要的朋友可以借鉴下...2021-11-10
  • c#并行编程示例分享

    这篇文章主要介绍了c#并行编程示例,大家直接看下面的代码吧...2020-06-25
  • C#并发编程入门教程之概述

    这篇文章主要给大家介绍了关于C#并发编程之概述的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • C#函数式编程中的惰性求值详解

    这篇文章主要介绍了C#函数式编程中的惰性求值详解,本文讲解了惰性求值的相关知识并给出代码实例,需要的朋友可以参考下...2020-06-25
  • C# Winform多屏幕多显示器编程技巧实例

    这篇文章主要介绍了C# Winform多屏幕多显示器编程技巧实例,本文直接给出代码实例,需要的朋友可以参考下...2020-06-25