PHP error_reporting(E_ALL ^ E_NOTICE)错误报告详细说明
举例说明:
在Windows环境下:原本在php4.3.0中运行正常的程序,在4.3.1中为何多处报错,大体提示为:Notice:Undefined varialbe:变量名称.
例如有如下的代码:
代码如下 | 复制代码 |
if (!$tmp_i) { $tmp_i=10; } |
在4.3.0中运行正常,在4.3.1中运行会提示Notice:Undefined varialbe:tmp_i
问题如下:
1.问题出在哪里?
2.应如何修改这段代码?
3.不改段代码,如何修改php.ini中的设置使原来在4.3.0中的程序在4.3.1的环境下运行正常而不出现这个错误提示.
解决办法:
打开PHP安装目录下的php.ini文件
找到display_errors = On 修改为 display_errors = off
注意:如果你已经把PHP.ini文件复制到windows目录下,那么必须同时把 c:windows/php.ini里的display_errors = On 修改为display_errors = off
二 让脚本错误提示输出为日志文件的方法:
打开PHP安装目录下的php.ini文件
找到log_errors = off 修改为 log_errors = on
找到error_log = filename 修改为 error_log="D:PHPerrlogphp_error.log" (这里的目录和文件名D:PHPerrlogphp_error.log随便你取什么)
注意:如果你已经把PHP.ini文件复制到windows目录下,那么必须同时把 c:windows/php.ini文件.
此外php_error.log至少要有USER的修改和写权限,否则无法输出错误日志.
有关error_reporting()函数:
error_reporting() 设置 PHP 的报错级别并返回当前级别。
; 错误报告是按位的。或者将数字加起来得到想要的错误报告等级。
; E_ALL - 所有的错误和警告
; E_ERROR - 致命性运行时错
; E_WARNING - 运行时警告(非致命性错)
; E_PARSE - 编译时解析错误
; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,也可能是有意的行为造成的。(如:基于未初始化的变量自动初始化为一个空字符串的事实而使用一个未初始化的变量)
; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误
; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)
; E_COMPILE_ERROR - 编译时致命性错
; E_COMPILE_WARNING - 编译时警告(非致命性错)
; E_USER_ERROR - 用户产生的出错消息
; E_USER_WARNING - 用户产生的警告消息
; E_USER_NOTICE - 用户产生的提醒消息
使用方法:
error_reporting(0);//禁用错误报告
error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息
error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息
error_reporting(E_ERROR | E_WARNING | E_PARSE);//显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。error_reporting(E_ALL);//显示所有错误
可否关闭PHP的错误提示?我不希望让别人看到我程序的报错。
问题解答:
由于PHP.ini中的设置是全局性的,我们不能为您单独某个用户直接修改全局配置信息,但您可以通过error_reporting这个php函数来调整您所运行的脚本的错误信息输出,例如:
代码如下 | 复制代码 |
error_reporting(E_ALL^E_NOTICE^E_WARNING); |
可以关闭所有notice 和 warning 级别的错误。
把这个语句放在您脚本的功用包含文件中,通常为config.php 或者conn.php 中就可以控制输出了。
代码如下 | 复制代码 |
<?php //禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); ?> |
例如:
代码如下 | 复制代码 |
<?php |
这里变量 $a 将会在包含文件 b.inc 中生效。但是,在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。例如:
代码如下 | 复制代码 |
<?php function Test() Test(); |
这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且在这个范围内,它并没有被赋值。你可能注意到 PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须申明为global。
global 关键字
首先,一个使用 global 的例子:
Example #1 使用 global
代码如下 | 复制代码 |
<?php function Sum() $b = $a + $b; Sum(); |
以上脚本的输出将是“3”。在函数中申明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:
Example #2 使用 $GLOBALS 替代 global
代码如下 | 复制代码 |
<?php function Sum() Sum(); |
php中异常处理方法总结 有需要的朋友可参考本文章。
当异常被触发时,通常会发生:
在PHP5中添加了类似于其它语言的错误异常处理模块。在 PHP代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的 catch。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常。当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
1、异常类的层级关系:
代码如下 | 复制代码 |
class NotFoundException extends Exception{} |
2、配置未捕捉异常的处理器:
代码如下 | 复制代码 |
function exception_uncaught_handler(Exception $e) { header('Content-type:text/html; charset=utf-8'); if ($e instanceof NotFoundException) exit($e->getMessage()); elseif ($e instanceof DBException) exit($e->getMessage()); else exit($e->getMessage()); } set_exception_handler('exception_uncaught_handler'); |
3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器
代码如下 | 复制代码 |
exception_uncaught_handler()函数处理: $this->resConn = mysql_connect ($CONFIGS['db_host'], $CONFIGS['db_user'], $CONFIGS['db_pwd']); |
4、业务逻辑一瞥:
if (0 != strcmp($curAlbum->interest_id, $it))
throw new NotFoundException('很抱歉,你所访问的相册不存在');
以上就是PHP自定义异常处理器的具体使用方法
实例
代码如下 | 复制代码 |
<?php $email = "someone@example.com"; try catch (customException $e) catch(Exception $e) |
例子解释:
上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常:
1.customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
2.创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
3.执行 "try" 代码块,在第一个条件下,不会抛出异常。
4.由于 e-mail 含有字符串 "example",第二个条件会触发异常。
5."catch" 代码块会捕获异常,并显示恰当的错误消息
如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常。
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
代码如下 | 复制代码 |
<?php |
数据库的设计
设计三张表:投票结果统计表(count_voting),投票人记录表(ip_votes),用户表(user)
投票结果统计表用于统计最后的投票记录,我给它弄了4个字段:被投票项的名称(SelectName),被投票项标签名(LabelName)(起到分类的作用),票数(CountVotes)。
投票人记录表用于登记投票人的ip(IP),地理位置(Location),投票时间(VoteTime),被投票项名称(SelectName)。然后我还给它加一个ID。
用户表主要用于给管理员用的,包含用户名(name)和密码(passwd)。
生成表的sql脚本如下:
代码如下 | 复制代码 |
DROP TABLE IF EXISTS `count_voting`; -- -------------------------------------------------------- -- DROP TABLE IF EXISTS `ip_votes`; -- -- -------------------------------------------------------- -- DROP TABLE IF EXISTS `user`; -- INSERT INTO `user` (`name`, `passwd`) VALUES -- -- |
从脚本中可以看出,我创建了一个触发器,当往ip_votes表中插入数据的时候就给count_voting表中的CountVotes字段加1。还能后出最后一句是设置外部关联字。
框架设计
OperatorDB类用于操作数据库,OperatorVotingDB类用于该系统特定的操作集合。
使用PDO操作数据库,我它简单的封装一下:
代码如下 | 复制代码 |
public function __construct() |
把连接数据库的信息封装进去方便后续的操作。
代码如下 | 复制代码 |
public function __construct() /** /** /** /** /** /** |
PHP文件上传源码分析(RFC1867)有需要了解的朋友可参考一下
而基于HTTP的上传,相对来说易用性和安全性上就比FTP要增强了很多. 可以应用的上传方式有PUT, WEBDAV, 和RFC1867三种, 本文将分析在PHP中,是如何基于RFC1867实现文件上传的.
RFC1867
RCF1867是Form-based File Upload in HTML标准协议, RFC1867标准对HTML做出了两处修改:
1 为input元素的type属性增加了一个file选项。
2 input标记可以具有accept属性,该属性能够指定可被上传的文件类型或文件格式列表。
另外,本标准还定义了一种新的mime类型:multipart/form-data,以及当处理一个带有enctype=”multipart/form-data” 并且/或含有<input type=”file”>的标记的表单时所应该采取的行为。
举例来说,当HTML想让用户能够上传一个或更多的文件时,他可以这么写:
代码如下 | 复制代码 |
<form enctype="multipart/form-data" action="upload.php" method=post> |
这个表单, 大家一定不陌生, 而对于PHP来说, 它自己另外定义了一个默认表单元素MAX_FILE_SIZE, 用户可以通过这个隐藏的表单元素来建议PHP最多只容许上传文件的大小, 比如对于上面的例子, 我们希望用户上传的文件不能大于5000(5k)字节, 那么可以如下写:
代码如下 | 复制代码 |
<form enctype="multipart/form-data" action="upload.php" method=post> |
姑且不说, 这个MAX_FILE_SIZE是多么的不可靠(所以基于浏览器的控制,都是不可靠的), 单纯从实现来讲, 我会慢慢介绍这个MAX_FILE_SIZE是如何起作用的.
当用户选择了一个文件(laruence.txt), 并填写好文件描述(”laruence的个人介绍”), 点击上传后, 发生了什么呢?
表单提交
在用户确定提交以后, 浏览器会发送如下类似格式的数据包到form中action属性指定的页面(在本例中是upload.php):
代码如下 | 复制代码 |
//请求头
|
接下来, 就是服务器, 是如何处理这些数据了.
接受上传
当Web服务器, 此处假设为Apache(另外假设PHP是以module方式安装在Apache上的), 接受到用户的数据时, 首先它根据HTTP请求头, 通过确定MIME TYPE为PHP类型, 然后经过一些过程以后(这部分,可以参看我之前的PHP Life Cycle ppt), 最终会把控制权交给PHP模块.
这个时候, PHP会调用sapi_activate来初始化一个请求, 在这个过程中, 首先判断请求类型, 此时是POST, 从而去调用sapi_read_post_data, 通过Content-type, 找到rfc1867的处理函数rfc1867_post_handler, 从而调用这个handler, 来分析POST来的数据.
关于rfc1867_post_handler这部分的源代码, 可以在mian/rfc1867.c找到, 另外也可以参看我之前的深入理解PHP之文件上传, 其中也列出的源代码.
然后, PHP通过boundary, 对于每一个分段, 都通过检查, 是否同时定义了:
name和filename属性(有名文件上传)
没有定义name定义了filename(无名上传)
定义了name没有定义filename(普通数据),
从而进行不同的处理.
代码如下 | 复制代码 |
if ((cd = php_mime_get_hdr_value(header, "Content-Disposition"))) { while (isspace(*cd)) { while (*cd && (pair = php_ap_getword(&cd, ';'))) while (isspace(*cd)) { if (strchr(pair, '=')) { if (!strcasecmp(key, "name")) {
|
在这个过程中, PHP会去检查普通数据中,是否有MAX_FILE_SIZE.
代码如下 | 复制代码 |
/* Normal form variable, safe to read all data into memory */ if (!strcasecmp(param, "MAX_FILE_SIZE")) { efree(param);
|
有的话, 就会按照它的值来检查文件大小是否超出.
代码如下 | 复制代码 |
if (PG(upload_max_filesize) > 0 && total_bytes > PG(upload_max_filesize)) {
|
通过上面的代码,我们也可以看到, 判断分为俩部, 第一部分是检查PHP默认的上传上限. 第二部分才是检查用户自定义的MAX_FILE_SIZE, 所以表单中定义的MAX_FILE_SIZE并不能超过PHP中设置的最大上传文件大小.
通过对name和filename的判断, 如果是文件上传, 会根据php的设置, 在文件上传目录中创建一个随机名字的临时文件:
代码如下 | 复制代码 |
if (!skip_upload) {
|
返回文件句柄, 和临时随机文件名.
之后, 还会有一些验证,比如文件名合法, name合法等.
如果这些验证都通过, 那么就把内容读入, 写入到这个临时文件中.
.....
代码如下 | 复制代码 |
else if (blen > 0) {
|
当循环读入完成后, 关闭临时文件句柄. 记录临时变量名:
代码如下 | 复制代码 |
zend_hash_add(SG(rfc1867_uploaded_files), temp_filename,
|
并且生成FILE变量, 这个时候, 如果是有名上传, 那么就会设置:
代码如下 | 复制代码 |
$_FILES['userfile'] //name="userfile" |
如果是无名上传, 则会使用tmp_name来设置:
代码如下 | 复制代码 |
$_FILES['tmp_name'] //无名上传 |
最终交给用户编写的upload.php处理.
这时在upload.php中, 用户就可以通过move_uploaded_file来操作刚才生成的文件了
相关文章
Ecshop提示Only variables should be passed by reference in错误
在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25- 409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
- 414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
- http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
- 401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
- http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
- 411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
- Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
- 403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
- 403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
- 在程序员中,尤其是go新手,经常听到的一个讨论话题是:如何处理错误,这篇文章主要给大家介绍了关于Go应用中优雅处理Error的一些相关技巧,需要的朋友可以参考下...2021-09-08
- 412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
- 相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
- HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
- 407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
- 410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
- 每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
PHP Fatal error: Cannot use object of type stdClass as array in错误
下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。 普通的数组出现如下错误 代码...2016-11-25- 自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
- 这篇文章主要介绍了C#新手常犯的错误汇总,对于经验丰富的C#程序员同样具有很好的参考借鉴价值,需要的朋友可以参考下...2020-06-25