phpFAQ

来源:互联网 发布:网络诈骗的手段和案例 编辑:程序博客网 时间:2024/05/16 05:36

Q:isset()和empty()的区别A:两者都是测试变量用的。但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空。如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示。如果一个变量被赋空值,$foo=""或者$foo=0或者$foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。要注销一个变量,可以用 unset($foo)或者$foo=NULL。
Q:如何显示错误信息A:当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽

Q:单引号 双引号什么区别?分别什么时侯用
A:单引号中,任何变量($var)、特殊转义字符(如“/t /r /n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持“/’”和“/”这样对单引号和反斜杠本身的转义;双引号中,变量($var)值会代入字符串中,特殊转义字符也会被解析成特定的单个字符,还有一些专门针对上述两项特性的特殊功能性转义,例如“$”和“。这样虽然程序编写更加方便,但同时PHP的解析也很慢;数组中,如果下标不是整型,而是字符串类型,请务必用单引号将下标括起,正确的写法为$array[‘key’],而不是$array[key],因为不正确的写法会使PHP解析器认为key是一个常量,进而先判断常量是否存在,不存在时才以“key”作为下标带入表达式中,同时出发错误事件,产生一条Notice级错误。因此,在绝大多数可以使用单引号的场合,不要使用双引号。
Q:print,echo,print_r什么区别?分别什么时侯用?
A:echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用

Q: 在PHP中有些时候需要打开一些远程的文件(函数为:fopen(http://XXX.com/a.php),fsockopen(http://XXX.com/a.php) , file_get_contents(http://XXX.com/a.php)等。。。),环境为php5,apache2.2.X,会提示你无法打开文件流,http请求失败(failed to open stream: HTTP request failed!)
A:    在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可。)重启服务器。

Q:如何预先获取auto_increment的值?A:mysql_connect('localhost','root','root') or die('不能连接到服务器');                        
      mysql_select_db('test');                         //连接数据库
   $sql = "show create table hj_reset_password";    //hj_reset_password 为表名
   $query = mysql_query($sql);
      $arr = mysql_fetch_array($query);
      $b = strstr($arr[1],'AUTO_INCREMENT=');          //获取子字符串,包含AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 )
      $result = intval(substr($b,15));                 //substr()从字符串第16个位置获取字符串,再对获取后的字符串进行int类型转换
   echo 'AUTO_INCREMENT的值' .$result;              //输出结果:即为下一次插入数据时的ID值
Q:利用getenv("REMOTE_ADDR")可以得到浏览者的IP;利用getenv("HTTP_USER_AGENT")可以得到浏览者的操作系统类型,浏览器类型;还有什么其他参数吗?A:getenv能得到所有$_ENV这个全局变量的所有东西
你print_r($_ENV);可以看到很多东西
比如你echo getenv(ALLUSERSPROFILE);
就可以看到ALLUSERSPROFILE的值
echo getenv(PATHEXT);就可以看到PATHEXT的值
Q: mysql_fetch_row()和mysql_fetch_array()的区别A: mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。除了将数据以数字索引方式储存在数组中之外,还可以将数据作为关联索引储存,用字段名作为键名。用 mysql_fetch_array()  并不明显 比用 mysql_fetch_row()  慢,而且还提供了明显更多的值。
mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和MYSQL_BOTH。本特性是 PHP 3.0.7 起新加的。本参数的默认值是 MYSQL_BOTH。
Q:EOD的用法和功效 A:就是比单引号和双引号好些,能包含换行。EOD可以改成其他字符。
Q:用gdate()获得一长串数字怎么转换成正常的时间?
A:gmdate 返回 GMT 时间,除此以外和 date() 函数完全一样。如果你需要本地时间,就用 date() 来格式化时间戳。

Q:正则里面的()//区别何在?A:/ / 是模式定界符,代表里面是一个正则规则。
( ) 代表的是子模式,一个/ /中可以有很多的  ( )组成,可以用/1 /2 或 $1 $2来匹配前面子模式的值。
Q:require和require_once有啥区别?A:require重复调用会多次加载你饮用的文件;require_once只加载一次,而不管你实际上调用了多少次,主要用于复杂的文件包含关系
例如b包含a,c包含a,但同时c又包含了b,那么如果用require的话可能会导致两次加载a
Q:三个IP地址的获取有什么区别?      $_SERVER['REMOTE_ADDR'];
      $_SERVER['HTTP_CLIENT_IP'];
      $_SERVER['HTTP_X_FORWARDED_FOR'];
A:$_SERVER['REMOTE_ADDR'];   //访问端(有可能是用户,有可能是代理的)IP
      $_SERVER['HTTP_CLIENT_IP'];  //代理端的(有可能存在,可伪造)
      $_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)
Q:$_GET和$_POST的区别?A:一:get 方法是限制传值的大小,不能超过2K. 而post不限制传值的大小.
      二:Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
      三:Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。  
      四:Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到
提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
Q:在类里面的函数前面可以加public,private,但在函数库中的函数前面不能加呢?A:function自定的随便你,public是公开使用的类属性对象,privat是独立使用的类属性对象;
      类中 public 或 private 是指这个方法(要注意叫“方法”)是对外公开还是是属于类私有而你指的函数库,它是“函数”的库,不属于类中的方法,所以不必也不能有前置修饰。

Q:页面执行时间怎么算的?A:$mtime = explode(' ', microtime());
      $starttime = $mtime[1] + $mtime[0];
      ……
      ……
      ……
      $mtime = explode(' ', microtime());
      $endtime = $mtime[1] + $mtime[0];
      $usedtime = $endtime - $starttime;
      printf("<br />%0.4f s", $usedtime);
Q:ZendStudio安装后打不开A:不使用第三方windows主题,尽量使用自带主题

Q: UTF8编码脚本session_start(),header(),settcookie()等函数出错,提示"headers already sent "。A: UTF8编码脚本通常的编辑器都会在文件头部加上三字节的BOM编码来识别UTF8编码格式,这三个字节是普通文件编辑器看不到,而输出时去先行以HTML输出了。执行以上函数时就会提示以上错误。解决办法:用editplus等可以清除BOM的编辑器,清除BOM(设置为utf8清除BOM)保存一下即可。
Q: 初学者不会一步步安装配置服务器环境怎么办?A: 有很多WAMP套件可以实现傻瓜化的安装,直接可以建成服务器环境。不妨先拿来用了,以求快速入门,等有一定基础再试着去配置服务器环境。
Q: 服务器时区默认设置不符合要求,而且又不能去改服务器的php.ini怎么办?A: 在需要时区操作的时候利用函数 date_default_timezone_set 设定您需要时区。
Q: PHP中单引号,双引号,反引号的区别不太清楚,能解释一下么?A: PHP单引号('),双引号("")反引号(`)都能引用字串。单引号中变量不被转义,双引号转义变量,而反引号中变量转义作为shell命令被执行。
Q:很多人对面向对象和面向过程争吵不休,两者之间到底哪个更好一些,关系又是什么?A:面向对象跟面向过程并不是对立的,根本就不冲突。面向对象是一种思维方式,是面向过程思维的提升,并不是面向过程思维的否定。面向对象更符合人类的思维方式,有助于更好的解决问题。
从思想的高度来说,应该尽早习惯于面向对象的思维方式。如此说来哪个更好一些就没有意义了。
Q:在php.ini的扩展里已经加载了php_mysql.dll,还出现“Fatal error: Call to undefined function mysql_connect() in ... ”错误,怎么办?A:APACHE下直接在apache 配置文件载入LoadFile "X:/phpdir/libmysql.dll",windows下请在环境变量path里加入libmysql.dll的所在路径。

Q:intval和int转换整数的区别?A:int是强制类型转换一个是函数;intval可以用在其他进制数。
Q:date 出来的时间与电脑时间不一致A:时区问题
      如果你的php.ini里有date.timezone修改成date.timezone = PRC
      或者在你的程序里加入date_default_timezone_set('Asia/Chongqing');
Q:fread与fgets的区别与用处
A:fread -- 读取文件(可安全用于二进制文件);
      fgets -- 从文件指针中读取一行。

fread与fgets的区别与用处:其实这两个函数在手册中都是可以找到详细的说明的,那我为什么要在这里写出来呢?原因很简单有很多像我这样的新人看手册时都是一翻而过最多就是有个记忆,能做到这样,我觉的也已经不错了.谁不是在用到某个函数的时候再去找的呢?(最基本也就是最常用的函数除外)
       前几天我在这里发一贴本来是想问问有什么方便又简单的不同系统之间的交互.我还记的去年我去一家公司面试时,人家问我PHP怎么与java交互(上海某某公司),我当时一听傻了从来没想过这种事,但是我还是急中生智的说了句通过数据库数据.回来后我还问王飞老师(ho58)怎么交互,他说是用XML.呵呵,好了就不说那么多了,还是回来我们的主题fread与fgets

fread -- 读取文件(可安全用于二进制文件)
说明string fread ( int handle, int length )

fread() 从文件指针 handle 读取最多 length 个字节。该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。

<?php
// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize ($filename));
fclose($handle);
?> 
警告
在区分二进制文件和文本文件的系统上(如 Windows)打开文件时,[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fopen.html]fopen()[/url] 函数的 mode 参数要加上 'b'。
 <?php
$filename = "c://files//somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize ($filename));
fclose($handle);
?> 
警告
当从网络流或者管道读取时,例如在读取从[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/features.remote-files.html]远程文件[/url]或 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.popen.html]popen()[/url] 以及 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.proc-open.html]proc_open()[/url] 的返回时,读取会在一个包可用之后停止。这意味着应该如下例所示将数据收集起来合并成大块。

<?php
$handle = fopen ("http://www.example.com/", "rb");
$contents = "";
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);
?> 
注: 如果只是想将一个文件的内容读入到一个字符串中,用 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.file-get-contents.html]file_get_contents()[/url],它的性能比上面的代码好得多。
fgets(PHP 3, PHP 4, PHP 5)
fgets -- 从文件指针中读取一行
说明string fgets ( int handle [, int length] )

从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
出错时返回 FALSE。
通常的缺陷:
习惯了 C 语言中 fgets() 语法的人应该注意到 EOF 是怎样被返回的。
文件指针必须有效,并且必须指向一个由 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fopen.html]fopen()[/url] 或 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fsockopen.html]fsockopen()[/url] 成功打开(但还没有被 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fclose.html]fclose()[/url] 关闭)的文件。
以下是一个简单例子: 例子 1. 逐行读取文件
<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($fd, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?> 
注: length 参数从 PHP 4.2.0 起成为可选项,如果忽略,则行的长度被假定为 1024。从 PHP 4.3 开始,忽略掉 length 将继续从流中读取数据直到行结束。如果文件中的大多数行都大于 8KB,则在脚本中指定最大行的长度在利用资源上更为有效。

注: 从 PHP 4.3 开始本函数可以安全用于二进制文件。早期的版本则不行。

注: 如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/ref.filesystem.html#ini.auto-detect-line-endings]auto_detect_line_endings[/url] 运行时配置选项。

通常我们交互时都不是与本地文件进行交互,也就是说我们都是要通过远程文件进行交互,上个星期做预约系统,要三个不同的系统(一个会员系统ASP,一个电话预约系统java,网站php)进行交互,由于三个系统是有三个不同的人管理,并且公司管理权限不可能互相之间对对方数据库进行操作(呵呵,看来那天我应该算是,至少是没说错(:人家不是没要我),XML由于本人水平有限对它了解不深刻,所以就选择了通过URL来进行交互.

我听了某些人的话使用了fread,结果在url中能得到结果,但是读取却是空,抽了根烟不明白错在哪时,翻了下手册,呵呵,不真让我找到了,下面大家看一看
使用远程文件
只要在 php.ini 文件中激活了 allow_url_fopen 选项,就可以在大多数需要用文件名作为参数的函数中使用 HTTP 和 FTP 的 URL 来代替文件名。同时,也可以在 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.include.html]include()[/url]、[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.include-once.html]include_once()[/url]、[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.require.html]require()[/url] 及 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.require-once.html]require_once()[/url] 语句中使用 URL。PHP 所支持协议的更多信息参见[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/wrappers.html]附录 M[/url]。

