PHP显示出错提示的三种方法 (PHP心得)
发布于 2008-05-16 20:04 阅读:25525 评论:1 标签: php 出错提示 方法

  PHP在页面上显示出错消息并让用户看见是开发人员怎么样也不愿意面对的,但是谁都不想在一台没有配置成显示出错消息的服务器上用PHP开发代码。开发时显示PHP的错误消息对开发人员来说是个明智的选择,所谓工具是使人方便的,就是如此。

  下面来说说显示PHP错误提示消息的三个方法。

  一:php.ini配置

  php.ini配置中与此相关的有两个配置变量。下面是这两个变量及其默认值:

以下是引用片段:
display_errors = Off
error_reporting = E_ALL & ~E_NOTICE

  display_errors 变量的目的很明显 ―― 它告诉PHP是否显示错误。默认值是 Off。现在我们的目的是显示错误提示,那么:

以下是引用片段:
display_errors = On

  E_ALL,这个设置会显示从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细,因为它连变量未初始化也显示提示,而这一点正是PHP“高级”的一个特征。幸好,error_reporting的默认值是“E_ALL & ~E_NOTICE”,这样就只看到错误和不良编码了,对程序无不利的提示则不会显示。

  修改php.ini后需要重新启动Apache,这样才可以在apache中生效,当然你如果只在命令行下测试程序,是不需要这一步的。

  二:Apache的httpd.conf和.htaccess配置

  如果要在.htaccess 文件中的指令来修改 PHP 的配置设定。需要有“AllowOverride Options”或“AllowOverride All”权限才可以。 请参见:AllowOverride 指令http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html#allowoverride

  AllowOverride指令确定允许存在于.htaccess文件中的指令类型,它仅在不包含正则表达式的配置段中才是有效的。

  如果此指令被设置为None ,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。

  当此指令设置为 All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。

  例如以下指令只允许在.htaccess中使用AuthConfig和Indexes组的指令:

以下是引用片段:
AllowOverride AuthConfig Indexes

  .htaccess里的设置和httpd.conf是一样的。

  要在做在httpd.conf实现这一功能,需要把下列各行添加到 httpd.conf,以覆盖php.ini文件做出的配置:

以下是引用片段:
php_flag  display_errors        on
php_value error_reporting       2039

  这会覆盖在 php.ini 文件中为 display_errors 已经设置的标志,以及 error_reporting 的值。值 2039 代表 E_ALL & ~E_NOTICE。如果愿意采用 E_ALL,请把值设为 2047。同样,还是要重启 Apache。

  httpd.conf对php宏定义设置的具体用法可以参见:http://www.php.net/manual/zh/configuration.changes.php

  你可以注意到,上面我们没有使用“E_ALL & ~E_NOTICE”这样的宏定义。这是因为这些宏定义都是php的变量,apache是不认识的,所以我们使用与其等同的值来设置。相关的信息和说明请见:http://www.php.net/manual/zh/ref.errorfunc.php#errorfunc.constants

  下面给出一个简单的对应值:

以下是引用片段:
值 宏定义
1 E_ERROR 
2 E_WARNING 
4 E_PARSE 
8 E_NOTICE 
16 E_CORE_ERROR 
32 E_CORE_WARNING 
64 E_COMPILE_ERROR 
128 E_COMPILE_WARNING 
256 E_USER_ERROR 
512 E_USER_WARNING 
1024 E_USER_NOTICE 
6143 E_ALL 
2048 E_STRICT 
4096 E_RECOVERABLE_ERROR

  三:程序中改变

  以上所介绍的都是配置文件里面做设置,如果你没有这个权限,或者只想测试一个程序,那么你可以使用两个函数来做到这一点。

  它们分别是:

以下是引用片段:
string ini_set ( string $varname , string $newvalue )

int error_reporting ([ int $level ] )

  两个函数大同小异,error_reporting()看上去是ini_set()的error_reporting功能版。事实上我认为也的确如此。

  在ini_set()中你可以设置display_errors和error_reporting的值,而在error_reporting()中你只能设置error_reporting的值,也就是说,如果服务器默认不显示错误提示,你在error_reporting()中怎么变换都是不管用的。两个函数的参数都可以参见上面提到的数字--宏定义对应值。

  需要注意,以上两个函数的适用用时间为该函数起,一直到程序结束。它们不会影响到其他的程序。

  最后:关于PHP的宏定义

  最后,仍需要说明一点:无论httpd.conf还是ini_set()所设置的宏定义并不是无限的,更多的宏定义值请参看手册中的“php.ini 配置选项列表”:http://www.php.net/manual/zh/ini.php

  在里面列表中有一列为“可修改范围”,里面的值为PHP_INI_* ,所以在使用时需要看清宏定义的可修改范围。在列表的末尾,手册中有提示:

以下是引用片段:
PHP_INI_* 常量的定义
常量 值 含义
PHP_INI_USER 1 配置选项可在用户的 PHP 脚本或 Windows 注册表中设置
PHP_INI_PERDIR 2 配置选项可在 php.ini, .htaccess 或 httpd.conf 中设置
PHP_INI_SYSTEM 4 配置选项可在 php.ini or httpd.conf 中设置
PHP_INI_ALL 7 配置选项可在各处设置

  本文参考资料:

以下是引用片段:

PHP 程序员的调试技术
http://www.ibm.com/developerworks/cn/opensource/os-debug/

AllowOverride 指令
http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html#allowoverride

怎样修改配置设定
http://www.php.net/manual/zh/configuration.changes.php

php.ini 配置选项
http://www.php.net/manual/zh/ini.php

运行时配置
http://www.php.net/manual/zh/ref.errorfunc.php#ini.error-reporting

ini_set()
http://www.php.net/manual/zh/function.ini-set.php

error_reporting()
http://www.php.net/manual/zh/function.error-reporting.php

display_errors
http://www.php.net/manual/zh/ref.errorfunc.php#ini.display-errors

预定义常量
http://www.php.net/manual/zh/ref.errorfunc.php#errorfunc.constants

展开全文  
收起全文  
查看mysql版本的四种方法 (MySQL学习)
发布于 2008-01-22 15:54 阅读:189569 评论:4 标签: mysql 版本 方法
    1:在终端下:mysql -V。

以下是代码片段:

[shengting@login ~]$ mysql -V
mysql  Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)

    2:在mysql中:mysql> status;

以下是代码片段:

mysql> status;
--------------
mysql  Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)

Connection id:          416
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         3.23.56-log
Protocol version:       10
Connection:             Localhost via UNIX socket
Client characterset:    latin1
Server characterset:    latin1
UNIX socket:            /tmp/mysql_3311.sock
Uptime:                 62 days 21 hours 21 min 57 sec

Threads: 1  Questions: 584402560  Slow queries: 424  Opens: 59664208  Flush tables: 1  Open tables: 64 Queries per second avg: 107.551

    3:在help里面查找

以下是代码片段:

[shengting@login ~]$ mysql --help | grep Distrib
mysql  Ver 14.7 Distrib 4.1.10a, for redhat-linux-gnu (i686)

    4:使用mysql的函数

以下是代码片段:

mysql> select version();
+-------------+
| version()   |
+-------------+
| 3.23.56-log |
+-------------+
1 row in set (0.00 sec)

 

展开全文  
收起全文  
修改符号链接的属主的方法 (Linux/Unix)
发布于 2008-01-15 18:49 阅读:141298 评论:0 标签: Linux 方法 链接

    如下,检查为FreeBSD 4.8p-STABLE

以下是引用片段:
autoinstall# uname -a
FreeBSD autoinstall 4.8p-STABLE FreeBSD 4.8p-STABLE #0: Sun Nov  9 04:39:25 GMT 2003     root@dell1550.sina.com.cn:/usr/obj/usr/src/sys/SINA  i386

    我当前为root

以下是引用片段:
autoinstall# whoami
root

    建立一个文件

以下是引用片段:
autoinstall# touch a

autoinstall# ls -l
-rw-r--r--  1 root       wheel    0 Jan 15 17:38 a

    建立一个软连接:

以下是引用片段:
autoinstall# ln -s a b
autoinstall#
autoinstall# ls -l
-rw-r--r--  1 root       wheel    0 Jan 15 17:38 a
lrwxr-xr-x  1 root       wheel    1 Jan 15 17:38 b -> a

    现在我想修改b的属主:

以下是引用片段:
autoinstall# chown yayu b
autoinstall#
autoinstall# ls -l
-rw-r--r--  1 root       wheel    0 Jan 15 17:38 a
lrwxr-xr-x  1 root       wheel    1 Jan 15 17:38 b -> a

    很遗憾,失败了!确定yayu这个用户是存在的。于是上chinaunix问了一下,嗯,感谢ports 的回答。教训:学会man的好习惯!

    解决如下:加个“-h”参数

    在linux下man结果为:

以下是引用片段:
       -h, --no-dereference
              affect  each  symbolic  link  instead  of any referenced file (useful only on systems that can change the ownership of a symlink)

    在freebsd下man为:

以下是引用片段:
     -h      If the file is a symbolic link, change the user ID and/or the
             group ID of the link itself.


展开全文  
收起全文  
segmentation fault原因 (C/C++学习)
发布于 2007-10-31 19:18 阅读:37676 评论:0 标签: fault segmentation 方法

  PHP总是和linux/unix、C/C++分不开的,郁闷。继续C/C++的学习吧。

  今天起,要向学习PHP和MySQL一样,把遇见的问题都记录下来,以提醒自己。

  “segmentation fault”是今天遇见的错误。查找资料,说是一些细节错误:
    1。 针没有赋值;
    2。 量赋值类型有错误。
    3。 最主要的错误就是声明了指针,但是没有初始化 ,结果再后来的时候进行间接引用 ,就出现问题了。

  同一个错误的提示总是有多个造成错误的情况的可能。printf输出时,类型有错误便会有这个问题。

       比如:

以下是代码片段:
char *val;
val = (char *)malloc(valsize + 1);
memset(val, 69, valsize);
val[valsize] = '\0';
printf("After memset : %s \n", *val);

  这时便会提示“segmentation fault”了。原因呢,就是多写了一“*”。改成下面的即可。

以下是代码片段:
printf("After memset : %s \n", val);

      参考的资料请看: 程序运行总是提示 segmentation fault (core dumped)是什么错啊?

  一篇更好的文章: 可恶的"Segmentation faults"之初级总结篇

展开全文  
收起全文  
浅谈PHP生成静态页的两种方法 (PHP心得)
发布于 2006-12-27 13:31 阅读:12512 评论:5 标签: php 方法 静态

最近作的一个项目中用到了两种用PHP生成静态页面的方法,回想起当初自己还不知道如何生成静态页面的迷惘,以及看不懂高手写的文章的痛苦,觉得自己有必要站出来为还不知道如何生成静态页的phper写一个通俗点文章,以帮助他们尽快掌握这个好东西。

在我之前所见的文章中要不是用代码堆砌空间就是用高手与高手交流用的语言让新人望而生却。因此本文尽量把整体思路说得详尽点。

两种方法简单说明如下:
1. 使用文件函数得到静态页面的模板字符串,然后用str_replace函数将需要替换的东西替换了再写入到新的文件中。
2. 利用PHP的输出控制函数(Output Control)得到静态页面字符串,再写入到新的文件中。

下面开始详细的说明。

一. 利用模板生成

什么是模板?如果大家使用过Dreamwerver中的“另存为模板”就应该知道模板是用来统一风格的东西。它只让你修改页面的某一部分,当然这“某一部分”是由你来确定的。本文在这说的模板也就是这个意思。(此外,PHP模板技术还包括phplib、smarty等等,这不是本文所说内容了)

把模板的概念结合本文再说得具体一点就是:美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种代码是Dreamwerver为了方便自己设计而弄的标识),把这个模板中我们需要改变的地方用一个与HTML可以区分的字符代替,如“{title}”、“[title]”。在生成静态页面的时候只需要把数据和这些字符串替换即可。这就是模板的含义了。

下面来说一下具体的实现思路:做一个模板

展开全文  
收起全文  
关于注册表被禁用和文件夹选项被隐藏的解决方法 (扩展学习)
发布于 2006-07-15 09:24 阅读:19662 评论:10 标签: Windows 方法 文件 隐藏 注册表

最近发现一个病毒,其现象是把注册表给禁用,并且把“文件夹选项”给隐藏掉了,其结果可想而知,对于有许多隐藏文件和文件夹的人将带来很多的麻烦。

根据网上的一些帮助,下面写出解决方法:
1.开始-运行-gpedit.msc打开“组策略”,用户配置→管理模板→系统,双击右边窗口中的“阻止访问注册表编辑工具”-选择“已禁用”-确定后退出“组策略”

2.开始-运行-regedit
打开注册表编辑器,HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Policies\Explorer看右边窗口中是否有NoFolderOptions这个键,如果有把值改为0 如果没有就新建一个DWORD键,值为0。退出注册表编辑器.

现在再看看文件夹选项是不是回来了。

展开全文  
收起全文