php随笔2-基本复习-表单

PHP 表单处理

表单实例:

<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
welcome.php

Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.

表单验证

应该在任何可能的时候对用户输入进行验证。客户端的验证速度更快,并且可以减轻服务器的负载。

不过,任何流量很高以至于不得不担心服务器资源的站点,也有必要担心站点的安全性。如果表单访问的是数据库,就非常有必要采用服务器端的验证。

在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。

 

$_GET 变量 $_POST 变量

GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符),HTTP GET 方法不适合大型的变量值。适用于收藏按钮。

POST不可见,不限量。

$_REQUEST 变量

PHP 的 $_REQUEST 变量包含了 $_GET, $_POST 以及 $_COOKIE 的内容。

PHP 的 $_REQUEST 变量可用来取得通过 GET 和 POST 方法发送的表单数据的结果。

 

date(format,timestamp)函数用于格式化时间或日期可把时间戳格式化为可读性更好的日期和时间。

时间戳(Timestamp)是自 1970 年 1 月 1 日(00:00:00 GMT)以来的秒数。它也被称为 Unix 时间戳(Unix Timestamp)。

第一个参数:格式化日期/时间。它使用字母来表示日期和时间的格式。

第二个参数:时间戳。(可选)。如果您没有提供时间戳,当前的时间将被使用。

d  (31)  m (12)  Y (四位数)

<?php
echo date("Y/m/d"); 
?>

输出:2006/07/11

使用 mktime() 函数为明天创建一个时间戳。mktime() 函数可为指定的日期返回 Unix 时间戳。

语法

mktime(hour,minute,second,month,day,year,is_dst)

如需获得某一天的时间戳,只要设置 mktime() 函数的 day 参数:

<?php
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "明天是 ".date("Y/m/d", $tomorrow);
?>
服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数、页眉、页脚或元素。
 

 include 和 require 语句

在服务器执行 PHP 文件之前把该文件插入另一个 PHP 文件中。

include 和 require 语句用于在执行流中向其他文件插入有用的的代码。

include 和 require 很相似,除了在错误处理方面的差异:

  • require 会产生致命错误 (E_COMPILE_ERROR),并停止脚本
  • include 只会产生警告 (E_WARNING),脚本将继续

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。适用于页头、页脚或者菜单文件。

有一个定义变量的包含文件 ("vars.php"):
<?php
$color=‘red‘;
$car=‘BMW‘;
?>

在调用文件中:

<?php include ‘vars.php‘;
echo "I have a $color $car"; // I have a red BMW
?>

有一个在所有页面中使用的标准菜单文件:

"menu.php":

echo ‘<a href="/default.php">Home</a>
<a href="/tutorials.php">Tutorials</a>
<a href="/references.php">References</a>
<a href="/examples.php">Examples</a>
<a href="/about.php">About Us</a>
<a href="/contact.php">Contact Us</a>‘;

网站中的所有页面均应引用该菜单文件。这是具体的做法:

<div class="leftmenu">
<?php include ‘menu.php‘; ?>
</div>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
while (!feof($file)) 
  { 
  echo fgetc($file); 
  }
fclose($file);
?>

r 只读。在文件的开头开始。
w 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a 追加。打开并向文件文件的末端进行写操作,如果文件不存在,则创建新文件。
x 只写。创建新文件。如果文件已存在,则返回 FALSE。
注释:在 w 、a 以及 x 模式,您无法读取打开的文件!
fgets() :逐行读取文件。fgetc() :逐字符地读取文件。

 

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>
enctype :提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。

创建上传脚本

"upload_file.php" 文件含有供上传文件的代码:

<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>
全局数组 $_FILES
  • $_FILES["file"]["name"] - 被上传文件的名称
  • $_FILES["file"]["type"] - 被上传文件的类型
  • $_FILES["file"]["size"] - 被上传文件的大小,以字节计
  • $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
  • $_FILES["file"]["error"] - 由文件上传导致的错误代码

注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。

setcookie() 函数必须位于 <html> 标签之前。

setcookie(name, value, expire, path, domain);
setcookie("user", "Alex Porter", time()+3600);

注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。
 