注: 要在 PHP 4.0.3 及其更早的版本中使用 URL 封装协议,需要在编译时用 --enable-url-fopen-wrapper 参数来配置 PHP。

 

注: Windows 版本的 PHP 4.3 版之前不支持以下函数的远程访问:[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.include.html]include()[/url],[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.include-once.html]include_once()[/url],[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.require.html]require()[/url],[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.require-once.html]require_once()[/url] 以及[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/ref.image.html]参考 LVII, Image 图像函数[/url]中的 imagecreatefromXXX 函数。


例如,可以用以下范例来打开远程 web 服务器上的文件,解析需要的输出数据,然后将这些数据用在数据库的检索中,或者简单地以和自己网站其它页面相同的风格输出其内容。
例子 39-1. 获取远程文件的标题
<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
    echo "<p>Unable to open remote file./n";
    exit;
}
while (!feof ($file)) {
    $line = fgets ($file, 1024);
    /* This only works if the title and its tags are on one line */
    if (eregi ("<title>(.*)</title>", $line, $out)) {
        $title = $out[1];
        break;
    }
}
fclose($file);
?> 

 

如果有合法的访问权限,以一个用户的身份和某 FTP 服务器建立了链接,还可以向该 FTP 服务器端的文件进行写操作。仅能用该方法来创建新的文件;如果尝试覆盖已经存在的文件,[url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fopen.html]fopen()[/url] 函数的调用将会失败。
要以“anonymous”以外的用户名连接服务器,需要指明用户名(可能还有密码),例如“ftp://user:password@ftp.example.com/path/to/file”(也可以在通过需要 Basic 认证的 HTTP 协议访问远程文件时使用相同的语法)。
例子 39-2. 将数据保存到远程服务器
<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
    echo "<p>Unable to open remote file for writing./n";
    exit;
}
/* Write the data here. */
fwrite ($file, $_SERVER['HTTP_USER_AGENT'] . "/n");
fclose ($file);
?> 
注: 或许可以从以上范例中得到启发,用该技术来存储远程日志文件。但是正如以上提到的,在用 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fopen.html]fopen()[/url] 方式打开的 URL 中,仅能对新文件进行写操作。如果远程文件已经存在则 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.fopen.html]fopen()[/url] 函数的操作将会失败。要做类似于分布式日志的事,可以参考 [url=mk:@MSITStore:D:/技术手册/PHP5.chm::/zh/function.syslog.html]syslog()[/url] 函数。
Q:如何避免页面刷新数据重复写入数据库?
A:页面重定向、加session验证等都可以解决,附上常用方法如下:
方法1.最简单的方法:提交后输入框内的内容清空就可以了。

方法2.在session中保存变量
$_SESSION['submit']=false
提交后 改为true
检测变量 if ($_SESSION['submit']=true)
{
echo "text";
exit();
}

方法3.header("Location: http://www.example.com/");

方法4.提交后用javascript做跳转.
Q:PHP中的串行化变量和序列化对象A:在PHP中有多串行化处理的函数:serialize(),该函数把任何变量值(除了资源变量)转化为字符串的形式,可以把字符串保存到文件里,或者注册为Session,乃至于使用curl来模拟GET/POST来传输变量,达到RPC的效果。

PHP中的串行化变量和序列化对象

串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输、存储。当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构。
  在PHP中有多串行化处理的函数:serialize(),该函数把任何变量值(除了资源变量)转化为字符串的形式,可以把字符串保存到文件里,或者注册为Session,乃至于使用curl来模拟GET/POST来传输变量,达到RPC的效果。

  如果要将串行化的变量转化成PHP原始的变量值,那么可以使用unserialize()函数。

  一、变量串行化

  我们举简单的例子来说明串行化,以及它的存储格式。

  整型:


PHP:
<?php
  $var = 23;
  echo serialize($var);
?>


  输出:

  i:23;

  浮点型:

<?php
  $var = 1.23;
  echo serialize($var);
?>
  输出:

  d:1.229999999999999982236431605997495353221893310546875;

  字符串:
PHP:[Copy to clipboard]
<?php
  $var = "This is a string";
  echo serialize($var);
  $var = "我是变量";
  echo serialize($var);
?>
  输出:

  s:16:"This is a string";
  s:8:"我是变量";

  布尔型:

<?php
  $var = true;
  echo serialize($var);
  $var = false;
  echo serialize($var);
?>


  输出:

  b:1;
  b:0;

  上面这些基本类型串行化之后的情况很清楚,串行化之后的存储格式是:

  变量类型:[变量长度:]变量值;

  就是第一位字符代表变量类型,第二个:代表分割,变量长度是可选的,就是在字符串类型里有,其他类型没有,最后一个就是变量值,每个串行化的值以";"作为结束。

  比如我们整型数字23串行化之后就是:i:23,那么它没有长度,只有类型和变量值,i代表integer,通过冒号分割,后面保存的是整型值23,包括浮点型(双字节型)也是一样。布尔型的话,类型是b(boolean),如果是true的话,那么串行化的值是1,如果是false那么值就是0。字

  符串值话中间会多一个保存的值得,保存字符串的长度值,比如字符串"This is a string",那么生成的串行化的值是 s:16:"This is a string"; s是string,代表类型,中间的16就是该字符串的长度,如果是中文的话,那么每个中文是两个字符来保存的,比如字符串 "我是变量",生成的串行化值是:s:8:"我是变量"; 就是8个字符的长度。

  下面我们重点来讲一下数组变量串行化。

  数组变量:


<?php
$var = array("abc", "def", "xyz", "123");
echo serialize($var);
?>


  输出:

a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz";i:3;s:3:"123";}

  就是把我的数组 $var 串行化得到的字符串值,我们的$var数组包括4个字符串元素,分别是"abc", "def", "xyz", "123",我们来分析一下串行化后的数据,为了简便起见,我们把串行化的数据列成数组的样式:

a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}

  这样排列就比较清晰了,看开始的字符串:a:4:{...} 首先第一个字符a保存的是变量类型是array(数组)类型,第二个 4 保存的是数组元素的个数,一共有4个,然后在{}之间数组元素的内容。比如第一个数组元素:i:0;s:3:"abc"; i代表是当前数组元素的索引值类型是整型,并且值是 0,元素值的类型是s(字符串的),个数是 3 个,具体值是"abc",分号结束,下面的数组元素依次类推。

  我们再看看使用字符串做为元素索引会如何:


PHP:
<?php
$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4"=>"123");
echo serialize($var);
?>


  输出:

a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6:"index3";s:3:"xyz";s:6:"index4";s:3:"123";}

  变成数组样式后:

a:4:
{
 s:6:"index1";s:3:"abc";
 s:6:"index2";s:3:"def";
 s:6:"index3";s:3:"xyz";
 s:6:"index4";s:3:"123";
}

  其实跟上面没有太大区别,不过是开始的索引变成了保存字符串的形式,比如第一个元素:s:6:"index1";s:3:"abc";第一项就是索引值:s:6:"index1"; s是类型,6是索引字符串的长度,"index1"就是索引的值。后面的s:3:"abc"; 就是元素值,这个好理解,就不讲了。

  从上面来看,我们大致了解了基本数据类型的串行化,其实我们完全可以构造自己的串行化功能,或者从这个角度去扩展,开发自己的串行化程序,便于我们的变量交换。

  当然,其实我们也可以利用这个功能,把数组或者任意其他变量串行化成字符串,然后通过curl功能来模拟GET/POST功能,达到能够无用用户执行动作就从远程服务器获取数据的功能。

  二、对象序列化

  对象的序列化也是一个比较普遍的功能,能够把一个对象进行串行化以后变成一个字符串,能够保存或者传输。

  我们先看一个例子:


PHP:
<?php
class TestClass
{
 var $a;
 var $b;

 function TestClass()
 {
  $this->a = "This is a";
  $this->b = "This is b";
 }

 function getA()
 {
  return $this->a;
 }

 function getB()
 {
  return $this->b;
 }
}

$obj = new TestClass;
$str = serialize($obj);
echo $str;
?>


  输出结果:

O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b";}

  我们来分析一个对象串行化之后的字符串。

O:9:"TestClass":2:
{
 s:1:"a";s:9:"This is a";
 s:1:"b";s:9:"This is b";
}

  首先看对于对象本身的内容:O:9:"TestClass":2:O是说明这是一个对象类型(object),然后9是代表对象的名字查过浓度,2是代表该对象有几个属性。在看两个属性的内容:

  s:1:"a";s:9:"This is a"; 其实跟数组的内容比较类似,第一项:s:1:"a"; 是描述属性名称的,第二项s:9:"This is a"; 是描述属性值的。后面的属性类似。

  先说一种对象序列化的应用,下面的内容是PHP手册上,没有更改原文。

  serialize() 返回一个字符串,包含着可以储存于 PHP 的任何值的字节流表示。unserialize() 可以用此字符串来重建原始的变量值。用序列化来保存对象可以保存对象中的所有变量。对象中的函数不会被保存,只有类的名称。

  要能够 unserialize() 一个对象,需要定义该对象的类。也就是,如果序列化了 page1.php 中类 A 的对象 $a,将得到一个指向类 A 的字符串并包含有所有 $a 中变量的值。如果要在 page2.php 中将其解序列化,重建类 A 的对象 $a,则 page2.php 中必须要出现类 A 的定义。这可以例如这样实现,将类 A 的定义放在一个包含文件中,并在 page1.php 和 page2.php 都包含此文件。


PHP:
<?php
// classa.inc:
class A
{
 var $one = 1;

