当前位置: 首页 > 工具软件 > PHP AMP > 使用案例 >

PHP Q&A(转载)

苗承
2023-12-01

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的值?            (oujianhui)
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
EOD
EOD的用法和功效 
A:就是比单引号和双引号好些,能包含换行。EOD可以改成其他字符。

单引号,双引号,反引号的区别
Q: PHP中单引号,双引号,反引号的区别不太清楚,能解释一下么?
A: PHP单引号('),双引号("")反引号(`)都能引用字串。单引号中变量不被转义,双引号转义变量,而反引号中变量转义作为shell命令被执行。
如:
复制PHP内容到剪贴板
PHP代码:
$myphp = 'dir d:';
echo '$myphp';
echo "<br />";
echo "$myphp";
echo "<br />";
echo `$myphp`;

注意:在双引号里的变量最好用{}包围以免产生歧义,上例中最好写成echo "{$myphp}";


三个执行效果如下:
复制内容到剪贴板
代码:
$myphp
复制内容到剪贴板
代码:
dir d:
复制内容到剪贴板
代码:
驱动器 D 中的卷没有标签。 卷的序列号是 567C-C601 D:/www/leo 的目录 2008-03-07 10:10
. 2008-03-07 10:10
.. 2008-03-04 15:43 7,267 Access.rar 2008-03-06 15:12
bbs 2008-02-26 17:02 229 next.php 2008-03-07 10:23 260 Noname1.php 2008-02-27 08:10 290 park.php 2008-03-04 15:23 1,284 pdomysql.php 2008-03-04 09:33 1,367 step.php 2008-03-04 15:19 176,128 test.mdb 7 个文件 186,825 字节 3 个目录 138,948,988,928 可用字节

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套件可以实现傻瓜化的安装,直接可以建成服务器环境。不妨先拿来用了,以求快速入门,等有一定基础再试着去配置服务器环境。APM套件评测见:http://www.phpchina.com/bbs/thread-52690-1-1.html

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:页面之间无法传递变量
A:get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET[''],$_POST[''],$_SESSION['']来得到。
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的值?            (oujianhui)
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套件可以实现傻瓜化的安装,直接可以建成服务器环境。不妨先拿来用了,以求快速入门,等有一定基础再试着去配置服务器环境。APM套件评测见:http://www.phpchina.com/bbs/thread-52690-1-1.html

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:页面之间无法传递变量
A:get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET[''],$_POST[''],$_SESSION['']来得到。

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 -- 从文件指针中读取一行。
 

 类似资料: