【奥门永利402com】分外常有效的 PHP 技艺

25.在总体脚本中动用单生机勃勃的数据库连接

请确认保障您在全路脚本使用单风流倜傥的数据库连接。从一齐首就开采连接,使用至截止,并在得了时关闭它。不要像那样在函数内开采连接:

function add_to_cart()
{
    $db = new Database();
    $db->query("INSERT INTO cart .....");
}

function empty_cart()
{
    $db = new Database();
    $db->query("DELETE FROM cart .....");
}

有八个延续也不佳,会因为每一个连接都亟待时刻来成立和平运动用越来越多的内部存款和储蓄器,而招致试行减缓。

在特殊意况下。譬如数据库连接,能够应用单例形式。

14. 改观应用程序创造的公文的权限

当在 Linux 情形下专门的学业时,权限管理会浪费你多多时光。因而,只要你的 php
应用程序创立了一些文件,那就应该改革它们的权柄以管教它们在外部“平易近民”。不然,举个例子,文件是由 “php”
客商创制的,而你充当二个莫衷一是的客商,系统就不会让您拜会或张开文件,然后您必需竭力得到root 权限,改进文件权限等等。

// Read and write for owner, read for everybody else
chmod("/somedir/somefile", 0644);

// Everything for owner, read and execute for others
chmod("/somedir/somefile", 0755);

PHP 简易 E-Mail

因此 PHP 发送电子邮件的最简单易行的法子是殡葬豆蔻年华封文本 email。