 function show_one()
 {
  echo $this->one;
 }
}

// page1.php:
include("classa.inc");

$a = new A;
$s = serialize($a);
// 将 $s 存放在某处使 page2.php 能够找到
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);

// page2.php:
// 为了正常解序列化需要这一行
include("classa.inc");

$s = implode("", @file("store"));
$a = unserialize($s);

// 现在可以用 $a 对象的 show_one() 函数了
$a->show_one();
?>
?>


  如果在用会话并使用了 session_register() 来注册对象,这些对象会在每个 PHP 页面结束时被自动序列化,并在接下来的每个页面中自动解序列化。基本上是说这些对象一旦成为会话的一部分,就能在任何页面中出现。

  强烈建议在所有的页面中都包括这些注册的对象的类的定义,即使并不是在所有的页面中都用到了这些类。如果没有这样做,一个对象被解序列化了但却没有其类的定义,它将失去与之关联的类并成为 stdClass 的一个对象而完全没有任何可用的函数,这样就很没有用处。

  因此如果在以上的例子中 $a 通过运行 session_register("a") 成为了会话的一部分,应该在所有的页面中包含 classa.inc 文件,而不只是page1.php 和 page2.php。

  当然,其实序列化对象其实完全可以应用在很多地方。当然,在PHP 5中对序列化的处理不一样了,我们看一下手册中的说法:

  serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。

  使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

  相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。

  使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
Q:PHP5中this,self, parent 关键字详解
A:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。

PHP5中this,self, parent 关键字详解
PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说的不好,请高手见谅. (阅读本文,需要了解PHP5的面向对象的知识)
  
   首先我们来明白上面三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个关键字分别是用在什么地方呢?我们初步解释一下,this是指向当前对象的指针(我们姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达,呵呵,语文没学好。 -_-#
  
   这么说还不能很了解,那我们就根据实际的例子结合来讲讲。
  
  
   (1) this
  
   1 <?php
   2
   3 class UserName
   4 {
   5 //定义属性
   6 private $name;
   7
   8 //定义构造函数
   9 function __construct( $name )
   10 {
   11 $this->name = $name; //这里已经使用了this指针
   12 }
   13
   14 //析构函数
   15 function __destruct(){}
   16
   17 //打印用户名成员函数
   18 function printName()
   19 {
   20 print( $this->name ); //又使用了this指针
   21 }
   22 }
   23
   24 //实例化对象
   25 $nameObject = new UserName( "heiyeluren" );
   26
   27 //执行打印
   28 $nameObject->printName(); //输出: heiyeluren
   29
   30 //第二次实例化对象
   31 $nameObject2 = new UserName( "PHP5" );
   32
   33 //执行打印
   34 $nameObject2->printName(); //输出:PHP5
   35 ?>
  
   我们看,上面的类分别在11行和20行使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(25行),那么当时this就是指向$nameObject对象,那么执行18行的打印的时候就把print( $this-><name )变成了print( $nameObject->name ),那么当然就输出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),于是就输出了"PHP5"。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。
  
  
  
   (2)self
  
   首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。
  
   1 <?php
   2
   3 class Counter
   4 {
   5 //定义属性,包括一个静态变量
   6 private static $firstCount = 0;
   7 private $lastCount;
   8
   9 //构造函数
   10 function __construct()
   11 {
   12 $this->lastCount = ++selft::$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
   13 }
   14
   15 //打印最次数值
   16 function printLastCount()
   17 {
   18 print( $this->lastCount );
   19 }
   20 }
   21
   22 //实例化对象
   23 $countObject = new Counter();
   24
   25 $countObject->printLastCount(); //输出 1
   26
   27 ?>
  
   我们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值得,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this来引用,可以使用self来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。
  
  
   (3)parent
  
   我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。
  
   1 <?php
   2
   3 //基类
   4 class Animal
   5 {
   6 //基类的属性
   7 public $name; //名字
   8
   9 //基类的构造函数
   10 public function __construct( $name )
   11 {
   12 $this->name = $name;
   13 }
   14 }
   15
   16 //派生类
   17 class Person extends Animal //Person类继承了Animal类
   18 {
   19 public $personSex; //性别
   20 public $personAge; //年龄
   21
   22 //继承类的构造函数
   23 function __construct( $personSex, $personAge )
   24 {
   25 parent::__construct( "heiyeluren" ); //使用parent调用了父类的构造函数
   26 $this->personSex = $personSex;
   27 $this->personAge = $personAge;
   28 }
   29
   30 function printPerson()
   31 {
   32 print( $this->name. " is " .$this->personSex. ",this year " .$this->personAge );
   33 }
   34 }
   35
   36 //实例化Person对象
   37 $personObject = new Person( "male", "21");
   38
   39 //执行打印
   40 $personObject->printPerson(); //输出:heiyeluren is male,this year 21
   41
   42 ?>
  
  
   我们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第25行:parent::__construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用this来调用。
  
  
   总结:
  
   this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。

Q:=>与 ->的区别A:=>是关联数组操作符
      ->是访问对象成员的操作符.
Q:Mysql和网页显示乱码解决办法A:做到数据库编码,网页编码及表的编码一致
Q:mysql_connect和mysqli_connect有什么区别?
A:mysqli是PHP对mysql新特性的一个扩展支持
      mysqli的特性:
      -可以和mysql.dll一样的方式使用
      -支持OO接口,简简单单调用
      -支持MYSQL4。1引入的新特性
      -通过mysqli_init() 等相关函数,可以设置高级连接选项