<?php
if (isset($_COOKIE["user"]))
  echo "Welcome " . $_COOKIE["user"] . "!<br />";
 print_r($_COOKIE);
else echo "Welcome guest!<br />"; ?>
删除 cookie
<?php 
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>


Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
注释:session_start() 函数必须位于 <html> 标签之前:
<?php
session_start();
// store session data
$_SESSION[‘views‘]=1;
?>

<html>
<body>

<?php
//retrieve session data
echo "Pageviews=". $_SESSION[‘views‘];
?>

</body>
</html>

上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。

终结 Session

unset() 函数用于释放指定的 session 变量:

<?php
unset($_SESSION[‘views‘]);
?>
session_destroy() 函数彻底终结 session,您将失去所有已存储的 session 数据。:
<?php
session_destroy();
?>

mail()用于从脚本中发送电子邮件。

mail(to,subject,message,headers,parameters)

to:必需。规定 email 接收者。
subject:必需。规定 email 的主题。注释:该参数不能包含任何新行字符。
message:必需。定义要发送的消息。应使用 LF (\n) 来分隔各行。
headers:可选。规定附加的标题,比如 From、Cc 以及 Bcc。应当使用 CRLF (\r\n) 分隔附加的标题。

parameters:可选。对邮件发送程序规定额外的参数。

注释:PHP 需要一个已安装且正在运行的邮件系统,以便使邮件函数可用。所用的程序通过在 php.ini 文件中的配置设置进行定义。

<html>
<body>
<?php
function spamcheck($field)
  {//防止 E-mail 注入
  //filter_var() sanitizes the e-mail 
  //address using FILTER_SANITIZE_EMAIL
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  
  //filter_var() validates the e-mail
  //address using FILTER_VALIDATE_EMAIL
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }

if (isset($_REQUEST[‘email‘]))
  {//if "email" is filled out, proceed

  //check if the email address is invalid
  $mailcheck = spamcheck($_REQUEST[‘email‘]);
  if ($mailcheck==FALSE)
    {
    echo "Invalid input";
    }
  else
    {//send email
    $email = $_REQUEST[‘email‘] ; 
    $subject = $_REQUEST[‘subject‘] ;
    $message = $_REQUEST[‘message‘] ;
    mail("someone@example.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
  {//if "email" is not filled out, display the form
  echo "<form method=‘post‘ action=‘mailform.php‘>
  Email: <input name=‘email‘ type=‘text‘ /><br />
  Subject: <input name=‘subject‘ type=‘text‘ /><br />
  Message:<br />
  <textarea name=‘message‘ rows=‘15‘ cols=‘40‘>
  </textarea><br />
  <input type=‘submit‘ />
  </form>";
  }
?>

</body>
</html>

  • FILTER_SANITIZE_EMAIL 从字符串中删除电子邮件的非法字符
  • FILTER_VALIDATE_EMAIL 验证电子邮件地址

  • filter_var() - 通过一个指定的过滤器来过滤单一的变量
  • filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  • filter_input - 获取一个输入变量,并对它进行过滤
  • filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤

Validating 过滤器:

  • 用于验证用户输入
  • 严格的格式规则(比如 URL 或 E-Mail 验证)
  • 如果成功则返回预期的类型,如果失败则返回 FALSE

Sanitizing 过滤器:

  • 用于允许或禁止字符串中指定的字符
  • 无数据格式规则
  • 始终返回字符串

选项和标志

<?php
$var=300;

$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>

验证输入

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("Input type does not exist");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "E-Mail is not valid";
  }
 else
  {
  echo "E-Mail is valid";
  }
 }
?>

净化输入

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("Input type does not exist");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );

$result = filter_input_array(INPUT_GET, $filters);

if (!$result["age"])
 {
 echo("Age must be a number between 1 and 120.<br />");
 }
elseif(!$result["email"])
 {
 echo("E-Mail is not valid.<br />");
 }
else
 {
 echo("User input is valid");
 }
?>

使用 Filter Callback

通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}

$string = "Peter_is_a_great_guy!";

echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

代码的结果:Peter is a great guy!

php随笔2-基本复习-表单

上一篇:ASP.NET 处理get/post数据方式


下一篇:WiFi芯片引爆物联网市场 价格战风起云涌是喜还是悲?