在下边包车型大巴例子中,大家率先注解变量($to, $subject, $message, $from,
$headers卡塔尔(قطر‎,然后大家在 mail(卡塔尔(قطر‎ 函数中采纳这几个变量来发送了豆蔻年华封 e-mail:

<?php
$to = "someone@example.com";
$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = "someonelse@example.com";
$headers = "From: $from";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";
?>

那样, 你将会获取叁个 Headers already send error. 为啥? 因为 “super
extra character” 已经被输出了. 今后你得从头调治将养啦. 那会花销大量年华查找
super extra 的职位。因而, 养成省略关闭符的习于旧贯:

14.转移应用程序创立的文件的权能

当在Linux情形下职业时,权限管理会浪费你多多时间。由此,只要你的php应用程序创立了一些文本,那就应该改过它们的权杖以保证它们在外边“和蔼可亲”。不然,比方,文件是由“php”客户成立的,而你当做多少个比不上的客商,系统就不会让您探望或张开文件,然后你必需全力得到root权限,改良文件权限等等。

// Read and write for owner, read for everybody else
chmod("/somedir/somefile", 0644);

// Everything for owner, read and execute for others
chmod("/somedir/somefile", 0755);

13. 在写入任何文件以前检查目录是还是不是可写

在写入或保存任何文件以前,请务供给检查该目录是还是不是是可写的,假如不行写的话,会闪烁错误消息。那将节约你大批量的
“调节和测量检验” 时间。当你职业于 Linux
时,权限是应当要处理的,何况会有多数众多的权限难题时,当目录不可写,文件不大概读取等的时候。

请确认保障您的应用程序尽可能智能化,并在最短的光阴内部报纸告最重大的音讯。

$contents = "All the content";
$file_path = "/var/www/project/content.txt";

file_put_contents($file_path , $contents);

这完全准确。但有一点直接的主题材料。file_put_contents
大概会因为有个别原因而惜败:

  • 父目录不真实
  • 目录存在,但不得写
  • 锁定文件用于写入?

就此,在写入文件此前最佳能(CANON卡塔尔(قطر‎够百分百都弄驾驭。

$contents = "All the content";
$dir = '/var/www/project';
$file_path = $dir . "/content.txt";

if(is_writable($dir))
{
    file_put_contents($file_path , $contents);
}
else
{
    die("Directory $dir is not writable, or does not exist. Please check");
}

因而如此做,你就会收获哪个地方文件写入失利以至为啥退步的高精度消息。

PHP readfile() 函数

readfile() 函数读取文件,并把它写入输出缓冲。

若果大家有叁个名叫 “webdictionary.txt”
的文件文件,寄存在服务器上,犹如这么:

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

读取此文件并写到输出流的 PHP 代码如下(如读取成功则 readfile(卡塔尔国函数再次回到字节数):

这将节约你很多时间. 我们举个例子: 一个 super_class.php 文件

24.小心管理大型数组

特大型的数组或字符串,倘诺叁个变量保存了某个局面相当大的东西,那么要小心管理。何足为奇错误是创办副本,然后耗尽内部存款和储蓄器,并获取内部存款和储蓄器溢出的浴血错误:

$db_records_in_array_format; //This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100 = 2MB

$cc = $db_records_in_array_format; //2MB more

some_function($cc); //Another 2MB ?

当导入csv文件或导出表到csv文件时,上边那样的代码很广阔。

像上边那样做大概时时会出于内部存款和储蓄器约束而让脚本崩溃。对于小圈圈的变量它不会产出难点,但当管理大型数组时一定要对此加避防止。

思量通过引用传递它们,可能将它们存款和储蓄在三个类变量中:

$a = get_large_array();
pass_to_function(&$a);

那样一来,相像的变量(并不是其别本)将用以该函数。

class A
{
    function first()
    {
        $this->a = get_large_array();
        $this->pass_to_function();
    }

    function pass_to_function()
    {
        //process $this->a
    }
}

及早苏醒它们,那样内部存款和储蓄器就能够被假释,何况脚本的其他部分就能够放松。

上面是关于怎么着通过引用来赋值从而省去内部存款和储蓄器的二个粗略示例。

<?php

ini_set('display_errors' , true);
error_reporting(E_ALL);

$a = array();

for($i = 0; $i < 100000 ; $i++)
{
    $a[$i] = 'A'.$i;
}

echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '<br />';

$b = $a;
$b[0] = 'B';

echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '<br />';

$c = $a;
$c[0] = 'B';

echo 'Memory usage in MB after 2st copy : '. memory_get_usage() / 1000000 . '<br />';

$d =& $a;
$d[0] = 'B';

echo 'Memory usage in MB after 3st copy (reference) : '. memory_get_usage() / 1000000 . '<br />';

四个举世无双php 5.4机械上的出口是:

Memory usage in MB : 18.08208
Memory usage in MB after 1st copy : 27.930944
Memory usage in MB after 2st copy : 37.779808
Memory usage in MB after 3st copy (reference) : 37.779864

进而得以见见,内部存款和储蓄器被封存在第3份通过引用的副本中。不然,在具有普通别本中内部存款和储蓄器将被更加的多地动用。

25. 在方方面面脚本中利用单少年老成的数据库连接

请确定保证您在整个脚本使用单风姿浪漫的数据库连接。从风姿浪漫初始就展开连接,使用至甘休,并在停止时关闭它。不要像这么在函数内张开连接:

function add_to_cart()
{
    $db = new Database();
    $db->query("INSERT INTO cart .....");
}

function empty_cart()
{
    $db = new Database();
    $db->query("DELETE FROM cart .....");
}

有四个三回九转也不佳,会因为每一个连接都亟需时刻来创建和利用越多的内部存款和储蓄器,而招致施行减缓。

在特殊景况下。举个例子数据库连接,能够接纳单例方式。


原文:http://www.codeceo.com/article/40-php-tips-part-1.html

存储 Session 变量

仓库储存和取回 session 变量的不利方法是采取 PHP $_SESSION 变量:

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<html>
<body>
<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
</body>
</html>

输出:

Pageviews=1

//super extra character after the closing tag

19.有的傻蛋式手艺

  • 使用echo代替print
  • 使用str_replace代替preg_replace,除非你规定必要它
  • 绝不使用short tags
  • 对于简易的字符串使用单引号替代双引号
  • 在header重定向之后要记得做三个exit
  • 相对不要把函数调用放到for循环调整行中。
  • isset比strlen快
  • 是的和平等地格式化你的代码
  • 无须错失循环或if-else块的括号。

毫不写那样的代码:

if($a == true) $a_count++;

那相对是后生可畏种浪费。

这样写

if($a == true)
{
    $a_count++;
}

不用通过吃掉语法缩小你的代码。而是要让你的逻辑更简便易行。

  • 选取具有代码高亮功效的文本编辑器。代码高亮有利于减削不当。

11. 毫不在你的应用程序中 gzip 输出,让 apache 来做

考虑接受 ob_gzhandler?不,别那样做。它从不此外意义。PHP
应该是来写应用程序的。不要操心 PHP
中关于怎么着优化在服务器和浏览器之间传输的数码。

使用 apache mod_gzip/mod_deflate 通过. htaccess 文件减弱内容。

语法

date(format,timestamp)
参数 描述
format 必需。规定时间戳的格式。
timestamp 可选。规定时间戳。默认是当前时间和日期。
<?php
echo "今天是 " . date("Y/m/d") . "<br>";
echo "今天是 " . date("Y.m.d") . "<br>";
echo "今天是 " . date("Y-m-d") . "<br>";
echo "今天是 " . date("l");
?>

1.不用采取相对路线 平日探问到:

12.从php echo javascript代码时采纳json_encode

稍加时候有的JavaScript代码是从php动态变化的。

$images = array(
 'myself.png' , 'friends.png' , 'colleagues.png'
);

$js_code = '';

foreach($images as $image)
{
$js_code .= "'$image' ,";
}

$js_code = 'var images = [' . $js_code . ']; ';

echo $js_code;

//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];

放聪明点。使用json_encode:

$images = array(
 'myself.png' , 'friends.png' , 'colleagues.png'
);

$js_code = 'var images = ' . json_encode($images);

echo $js_code;

//Output is : var images = ["myself.png","friends.png","colleagues.png"]

那不是很清新?

5. 让函数变得灵活

function add_to_cart($item_id , $qty)
{
    $_SESSION['cart'][$item_id] = $qty;
}

add_to_cart( 'IPHONE3' , 2 );

当增添单一条款时,使用方面包车型客车函数。那么当加多八个条文时,就得创造另三个函数吗?NO。只要让函数变得灵活起来使之能力所能达到担任不相同的参数就能够。请看:

function add_to_cart($item_id , $qty)
{
    if(!is_array($item_id))
    {
        $_SESSION['cart'][$item_id] = $qty;
    }

    else
    {
        foreach($item_id as $i_id => $qty)
        {
            $_SESSION['cart'][$i_id] = $qty;
        }
    }
}

add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' => 2 , 'IPAD' => 5) );

好了,以后雷同的函数就能够接收不一样档次的出口了。以上代码能够采取到无数地方让你的代码越来越灵活。

上传节制

在此个剧本中,我们扩展了对文件上传的范围。顾客只好上传 .gif 或 .jpeg
文件,文件大小必需低于 20 kb:

<?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 "Error: " . $_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 "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?>

注明:对于 IE,识别 jpg 文件的品类必需是 pjpeg,对于 FireFox,必需是
jpeg。

在服务器中, 你能够:

本文由码农网 –
小峰原创翻译,转发请看清文末的转发供给,款待参与大家的付费投稿陈设!

22. 恐吓类型检查

$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];

那是后生可畏种好习贯。

再也抛出非常

神迹,当十分被抛出时,您可能希望以分化于标准的措施对它实行拍卖。能够在一个”catch” 代码块中另行抛出万分。

剧本应该对客商隐敝系统错误。对程序猿来讲,系统错误大概很主要,可是顾客对它们并不感兴趣。为了让客商更便于接受,您能够重新抛出带有对顾客相比友好的音讯的极度:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
  return $errorMsg;
  }
 }

$email = "someone@example.com";

try
 {
 try
  {
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE)
   {
   //throw exception if email is not valid
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //re-throw exception
  throw new customException($email);
  }
 }

catch (customException $e)
 {
 //display custom message
 echo $e->errorMessage();
 }
?>
view sourceprint? define('ROOT' , '/var/www/project/'); require_once(ROOT . '../../lib/some_class.php'); //rest of the code

18.封装实用帮衬函数到三个类中

由此,你不得不在一个文件中有为数不菲实用函数:

function utility_a()
{
    //This function does a utility thing like string processing
}

function utility_b()
{
    //This function does nother utility thing like database processing
}

function utility_c()
{
    //This function is ...
}

随意地在应用程序中应用函数。那么您或然想要将它们包装成二个类作为静态函数:

class Utility
{
    public static function utility_a()
    {

    }

    public static function utility_b()
    {

    }

    public static function utility_c()
    {

    }
}

//and call them as 

$a = Utility::utility_a();
$b = Utility::utility_b();

此间您能够收获的五个斐然好处是,纵然php有经常名称的放手函数,那么名称不会爆发冲突。

从另二个角度看,你能够在相似的应用程序中维系七个本子的相仿类,而不会爆发其余冲突。因为它被卷入了,正是那般。

21. 运用 php 过滤器验证数据

您是还是不是接收正则表明式来证实如电子邮件,IP
地址等值?是的,每一种人都以那般做的。未来,让大家试试二个例外的事物,那正是过滤器。

php 过滤器扩张程序将提供容易的方法来有效申明或校验值。

PHP 成立文件 – fopen(卡塔尔国

倘诺你用 fopen(卡塔尔展开并不设有的公文,此函数会创设文件,假定文件被打开为写入(w)或增添(a)。

上面包车型地铁例子创制名叫 “testfile.txt” 的新文件。此文件将被创设于 PHP
代码所在的等同目录中:

$myfile = fopen("testfile.txt", "w")

20. 使用array_map快速管理数组 比方说你想 trim 数组中的全数成分.
新手大概会:

11.毫不在你的应用程序中gzip输出,让apache来做

构思接受ob_gzhandler?不,别那样做。它从不其余意义。PHP应该是来写应用程序的。不要操心PHP中关于如何优化在服务器和浏览器之间传输的数据。

使用apache mod_gzip/mod_deflate通过.htaccess文件减弱内容。

20. 使用 array_map 赶快管理数组

例如说,你要 trim 贰个数组的持有因素。菜鸟会这样做:

foreach($arr as $c => $v)
{
    $arr[$c] = trim($v);
}

但它能够动用 array_map 变得更清洁:

$arr = array_map('trim' , $arr);

那适用于 trim 数组 $arr 的具备因素。另五个近乎的函数是 array_walk。

丰富的宗旨使用

当至极被抛出时,其后的代码不会继续施行,PHP 会尝试搜索相配的 “catch”
代码块。

要是不行未有被抓走,何况又没用利用 set_exception_handler(卡塔尔作相应的管理的话,那么将生出三个严重的不当(致命错误),并且输出
“Uncaught Exception” (未捕获非常)的谬误新闻。

对的的处理程序应当满含:

  1. Try – 使用十分的函数应该放在 “try”
    代码块内。若无接触相当,则代码将照常继续奉行。但是只要不行被触发,会抛出三个可怜。
  2. Throw – 这里规定怎么触发相当。每四个”throw” 必需呼应最少三个 “catch”
  3. Catch – “catch”
    代码块会捕获非常,并创办一个包罗相当新闻的对象

代表方案, 在某地点聚集搜聚输出. 你能够积累在函数的局地变量中,
也足以运用ob_start和ob_end_clean. 如下:

15.永不检查提交按键值来检查表单提交

if($_POST['submit'] == 'Save')
{
    //Save the things
}

以上代码在大部时候是不易的,除了应用程序使用多语言的情景。然后“Save”能够是数不清不风华正茂的事物。那么你该怎么再做相比?所以无法依赖提交按键的值。相反,使用那一个:

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )
{
    //Save the things
}

当今您就能够蝉退提交按键的值了。

16. 在函数中总是有雷同值的地方选拔静态变量

//Delay for some time
function delay()
{
    $sync_delay = get_option('sync_delay');

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

反倒,使用静态变量:

//Delay for some time
function delay()
{
    static $sync_delay = null;

    if($sync_delay == null)
    {
    $sync_delay = get_option('sync_delay');
    }

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

实例

<?php
echo readfile("webdictionary.txt");
?>

那大概上准确. 但有一点点间接的难点. file_put_contents
恐怕会出于几个原因失败: >>父目录子虚乌有 >>目录存在, 但不可写
>>文件被写锁住? 所以写文件前做断定的检讨越来越好.

21.施用php过滤器验证数据

您是或不是运用正则表明式来表明如电子邮件,IP地址等值?是的,各样人都是那样做的。未来,让大家研究三个例外的事物,那正是过滤器。

php过滤器扩充程序将提供轻易的办法来有效注明或校验值。

10. 采纳含有正确字符集选项的 htmlentities

PHP 5.4 以前,使用的暗中同意字符编码是 ISO-8859-1,那不可能显得举个例子 À â
那样的字符。

$value = htmlentities($this->value , ENT_QUOTES , 'UTF-8');

从 PHP 5.4 起,私下认可编码成了
UTF-8,那解决了许多的主题材料,但您最棒依旧理解那件事,要是您的应用程序使用各样语言的话。

净空输入

让大家试着清理一下从表单传来的
UCR-VL。

先是,大家要确认是不是存在咱们正在索求的输入数据。

然后,我们用 filter_input(卡塔尔国函数来整洁输入数据。

在下边包车型大巴例子中,输入变量 “url” 被传到
PHP 页面:

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

当导入或导出csv文件时,
平日会这么做。不要认为上边的代码会平常因内部存款和储蓄器约束招致脚本崩溃.
对于小的变量是没难点的, 但管理大数组的时候就非得幸免. 确认保障通过援用传递,
或存款和储蓄在类变量中:

22.威吓类型检查

$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];

那是意气风发种好习于旧贯。

15. 不用检查提交按键值来检查表单提交

if($_POST['submit'] == 'Save')
{
    //Save the things
}

上述代码在繁多时候是不利的,除了应用程序使用多语言的情形。然后 “Save”
能够是成都百货上千两样的东西。那么您该怎么样再做相比较?所以不可能依附提交开关的值。相反,使用那个:

if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )
{
    //Save the things
}

当今您就足以抽身提交开关的值了。

多少个极其

可以采纳四个if..else 代码块,或叁个 switch
代码块,大概嵌套三个极其。这几个特别能够使用差别的 exception
类,并赶回不相同的失实音讯:

<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}

$email = "someone@example.com";

try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //throw exception if email is not valid
  throw new customException($email);
  }
 //check for "example" in mail address
 if(strpos($email, "example") !== FALSE)
  {
  throw new Exception("$email is an example e-mail");
  }
 }

catch (customException $e)
 {
 echo $e->errorMessage();
 }

catch(Exception $e)
 {
 echo $e->getMessage();
 }
?>
7. 在某地方收集所有输入, 一次输出给浏览器 这称为输出缓冲, 假如说你已在不同的函数输出内容: function print_header() { echo "Site Log and Login links"; } function print_footer() { echo "Site was made by me"; } print_header(); for($i = 0 ; $i < 100; $i++) { echo "I is : $i '; }print_footer();

17.不用直接行使$ _SESSION变量

一些简短的例子是:

$_SESSION['username'] = $username;
$username = $_SESSION['username'];

然则那有二个难点。假若您正在相像域中运营两个应用程序,会话变量会产生冲突。2个不等的应用程序在对话变量中可能会安装相仿的键名。比方,三个相符域的前端门户和后台管理应用程序。

为此,用包装函数使用应用程序特定键:

define('APP_ID' , 'abc_corp_ecommerce');

//Function to get a session variable
function session_get($key)
{
    $k = APP_ID . '.' . $key;

    if(isset($_SESSION[$k]))
    {
        return $_SESSION[$k];
    }

    return false;
}

//Function set the session variable
function session_set($key , $value)
{
    $k = APP_ID . '.' . $key;
    $_SESSION[$k] = $value;

    return true;
}

8. 当输出非 HTML 内容时,通过 header 发送精确的 mime 类型

请看某个 XML。

$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
  <code>0</code>
</response>";

//Send xml data
echo $xml;

行事例行。但它必要一些更上生龙活虎层楼。

$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
$xml = "<response>
  <code>0</code>
</response>";

//Send xml data
header("content-type: text/xml");
echo $xml;

请在乎 header 行。那行代码告诉浏览器这些故事情节是 XML
内容。由此,浏览器能够准确地拍卖它。相当多 JavaScript 库也都依赖于 header
消息。

JavaScript,css,jpg 图片,png 图像也是相同:

JavaScript

header("content-type: application/x-javascript");
echo "var a = 10";

CSS

header("content-type: text/css");
echo "#div id { background:#000; }"

事例解释:

地点的代码检查测验在邮件地址中是还是不是满含字符串
“example”。要是有,则另行抛出相当:

  1. customException(卡塔尔国 类是用作旧的
    exception
    类的二个恢弘来创立的。那样它就继续了旧类的具有属性和办法。
  2. 创办 errorMessage(卡塔尔国 函数。借使e-mail 地址违规,则该函数重临二个破绽超级多音讯。
  3. 把 $email
    变量设置为一个低价的邮件地址,但含有字符串 “example”。
  4. “try” 代码块富含另叁个 “try”
    代码块,那样就足以重新抛出至极。
  5. 由于 e-mail 包涵字符串
    “example”,由此触发分外。
  6. “catch” 捕获到该特别,并再次抛出
    “customException”。
  7. 破获到
    “customException”,并出示一条错误音讯。

若果在其眼下的 “try”
代码块中丰盛没有被抓获,则它就要更加高层级上寻找 catch 代码块。

大家定义了二个绝对路线, 值被写死了. 大家还足以改正它. 路径/var/www/project 也恐怕会变动, 那么大家每一遍都要改成它吧? 不是的,
大家能够使用__FILE__常量, 如:

13.在写入任何公文早先检查目录是还是不是可写

在写入或保存任何公文以前,请务要求检查该目录是或不是是可写的,假若不行写的话,会闪烁错误消息。那将节约你大批量的“调节和测量试验”时间。当你专门的职业于Linux时,权限是必须求管理的,並且会有无数过多的权能难题时,当目录不可写,文件不能读取等的时候。

请保管您的应用程序尽只怕智能化,并在最短的年月内报告最根本的音信。

$contents = "All the content";
$file_path = "/var/www/project/content.txt";

file_put_contents($file_path , $contents);

那完全正确。但有一点点直接的主题素材。file_put_contents恐怕会因为一些原由此未果:

  • 父目录不设有
  • 目录存在,但不得写
  • 锁定文件用于写入?

因此,在写入文件早前最棒能够100%都弄明确。

$contents = "All the content";
$dir = '/var/www/project';
$file_path = $dir . "/content.txt";

if(is_writable($dir))
{
    file_put_contents($file_path , $contents);
}
else
{
    die("Directory $dir is not writable, or does not exist. Please check");
}

由此那样做,你就会获得哪儿文件写入失利以致为什么战败的高精度消息。

19. 有个别傻帽式手艺

  • 使用 echo 代替 print
  • 使用 str_replace 代替 preg_replace,除非你规定要求它
  • 绝不使用 short tags
  • 对于简易的字符串使用单引号取代双引号
  • 在 header 重定向之后要记得做一个 exit
  • 纯属不要把函数调用放到 for 循环调控行中。
  • isset 比 strlen 快
  • 是的和同黄金年代地格式化你的代码
  • 无须丢失循环或 if-else 块的括号。

毫不写这么的代码:

if($a == true) $a_count++;

这相对是意气风发种浪费。

这样写

if($a == true)
{
    $a_count++;
}

不要通过吃掉语法降低你的代码。而是要令你的逻辑更简明。

  • 使用具备代码高亮功用的文本编辑器。代码高亮有支持减削不当。

事例解释:

上面的例子有三个透过 “GET”
方法传送的输入变量 (email卡塔尔:

  1. 检验是或不是存在 “GET” 类型的 “email”
    输入变量
  2. 万生龙活虎存在输入变量,检查评定它是还是不是是有效的邮件地址
function add_to_cart() {$db = new Database(); $db->query("INSERT INTO cart ....."); } function empty_cart() {$db = new Database(); $db->query("DELETE FROM cart ....."); }

接上豆蔻梢头篇:40+个对初读书人特别常有效的PHP技艺(生机勃勃)

2. 不使用 require,包括 require_once 或 include_once

你的脚本上大概会席卷各类文件,如类库,实用程序文件和扶持函数等,就像是这个:

require_once('lib/Database.php');
require_once('lib/Mail.php');

require_once('helpers/utitlity_functions.php');

这一定粗糙。代码须要更为灵活。写好救助函数能够更便于地满含东西。比如:

function load_class($class_name)
{
    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');
    require_once( $path ); 
}

load_class('Database');
load_class('Mail');

看来有别于了呢?很显眼。无需任何更加多的解释。

你还足以更进一层改正:

function load_class($class_name)
{
    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');

    if(file_exists($path))
    {
        require_once( $path ); 
    }
}

这么做能够做到相当多作业:

  • 为同一个类公事搜索多个目录。
  • 自在改正包涵类文件的目录,而不破坏其余地点的代码。
  • 行使相像的函数用于加载包蕴帮忙函数、HTML 内容等的文本。

语法

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

奥门永利402com 1

成立日期是
二〇一六-06-10 09:12:31am

但使用 array_map 更简单:

23.使用set_error_handler()将Php错误写入到文件

set_error_handler()能够用来设置自定义的错误处理程序。在文件中编辑一些珍视的荒谬用于日志是个好主意。

23. 使用 set_error_handler()将 Php 错误写入到文件

set_error_handler()能够用来设置自定义的错误管理程序。在文件中编辑一些要害的荒诞用于日志是个好主意。

Sanitizing 过滤器:

  • 用来允许或禁止字符串中钦命的字符
  • 过多据格式准则
  • 始终再次回到字符串
$images = array( 'myself.png' , 'friends.png' , 'colleagues.png' );$js_code = '';foreach{$js_code .= "'$image' ,";}$js_code = 'var images = [' . $js_code . ']; ';echo $js_code;//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,]; 更聪明的做法, 使用 json_encode: $images = array( 'myself.png' , 'friends.png' , 'colleagues.png' );$js_code = 'var images = ' . json_encode; echo $js_code;//Output is : var images = ["myself.png","friends.png","colleagues.png"]

20. 使用array_map连忙管理数组

比方说,你要trim一个数组的保有因素。生手会那样做:

foreach($arr as $c => $v)
{
    $arr[$c] = trim($v);
}

但它能够使用array_map变得更清洁:

$arr = array_map('trim' , $arr);

那适用于trim数组$arr的有着因素。另贰个好像的函数是array_walk。

17. 不要直接使用 $ _SESSION 变量

有的轻松的例证是:

$_SESSION['username'] = $username;
$username = $_SESSION['username'];

而是那有一个主题材料。假设你正在相同域中运作多少个应用程序,会话变量会发生冲突。2
个例外的应用程序在对话变量中大概会设置同大器晚成的键名。比如,多个形似域的前端门户和后台处理应用程序。

故此,用包装函数使用使用程序特定键:

define('APP_ID' , 'abc_corp_ecommerce');

//Function to get a session variable
function session_get($key)
{
    $k = APP_ID . '.' . $key;

    if(isset($_SESSION[$k]))
    {
        return $_SESSION[$k];
    }

    return false;
}

//Function set the session variable
function session_set($key , $value)
{
    $k = APP_ID . '.' . $key;
    $_SESSION[$k] = $value;

    return true;
}

获取时区

<?php
date_default_timezone_set("Asia/Shanghai");
echo "当前时间是 " . date("h:i:sa");
?>

该方法有大多毛病: 它首先查找钦赐的php蕴涵路线,
然后查找当前目录。因而会检讨过多路线。要是该脚本被另一索引的本子包蕴,
它的骨干目录产生了另意气风发脚本所在的目录.

16.在函数中连连有相同值的地点使用静态变量

//Delay for some time
function delay()
{
    $sync_delay = get_option('sync_delay');

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

反而,使用静态变量:

//Delay for some time
function delay()
{
    static $sync_delay = null;

    if($sync_delay == null)
    {
    $sync_delay = get_option('sync_delay');
    }

    echo "<br />Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done <br />";
}

9. 为 MySQL 连接装置科学的字符编码

曾蒙受过 unicode/utf-8 字符被科学地蕴藏在 mysql 表的难点,phpmyadmin
也呈现它们是科学的,可是当您使用的时候,你的网页上却并不能够正确地显示。里面包车型客车奥密在于
MySQL 连接核对。

$host = 'localhost';
$username = 'root';
$password = 'super_secret';

//Attempt to connect to database
$c = mysqli_connect($host , $username, $password);

//Check connection validity
if (!$c) 
{
    die ("Could not connect to the database host: <br />". mysqli_connect_error());
}

//Set the character set of the connection
if(!mysqli_set_charset ( $c , 'UTF8' ))
{
    die('mysqli_set_charset() failed');
}

倘若您总是到数据库,无妨设置连接字符集。当你在你的应用程序中动用三种语言时,那纯属有十分重要。

不然会生出什么样啊?你会在非Serbia语文本中看出多数的四方和????????。

选用和标记

分选和标志用于向钦命的过滤器增添额外的过滤选项。

分裂的过滤器有两样的选项和标记。

在底下的事例中,我们用 filter_var() 和 “min_range” 以及 “max_range”
选项验证了叁个整数:

<?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");
 }
?>
$xml = ''; $xml = " 0 ";//Send xml data echo $xml;

3. 在应用程序中维护调节和测验情形

在支付进程中,大家 echo
数据库查询,转储创建难点的变量,然后假若难点被消除,大家讲授它们或删除它们。但让任何留在原地可提供长效帮扶。

在支付电脑上,你能够这么做:

define('ENVIRONMENT' , 'development');

if(! $db->query( $query )
{
    if(ENVIRONMENT == 'development')
    {
        echo "$query failed";
    }
    else
    {
        echo "Database error. Please contact administrator";
    }    
}

何况在服务器上,你能够这么做:

define('ENVIRONMENT' , 'production');

if(! $db->query( $query )
{
    if(ENVIRONMENT == 'development')
    {
        echo "$query failed";
    }
    else
    {
        echo "Database error. Please contact administrator";
    }    
}

如何是表面数据?

  • 发源表单的输入数据
  • Cookies
  • 服务器变量
  • 数据库查询结果
$xml = ''; $xml = " 0 "; //Send xml data header("content-type: text/xml"); echo $xml;

12. 从 php echo javascript 代码时使用 json_encode

多少时候有个别 JavaScript 代码是从 php 动态变化的。

$images = array(
 'myself.png' , 'friends.png' , 'colleagues.png'
);

$js_code = '';

foreach($images as $image)
{
$js_code .= "'$image' ,";
}

$js_code = 'var images = [' . $js_code . ']; ';

echo $js_code;

//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];

放聪明点。使用 json_encode:

$images = array(
 'myself.png' , 'friends.png' , 'colleagues.png'
);

$js_code = 'var images = ' . json_encode($images);

echo $js_code;

//Output is : var images = ["myself.png","friends.png","colleagues.png"]

那不是很清新?

实例

<?php
$d=strtotime("tomorrow");
echo date("Y-m-d h:i:sa", $d) . "<br>";
$d=strtotime("next Saturday");
echo date("Y-m-d h:i:sa", $d) . "<br>";
$d=strtotime("+3 Months");
echo date("Y-m-d h:i:sa", $d) . "<br>";
?>

<?php
$d1=strtotime("December 31");
$d2=ceil(($d1-time())/60/60/24);
echo "距离十二月三十一日还有:" . $d2 ." 天。";
?>

劳务器端包含(SSI卡塔尔(قطر‎ 用于创造可在四个页面重复使用的函数、页眉、页脚或因素。

18. 将工具函数封装到类中 如若你在某文件中定义了累累工具函数:

7. 在多个地点采摘全体出口,然后二遍性输出给浏览器

这便是所谓的出口缓冲。比如说,你从分化的函数获得像那样的内容:

function print_header()
{
    echo "<div id='header'>Site Log and Login links</div>";
}

function print_footer()
{
    echo "<div id='footer'>Site was made by me</div>";
}

print_header();
for($i = 0 ; $i < 100; $i++)
{
    echo "I is : $i <br />';
}
print_footer();

其实你应该先在三个地点采摘全体出口。你能够要么将它存款和储蓄于函数中的变量内部,要么使用
ob_start 和 ob_end_clean。所以,今后应当看起来像这么

function print_header()
{
    $o = "<div id='header'>Site Log and Login links</div>";
    return $o;
}

function print_footer()
{
    $o = "<div id='footer'>Site was made by me</div>";
    return $o;
}

echo print_header();
for($i = 0 ; $i < 100; $i++)
{
    echo "I is : $i <br />';
}
echo print_footer();

那便是说,为啥你应有做输出缓冲呢:

  • 您能够在将出口发送给浏览器从前修正它,假设你需求的话。比如做一些
    str_replaces,或者 preg_replaces,又或许是在结尾加多一些外加的
    html,譬喻 profiler/debugger 输出。
  • 发送输出给浏览器,并在同一时间做 php
    管理并非好主意。你见过这么的网址,它有八个 Fatal error
    在侧边栏或在显示屏中间的正方中吗?你知道干什么会晤世这种意况呢?因为管理进度和输出被混合在了一齐。

语法

setcookie(name, value, expire, path, domain);

在下边包车型大巴例子中,我们将创建名称为 “user” 的 cookie,把为它赋值 “亚历克斯Porter”。大家也明确了此 cookie 在豆蔻梢头钟头后过期:

<?php 
setcookie("user", "Alex Porter", time()+3600);
?>

注明:在发送
cookie 时,cookie 的值会自动实行 U景逸SUVL 编码,在收复时张开自动解码(为严防
U奥迪Q5L 编码,请使用 setrawcookie(State of Qatar 取代他)。

PHP
的 $_COOKIE 变量用于取回 cookie 的值。

在下边包车型地铁例子中,大家取回了名字为 “user” 的 cookie
的值,并把它显得在了页面上:

<?php
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>

在底下的事例中,我们接纳 isset(State of Qatar 函数来确认是还是不是已安装了 cookie:

<html>
<body>
<?php
if (isset($_COOKIE["user"]))
  echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
  echo "Welcome guest!<br />";
?>
</body>
</html>

当删除
cookie 时,您应该使过期日期更动为过去的时间点。

<?php 
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>

PHP
session 变量用于存款和储蓄有关客户会话的新闻,或更改顾客会话的装置。Session
变量保存的音信是十足客户的,并且可供应用程序中的全体页面使用。

然则,会话新闻是一时半刻的,在客户间距网址后将被删去。假诺你要求永世积累消息,能够把数量存款和储蓄在数据库中。

Session
的做事机制是:为各样新闻报道工作者创建叁个唯风姿洒脱的 id (UID卡塔尔,并依据这么些 UID
来积攒变量。UID 存款和储蓄在 cookie 中,亦或通过 U科雷傲L 举办传导。

在你把客商消息囤积到 PHP session 中在此以前,首先必需运营会话。

注释:session_start(卡塔尔 函数必需放在 <html> 标签从前

今昔你从submit按键值中摆脱出来了.

4. 经过会话传播意况消息

情景消息是那个举办义务后转换的音信。

<?php
if($wrong_username || $wrong_password)
{
    $msg = 'Invalid username or password';
}
?>
<html>
<body>

<?php echo $msg; ?>

<form>
...
</form>
</body>
</html>

这么的代码很广阔。使用变量来展现状态信息有料定的局限性。因为它们不或然透过重定向发送(除非你将它们当作GET
变量传播给下贰个本子,但那丰富愚笨)。并且在大型脚本中大概会有五个消息等。

最佳的艺术是接纳会话来传播(即便是在同大器晚成页面上)。想要那样做的话在每一个页面上必须得有一个session_start。

function set_flash($msg)
{
    $_SESSION['message'] = $msg;
}

function get_flash()
{
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
    return $msg;
}

在你的剧本中:

<?php
if($wrong_username || $wrong_password)
{
    set_flash('Invalid username or password');
}
?>
<html>
<body>

Status is : <?php echo get_flash(); ?>
<form>
...
</form>
</body>
</html>

创办自定义错误微型机

始建三个自定义的错误微电脑特别轻易。大家很简短地创设了叁个专项使用函数,能够在
PHP 中生出错误时调用该函数。

该函数必需有技能管理最少五个参数 (error
level 和 error message卡塔尔,不过足以选取最多八个参数(可选的:file,
line-number 以至 error context):

9. 为mysql连接装置科学的字符编码
曾经碰着过在mysql表中设置了unicode/utf-8编码, phpadmin也能正确展现,
但当您收获内容并在页面输出的时候,会产出乱码.
这里的标题出在mysql连接的字符编码.

1. 毫无接受相对路线,要定义三个根路线

像这种类型的代码行很分布:

require_once('../../lib/some_class.php');

这种措施有那一个欠缺:

  • 它首先寻觅 php
    包罗路线中的钦赐目录,然后查看当前目录。由此,会检查超多索引。
  • 当七个剧本被含有在另三个本子的两样目录中时,它的中坚目录变为带有脚本的目录。
  • 另三个标题是,当一个剧本从 cron
    运维时,它只怕不会将它的父目录作为工作目录。

之所以选拔相对路线便成为了二个好法子:

define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');

//rest of the code

那正是一个相对路线,並且会平素维系不改变。不过,大家得以越发纠正。目录 /
var/www/project 能够变,那么大家每一回都要改呢?

不,使用魔术常量如FILE能够让它变得可移植。请紧凑看:

//suppose your script is /var/www/project/index.php
//Then __FILE__ will always have that full path.

define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');

//rest of the code

由此将来,固然你将品种转移到三个莫衷一是的目录,举例将其移动到叁个在线的服务器上,那些代码不必要退换就足以运作。

通过 E-Mail 发送错误消息

在底下的例子中,假如一定的错误发生,我们将发送带有错误新闻的电子邮件,并终止脚本:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Webmaster has been notified";
 error_log("Error: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>

以上代码的输出应该周围那样:

Error: [512] Value must be 1 or below
Webmaster has been notified

选拔自以上代码的邮件相像那样:

Error: [512] Value must be 1 or below

以此艺术不符合全部的谬误。常规错误应当透过使用暗中同意的 PHP
记录系统在服务器上举办记录。

十分(Exception)用于在钦点的不当发生时改造脚本的平常流程。

当卓殊被触发时,平常会产生:

  • 时下代码状态被保存
  • 代码实施被切换成预约义的要命微型机函数
  • 听大人说气象,微处理机只怕会从保存的代码状态重新开头实施代码,终止脚本实行,或从代码中别的的岗位继续实施脚本

这种用法非凡原始. 应该越来越灵活点. 应编写制定个助手函数包涵文件. 举个例子:

24. 小心管理大型数组

大型的数组或字符串,纵然二个变量保存了有的规模非常大的事物,那么要小心管理。视而不见错误是制造别本,然后耗尽内部存储器,并拿到内部存款和储蓄器溢出的致命错误:

$db_records_in_array_format; //This is a big array holding 1000 rows from a table each having 20 columns , every row is atleast 100 bytes , so total 1000 * 20 * 100 = 2MB

$cc = $db_records_in_array_format; //2MB more

some_function($cc); //Another 2MB ?

当导入 csv 文件或导出表到 csv 文件时,上边那样的代码很广泛。

像上边那样做大概时时会出于内部存款和储蓄器限定而让脚本崩溃。对于小圈圈的变量它不会不由自主难点,但当管理大型数组时应当要对此加以幸免。

考虑通过援引传递它们,只怕将它们存款和储蓄在叁个类变量中:

$a = get_large_array();
pass_to_function(&$a);

那样一来,相似的变量(并非其别本)将用于该函数。

class A
{
    function first()
    {
        $this->a = get_large_array();
        $this->pass_to_function();
    }

    function pass_to_function()
    {
        //process $this->a
    }
}

及早还原它们,那样内部存款和储蓄器就能够被放出,并且脚本的其他部分就会放松。

上面是有关什么通过援用来赋值进而节外省部存储器的贰个简洁明了示例。

<?php

ini_set('display_errors' , true);
error_reporting(E_ALL);

$a = array();

for($i = 0; $i < 100000 ; $i++)
{
    $a[$i] = 'A'.$i;
}

echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '<br />';

$b = $a;
$b[0] = 'B';

echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '<br />';

$c = $a;
$c[0] = 'B';

echo 'Memory usage in MB after 2st copy : '. memory_get_usage() / 1000000 . '<br />';

$d =& $a;
$d[0] = 'B';

echo 'Memory usage in MB after 3st copy (reference) : '. memory_get_usage() / 1000000 . '<br />';

一个优异 php 5.4 机器上的输出是:

Memory usage in MB : 18.08208
Memory usage in MB after 1st copy : 27.930944
Memory usage in MB after 2st copy : 37.779808
Memory usage in MB after 3st copy (reference) : 37.779864

故此得以看出,内部存储器被封存在第 3
份通过引用的别本中。不然,在具有普通别本中内部存储器将被进一层多地动用。

使用 Filter Callback

通过使用 FILTEKuga_CALLBACK
过滤器,能够调用自定义的函数,把它当作三个过滤器来利用。那样,大家就有所了数码过滤的一丝一毫控制权。

您能够创造自身的自定义函数,也能够利用已部分
PHP 函数。

分明您希图用到过滤器函数的方法,与规定选项的法子黄金年代致。

在底下的例证中,大家利用了二个自定义的函数把持有
“_” 转变为空格:

<?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!
define('ENVIRONMENT' , 'development'); if(! $db->query { if(ENVIRONMENT == 'development') { echo "$query failed"; } else { echo "Database error. Please contact administrator"; } }

18. 卷入实用帮助函数到叁个类中

故而,你不得不在一个文书中有数不完实用函数:

function utility_a()
{
    //This function does a utility thing like string processing
}

function utility_b()
{
    //This function does nother utility thing like database processing
}

function utility_c()
{
    //This function is ...
}

私自地在应用程序中应用函数。那么您恐怕想要将它们包装成叁个类作为静态函数:

class Utility
{
    public static function utility_a()
    {

    }

    public static function utility_b()
    {

    }

    public static function utility_c()
    {

    }
}

//and call them as 

$a = Utility::utility_a();
$b = Utility::utility_b();

此间你能够收获的多少个大名鼎鼎好处是,假诺 php
有类同名称的放松权利函数,那么名称不会爆发冲突。

从另二个角度看,你能够在长久以来的应用程序中保险四个本子的类似类,而不会产生其余冲突。因为它棉被服装进了,就是那般。

PHP 覆盖(Overwriting)

假定今后 “newfile.txt”
富含了有的数量,大家得以显得在写入本来就有文件时发出的的事体。全体已存在的多寡会被擦除并以贰个新文件伊始。

<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Mickey Mouse\n";
fwrite($myfile, $txt);
$txt = "Minnie Mouse\n";
fwrite($myfile, $txt);
fclose($myfile);
?>
//Attempt to connect to database $c = mysqli_connect($this->host , $this->username, $this->password); //Check connection validity if  { die ("Could not connect to the database host: ". mysqli_connect_error; } //Set the character set of the connectionif(!mysqli_set_charset  { die failed'); }

6. 省略截至的 php 标签,假诺它是本子中的最后生机勃勃行

笔者不精通怎么超多博客文章在研究 php 小技艺时要轻便那么些技艺。

<?php

echo "Hello";

//Now dont close this tag

那足以扶助您省略多量标题。举四个例子:

类文件 super_class.php

<?php
class super_class
{
    function super_function()
    {
        //super code
    }
}
?>
//super extra character after the closing tag

现在看 index.php

require_once('super_class.php');

//echo an image or pdf , or set the cookies or session data

你会获得发送错误的 Header。为啥吗?因为
“超多余字符”,全部标题都去管理这一个去了。于是你得从头调弄整理。你可能须求浪费广大时刻来搜寻顶尖额外的上空。

所以要养成省略结束标签的习贯:

<?php
class super_class
{
    function super_function()
    {
        //super code
    }
}

//No closing tag

这么越来越好。

保留被上传的文书

地点的例证在服务器的 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";
  }
?>

位置的台本检查测验了是不是已存在这文件,就算不设有,则把公文拷贝到钦点的公文夹。

疏解:这些例子把公文物爱慕留到了名称叫 “upload” 的新文件夹。

cookie
常用于识别客户。

setcookie(卡塔尔国 函数用于安装 cookie。

声明:setcookie(卡塔尔国 函数必需放在 <html> 标签此前。

如此做后, 向函数字传送递变量引用. 查看文书档案.

相关文章