Q:cookie 和 sessionA:cookie 就是把一些数据存在客户端 session就是将数据存在服务器端  这些东西一般都得在一个页面还没有输出前做这些事情, 一般使用 set_cookies() 就可以开始使用cookie了,同样的 使用session_start()后 ,你就可以自由的操纵你的session了
Q:如何用apache生成伪静态页面
A:首先你使用的空间要支持.htaccess
      然后建一个.htaccess文件
      RewriteEngine on
      RewriteRule k([0-9]+).html$ read.php?tid=$1
      RewriteRule k([0-9]+).html$ read.php?tid=$1&fpage=$2
      RewriteRule t([0-9]+).html$ thread.php?fid=$1
      RewriteRule p([0-9]+).html$ post.php?fid=$1
      RewriteRule p1([0-9]+).html$ post.php?action=vote&fid=$1
      RewriteRule r([0-9]+).html$ rss.php?fid=$1
      RewriteRule rss.html$ rss.php
      RewriteRule down.html$ down.php
      RewriteRule index.html$ index.php
      RewriteRule index_([0-9]+)_([0-9]+).html$ index.php?id=$1&name=$2

      在apache目录的apache/conf 这个文件夹下的httpd.conf文件用记事本打开编辑,找到如下一句:
      #LoadModule rewrite_module modules/mod_rewrite.so
      将前面的#号去掉,变成:
      LoadModule rewrite_module modules/mod_rewrite.so
      然后再在同一文件找到下面一句:
      AllowOverride None
      将其改为:
      AllowOverride All
      然后关闭并保存文件。这样一来,Apache的mod_rewrite的功能就被开启,非常简单。

Q:$this->的用法A:$this 的含义是表示  实例化后的 具体对象!
      我们一般是先声明一个类,然后用这个类去实例化对象!但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法。应该怎么表示呢?

例如:

我声明一个User类!它只含有一个属性 $name;

class User
{
      public $_name;
}

现在,我给User类加个方法。就用getName()方法,输出$name属性的值吧!
复制PHP内容到剪贴板PHP代码:
class User
{
     public $name;

     function getName()
     {
            echo $this->name;
     }
}

//如何使用呢?

$user1 = new User();

$user1->name = '张三';

$user1->getName();        //这里就会输出张三!

$user2 = new User();

$user2->name = '李四';   

$user2->getName();       //这里会输出李四!


怎么理解呢?

我上面创建了两个User对象。分别是 $user1 和  $user2 。

当我调用 $user1->getName()的时候。  上面User类中的代码 echo $this->name ; 就是相当于是  echo $user1->name;

大概就是这么个意思!

其实,你也不要去钻牛角尖。你只要知道那是一个用来表示类内部的属性和方法的代号就好了!越想越糊涂的!


 
Q:move_uploaded_file与copy的区别A:move_uploaded_file与copy的区别就是在于move_uploaded_file会事先检测源文件是否通过php上传过来的,否则不予移动,另外就是move_uploaded_file是移动,即操作成功后原
      文件没了,这个函数是基于安全考虑的,和文件大小没有关系!
Q:list与push的区别是什么?A:array_push作用不是把数组的最后一个元素取出来!
      而是用来追加元素。通常不建议使用该函数~~
      可以用 $array[] = 这种表达式取代~~提高效率。省去了执行函数。list 用的就比较多了,主要用于简单的数组赋值
Q:屏蔽掉phpinfo()的 方法A:在 php.ini 配置文件里面有这个选项
      disable_functions = ; This directive allows you to disable certain
      ; functions for security reasons. It receives
      ; a comma separated list of function names.
      ; This directive is *NOT* affected by whether
      ; Safe Mode is turned on or off.
      改成
      disble_functions = phpinfo
Q:$HTTP_RAW_POST_DATA 和 $_POST的区别
A:基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一样的。但是如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等。
Q:怎么在函数里取得函数外的变量值A:PHP代码:
  <?PHP
  $a="PHP";
  foo();
  Function foo()
  {
   global $a;//删除这里看看是什么结果
   Echo "$a";
  }

Q:PHP程序怎样调用C函数A:一、把 C 函数代码封装成 php 的 extension
      二、把 C 函数代码封装成 动态连接库 供 dl() 函数调用
      三、用调shell的方式调用
Q:转义符号/r/n跟/n有什么区别?A:/n: NUIX系统行末结束符
      /r/n:  Windows系统行末结束符
      /r:     MAC OS系统行末结束符
Q:and和&&的区别
A:主要的不同是优先级不同,&& 比 and 优先级要高
Q:传值和传引用、传地址的区别是什么?
A:传值 
      是把实参的值赋值给行参 
      那么对行参的修改,不会影响实参的值 
  
      传地址 
      是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 
      那么传地址以后,实参和行参都指向同一个对象 
  
      传引用 
      真正的以地址的方式传递参数 
      传递以后,行参和实参都是同一个对象,只是他们名字不同而已 
      对行参的修改将影响实参的值
Q:相对路径与绝对路径
A:举例说吧,
      你在D盘 golden目录下做了一个index.html
     而在该目录下又有demo.gif
     如果你想在index.html中调用它,
     1,相对路径./demo.gif或者demo.gif
     2,绝对路径 c:/golden/golden.gif
     应用到具体的网站开发中,就是
     1,相对路径./或者../   文件名(同一服务器)
     2,绝对路径 http://www.newso.biz/XXX.gif之类的
     基本在同一服务器,或者写程序时都使用相对路径,否则你一换域名,似乎麻烦就来了
Q:构件,组件,框架,中间件之间区别
A:中间件作为一大类系统软件,与操作系统,数据库管理系统并称"三套车",其重要性是不言而语的.
       那什么是中间件?
      我们来看看以下的几种定义:
http://middleware.internet2.edu/ 给出了middleware的一个定义:
Middleware, is a layer of software between the network and the applications. This software provides services such as identification, authentication, authorization, directories, and security. In today's Internet, applications usually have to provide these services themselves, which leads to competing and incompatible standards. By promoting standardization and interoperability, middleware will make advanced network applications much easier to use.
同样,IDC给出的一个定义:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

从这些定义中可以看出:
– 中间件是一类软件,而非一种软件;
– 中间件不仅仅实现互连,还要实现应用之间的互操作;
– 中间件是基于分布式处理的软件,最突出的特点是其网络通信功能。

接着,我们再来看看什么是Web Services?
Web Services就是可以通过web描述、发布、定位和调用的模块化应用。Web Services可以执行任何功能,从简单的请求到复杂的业务过程。一旦Web Services被部署,其他的应用程序或是Web Services就能够发现并且调用这个部署的服务。
Web Services通过简单对象访问协议 (Simple Object Access Protocol,SOAP)来调用。SOAP是一种轻量级的消息协议,它允许用任何语言编写的任何类型的对象在任何平台之上相互通信。SOAP消息采用可扩展标记语言(XML)进行编码,一般通过HTTP进行传输。与其它的分布式计算技术不同,Web Services是松耦合的,而且能够动态地定位其他在internet上提供服务的组件,并且与它们交互。
Web Services使用诸如SOAP消息这样的XML消息,通过一种良好定义的消息交换模式来调用。通过描述调用服务所必需的数据,Web Services描述语言 (WSDL)文档定义了消息交换模式。
一、组件概念
  简而言之,组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。
  组件是对数据和方法的简单封装。C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。
  组件是C++ Builder环境中最令人激动的部分。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。VCL和CLX组件是C++ Builder系统的核心。
二、组件应用
  使用现成的组件来开发应用程序时,组件工作在两种模式下:设计时态和运行时态。
  在设计时态下,组件显示在C++ Builder窗体编辑器下的一个窗体中。设计时态下组件的方法不能被调用,组件不能与最终用户直接进行交互操作,也不需要实现组件的全部功能。
  在运行状态下,组件工作在一个确实已经运行的应用程序中。组件必须正确地将自身表示出来,它需要对方法的调用进行处理并实现与其他组件之间有效的协同工作。
  设计时态下所有的组件在窗体中都是可见的,但在运行时态下不一定可见。如TTable、TQuery和TDataSet在运行时态下就不可见,但他们均完成了重要的功能。
三、组件创建
  创建组件就是自行设计制作出新的组件。
  设计组件是一项繁重的工作。自行开发组件与使用组件进行可视化程序开发存在着极大的不同,要求程序员熟知原有的VCL类库结构,精通面向对象程序设计。
  设计组件是一项艰苦的工作。对于组件的开发者,组件是纯粹的代码。组件的开发不是一个可视化的开发过程,而是用C++或Object Pascal严格编制代码的工作。实际上,创建新组件使我们回到传统开发工具的时代。虽然这是一个复杂的过程,但也是一个一劳永逸的过程。
  创建组件的最大意义在于封装重复的工作,其次是可以扩充现有组件的功能。
  组件创建过程包括设计、开发、调试(就是所谓的3D's)工作,然后是组件的使用。
  组件开发者应该掌握的三项主要内容是:属性、事件和方法。

http://www.vchome.net/dotnet/webservice/webservice15.htm
http://www.csdn.net/develop/read_article.asp?id=15399
模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。

Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。

模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然会出现很多模式。

什么是框架?

框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。

构件(component)是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架(framwork)、软件构架(或体系结构Architectural)、文档、分析件、设计模式(Pattern)等。构件分为构件类和构件实例,通过给出构件类的参数,生成实例,通过实例的组装和控制来构造相应的应用软件,这不仅大大提高了软件开发者的开发效率,也大大提高了软件的质量。
Q:break和continue的区别A:continue  跳出当前循环执行下面的语句
       break  跳出整个循环执行下面的语句
Q:设置session过期时间A:ini_set('session.cache_expire',360);
Q:LINUX下解压缩的ZIP文件不能打开A:请给你接压缩后的文件给予权限
Q:为什么有“<?php”开始,而没有“?>”结束呢?A:?>在脚本最后不是必要的。PHP总是以文件结束作为?>PHP脚本结束。相反,如果在?>后存在有空格,回车等字符。输出时会当作HTML输出,导致header, setcookie, session_start等函数执行错误。所以很多编码规范推荐在PHP脚本的文件最后不写?>。
Q: 页面得不到post ,get 变量怎么办?A:PHP代码:
if (!empty($_GET)) {
    extract($_GET);
} // end if
if (!empty($_POST)) {
    extract($_POST);
   
} // end if
if (!empty($_FILES)) {
    while (list($name, $value) = each($_FILES)) {
        $$name = $value['tmp_name'];
    }
} // end if


Q:如何在提交表单出错时,回退到表单不清空之前输入的数据。A:在session_start()前加上session_cache_limiter('private'); //不清空表单,只在session生效期间

Q:为什么我用运算符进行大数值常规运算和某些小数运算时得不到正确的结果。
A:请用“BC math 高精度数学函数”的相关函数来进行运算。

Q:如何实现txt、mp3等文件的下载,而不是在本地打开?A:利用header的attachment。如:
PHP代码:
header("Content-Type: $mime");
header("Content-Disposition: attachment; filename=/"$file/"");
header("Content-Length: ".filesize($filename));
if(strstr($mime, "text")){
    $file_handle = @fopen("$filename","r");
}else{
    $file_handle = @fopen("$filename","rb");
}
Q:我在调试程序的时候需要输出格式为utf8编码,但又不想写HTML指定,请问用有什么简便的方法。A:
方法一:设定php.ini配置。在调试脚本输出前加上 ini_set('default_charset', 'utf-8');
方法二:利用header函数。在调试脚本输出前加上 header("Content-type: text/html; charset=utf-8");

 
关于PHP操作文件的一些FAQ总结:前言:
PHP中对各类数据库的操作有着支持,对文件的操作也同样有着很丰富的操作方法,很多朋友现在的操作还是基于文件操作
可是有的时候在操作文件的时候还存在不少的困惑和疑点,以下是我在日常编写过程中碰到的以及坛上朋友所碰到的关于文件操
作的一些问题收藏吧。

问:如何新建一个文件?
答:
1、使用fopen("要建立的文件名","参数"),参数可选 w,w+,a,a+
2、使用exec("echo '' > 要建立的文件名");这样是使用系统方式建立这个文件,你还可以使用touch这个linux命令来建立

问:为什么我无法建立文件?
答:
1、如果你使用了fopen建立文件,是否正确的使用了参数
2、系统权限问题,请询问你的WEBMASTER你的FTP目录是否有写的权限
3、FTP权限问题,你要确认你的PHP文件所要写文件所在目录要有写的权限,也就是你的FTP软件登陆后other组要有写这个权限,
如果没有请修改权限后尝试

问:如何将文件读入数组?
答:使用file

问:如何将文件全部读出?
答:
1、使用fread($fp);
2、如果你的PHP版本>=4.3.0的话可以使用file_get_contents();

问:如何判断文件是否存在?
答:使用file_exists();为什么不使用fopen()来判断呢?原因是有时候是因为权限问题导致fopen返回的数据引导我们错误的判断

问:为什么当我读取一个WEB页面的时候出错?
答:
1、可能是你的传递参数错,当读取WEB页面的时候你只可以使用r方式读取页面
2、确保你要读取的WEB页面可以访问

问:我如何才能获得文件的相关属性?
答:PHP提供了一组获得文件属性的方法,例如 filemtime(),fileowner(),filegroup(),filectime(),fileatime()...详细的使用
请参阅手册。

问:PHP打开文件后是否可以象C一样进行文件“游标”的定位呢?
答:可以的,使用fseek();

问:我想在访问文件的时候不允许其他人也访问此文件,怎么办?
答:
1、你可以采用其他方面程序限制用户接入文件操作的页面
2、使用flock();详细的参数以及使用方法请参阅手册

问:如何删除文件内第一行,或指定一行数据?
答:PHP并没有提供这样的操作方法,不过我们可以通过组合使用,以下代码演示我们将删除文件"test.dat"中的第三行数据(test.datw 文件中数据不止三行)
复制PHP内容到剪贴板PHP代码:

<?php
$filename="test.dat";//定义操作文件
$delline=3; //要删除的行数
if(!file_exsits($filename)){
die("指定文件未发现!操作中断!");
}
$farray=file($filename);//读取文件数据到数组中
for($tmpa=0;$Tmpa<count($farray);$Tmpa++){
if(strcmp($Tmpa+1,$delline)==0){
//判断删除的行
continue;
}
//重新整理后的数据
$newfp.=$farray[$Tmpa]."/r/n";
}
$fp=@fopen($filename,"a") or die("写方式打开文件 $filename 失败");//我们以写的方式打开文件
@fputs($fp,$newfp) or die("文件写入失败");
@fclose($fp);
?>


以上代码演示的是删除一行文件,不过你如果仔细的看的话,其实也给你提供了其他的文件操作的相关提醒~

问:当我试图打开一个不存在的文件的时候,我如何不让错误显示出来以避免我的路径泄露!!
答:在你要打开文件的方法前增加@符号用来屏蔽错误,@是PHP提供的错误信息屏蔽的专用符号或您可以在这个要操作的步骤前增加(通常是在页首)error_reporting(0);用来屏蔽页面内所有错误信息的显示一个不推荐的方法就是去修改php.ini(ISP除外)

问:我使用的是虚拟主机,我如何防止其他用户窃取我的数据?
答:建议ISP修改php.ini中的open_basedir进行限制,不推荐的ISP设置是将fopen,file等文件操作加入disable_function中。

问:为什么我用PHP建立文件后我FTP登陆要删除这些文件无法删除??
答:主要是因为PHP建立的文件归属WEB用户组,也就是建立的文件,并非是你FTP用户的!!!这个问题的解决就是,使用PHP程序的chmod,unlink等方式进行处理,建议用户在使用PHP建立文件的时候
记得chmod文件权限,建议为777

问:如何使用文本文件作为数据仓库?有的留言本,论坛之类的都是使用这个的啊!
答:其实这个主要还是使用了file,结合explode进行数据读取与分割的典型范例而已。

问:如何更改文件名?
答:rename();

问:如何删除文件?
答:unlink(); exec("del(rm -vf) filename");注:rm -vf为linux下使用

问:如何清空文件?
答:使用fopen(filename,"w");或exec("echo '' > filename");

原创粉丝点击