首页 > 编程技术 > php

php程序页面空白问题排查方法详解

发布时间:2016-11-25 14:58

很多初学者会发现在执行php时会发现页面什么出没有输出了,是一个空白的页面,出现这种问题是程序错误所导致了,那么我们要如何来找出程序的错误呢?下面一聚教程小编来给大家介绍一下吧。

原因分析

如果你程序有问题而我们执行时没有提醒错误,那么有几种可能

1.php.ini中错误提醒功能关闭,我们只要开启即可

找到display_errors = On 修改为 display_errors = off

2.在php程序相关页面也加了关闭错误报错功能,我们去掉相关代码即可

ini_set("display_errors", "On");

当然如果你没有权限来做这些操作我们可以使用echo 排查法来解决

 代码如下 复制代码
<?php
$action = $_GET['id'];
if($action == '')
$action = 1;
if($action == 1) {
echo("/$action's value is 1");
} else if($action == 2) {
echo("/$action's value is 2");
}
?>



如上图所示我们可以利用条件来判断当前所在位置 ,然后 一步步排查导致页面空白问题。

在php中static const define三个变量都是可以叫做静态表情了,意思是定义好的就不能再变了,但是他们三个是针对不同的域名,下面我来给各位介绍一下它们三个的区别吧。

const

用来定义那些在运行时不能被改变的常数值。一旦定义且不能改变其值,假如在程序中改变了它的值,那么会出现错误。

 代码如下 复制代码

<?php
 calss Math{
 const pi=3.14159;
}
echo Math::pi;
?>

前面没有美元符号($),可以在不需要初始化该类的情况下实用。常量值必须是一个常量表达式。const定义的变量,在子类中可以被覆盖。
在类的内部定义,php5.3以后也可以在类的外部定义。
const不可以用表达式。

define()

可以用 define() 函数来定义常量。一个常量一旦被定义,就不能再改变或者取消定义。
常量只能包含标量数据(boolean,integer,float 和 string)。
可以简单的通过指定其名字来取得常量的值,不要在常量前面加上 $ 符号。
define定义全局常量,在任何地方都可以访问。
define不能在类中定义而const可以。
define可以采用任何表达式。如define('BIT_5', 1 << 5);

 代码如下 复制代码

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
?>


define()与const()两者之间的区别:

内存空间的分配上。define进行宏定义的时候,不会分配内存空间,编译时会在main函数里进行替换,只是单纯的替换,不会进行任何检查,比如类型,语句结构等,即宏定义常量只是纯粹的置放关系,如#define null 0;编译器在遇到null时总是用0代替null它没有数据类型(还有疑问请找C语言书籍看预处理部分或者看MSDN.而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查,所以const与define之间的区别在于const定义常量排除了程序之间的不安全性.
define定义全局常量,在任何地方都可以访问
const用于类成员变量定义,只能用类名访问不能更改要是初学这样显理解着就行别太钻牛角尖就行

static

php中的变量作用范围的另一个重要特性就是静态变量(static 变量)。
静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。
static关键字在类中,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例。
static的成员,必须使用self来访问。

 代码如下 复制代码

class Counter
{
public static $count = 0;//定义一个静态属性
//定义一个静态的方法
static function getCount()
{
return self::$count;
}

echo Counter::getCount();
Counter::count;

最后补充一个例子:

 

 代码如下 复制代码

<?php


echo HAHA;

class test {
    public $name2 = 'name2';
    static $name = 'name';
    const CHARSET = "中国";
    public function say_hello() {
        echo self :: CHARSET;
    }

    public static function set_name() {
        echo self :: $name;
    }

    public static function set_name2() {
        self::set_name();
    }
  
    public static function set_name3() {
        echo $this->name;
        $this->set_name();
    }
  
}
$const1 = new test();

// 1
$const1->say_hello();

// 2
echo "<br />";
echo test :: CHARSET;

// 3
echo "<br />";
echo $const1->name;

// 4
echo "<br />";
echo $const1->set_name();

// 5
echo "<br />";
echo $const1->set_name2();

// 6
echo "<br />";
echo test::CHARSET;

// 7
echo "<br />";
echo $const1->CHARSET;
?>

CURL函数需我们打开CURL模块才可以支持了,这个在php.ini默认安装时是不支持CURL函数的,如果要使用curl函数我们需开启CURL模块哦。

如我先做个测试我们php.ini

代码

 代码如下 复制代码

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话,就会直接输出
$result=curl_exec($ch);
curl_close($ch);

错误提示


Fatal error: Call to undefined function curl_init() in E:/www/test.php on line 4

这个是告诉我们函数未定义了,这是php内置函数怎么可能未定义了呢,我们查看php.ini文件,发现如下状态

;extension=php_curl.dll

这个是未开启状态了,我们先去掉前面的;号了

extension=php_curl.dll

再重启apache然后再运行代码效果如下

//成功访问了www.111cn.net网站了

总结,其实使用curl是非常的简单的我们只要在php.ini中把extension=php_curl.dll前面的;号去掉即可。

const是用于类成员常量的定义了,定义之后不可改,而define我们定义的是全局常量了, 这样我们在其它地方访问但不能改变了,具体还有一些细节我们下面给各位列出来吧

注意:define不能定义在类中,而const必须定义在类中,并且const必须通过类名::变量名来进行访问


1、const用于类成员变量定义,一旦定义且不能改变其值。define定义全局常量,在任何地方都可以访问。
2、define不能在类中定义而const可以。
3、const不能在条件语句中定义常量

4、const采用一个普通的常量名称,define可以采用表达式作为名称。
5、const只能接受静态的标量,而define可以采用任何表达式。
6、const 总是大小写敏感,然而define()可以通过第三个参数来定义大小写不敏感的常量
7.使用const简单易读,它本身是一个语言结构,而define是一个方法,用const定义在编译时比define快很多。

define是定义常量的,如果在类中定义常量呢?当然不能用define,而用const,如下例:

 代码如下 复制代码

<?php
//在类外面通常这样定义常量
define("PHP","111cn.net");
class MyClass
{
    //常量的值将始终保持不变。在定义和使用常量的时候不需要使用$符号
    const constant = 'constant value';
 
    function showConstant() {
        echo  self::constant . "<br>";
    }
}
 
echo MyClass::constant . "<br>";
 
$classname = "MyClass";
echo $classname::constant . "<br>"; // PHP 5.3.0之后
 
$class = new MyClass();
$class->showConstant();
echo $class::constant."<br>"; // PHP 5.3.0之后
//print_r(get_defined_constants());  //可以用get_defined_constants()获取所有定义的常量
?>


一般是define在类外定义常量,const在类内定义常量,并且const必须通过类名::变量名来进行访问。但是php5.3以上支持类外通过const定义常量,看如下,这样是ok的:

 代码如下 复制代码


<?php
    //@blog<http://www.111cn.net>
    const a = "abcdef";
    echo a;
?>

关于常量的基础知识,这里不说了,除了以上,define和const的其它区别(摘自网络):

1.const不能再条件语句中定义常量,但是define是可以的,如下:

 

 代码如下 复制代码
<?php
    if(1){
        const a = 'java';
    }
    echo a;  //必错
?>

2.const采用一个普通的常量名称,define可以采用表达式作为名称

 代码如下 复制代码


<?php
const  FOO = 'PHP';
 
for ($i = 0; $i < 32; ++$i) {
    define('PHP_' . $i, 1 << $i);
}
?>

3.const只能接受静态的标量,而define可以采用任何表达式。

 

 代码如下 复制代码
<?php
const PHP = 1 << 5;    // 错误
define('PHP', 1 << 5); // 正确
?>

4.const本身就是一个语言结构。而define是一个函数。所以使用const速度要快的多。

两个共同步:两者都是不能进行重新赋值。

一个合格的程序员在实现数据入库中时我们都会有一些非常严密的过滤与数据规则了,像我们文件上传时在前段要判断用户是否选择上传文件同时在后台也可判断是否有上传的文件了,下面我们就一起来看看相关例子吧。

如下html代码如

 代码如下 复制代码

<formaction="?"method="post"enctype='multipart/form-data'>
文件上传:<inputtype="file"name="file"id="file"/>
<inputtype="submit"id="send"value="提交"/>
</form>


我们最常用的在前端简单的进行判断

 代码如下 复制代码

<script>
varsend=document.getElementById("send");
send.onclick=function(){
varfile=document.getElementById("file").value;
if(file.length<1){
alert('请选择图片');
returnfalse;
}
}
</script>

如果要做真正的安全我们需要在后台进入判断处理

 代码如下 复制代码

<?php
//判断pic文件框是否已经选择文件
if(!empty($_FILES['file']['tmp_name'])){
echo'已选择文件';
}else{
echo'请选择文件';
}
//PS:$_FILES后面的['tmp_name']一定不要忘写,它表示是一个临时的意思
?>

安例分析

js判断是比较笼统了我们只是使用了file=document.getElementById("file").value;来判断file有没有值或不为空了,这样只要输入一个数字就可以直接提交了,所以我们需要进入如上传文件的用户名限制

 代码如下 复制代码

functionCheckWorkFile()
{
varobj=document.getElementById('fuMain');
if(obj.value=='')
{
alert('请选择要上传的作业书文件');
returnfalse;
}
varstuff=obj.value.match(/^(.*)(\.)(.{1,8})$/)[3];
if(stuff!='doc')
{
alert('文件类型不正确,请选择.doc文件');
returnfalse;
}
returntrue;
}

对于php处理我们也只使用了if(!empty($_FILES['file']['tmp_name'])){来判断不为空了,其实这样也是不合理的

如我们可以如此处理

 代码如下 复制代码

function file_type($filename)
{
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
    $fileType = '';
    switch ($typeCode)
    {
        case 7790:
            $fileType = 'exe';
            break;
        case 7784:
            $fileType = 'midi';
            break;
        case 8297:
            $fileType = 'rar';
            break;       
  case 8075:
            $fileType = 'zip';
            break;
        case 255216:
            $fileType = 'jpg';
            break;
        case 7173:
            $fileType = 'gif';
            break;
        case 6677:
            $fileType = 'bmp';
            break;
        case 13780:
            $fileType = 'png';
            break;
        default:
            $fileType = 'unknown: '.$typeCode;
    }

 //Fix
 if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
 if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';

    return $fileType;
}

echo file_type('start.php');   // 6063 or 6033

这样我们可以限制上传文件类型的同时也给程序做了一个安全处理了哦

标签:[!--infotagslink--]

您可能感兴趣的文章: