-
PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像Mysql常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。
不同的扩展提供基本相近的操作方法,不同的是可能具备一些新特性,以及操作性能可能会有所不同。
mysql扩展进行数据库连接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
mysqli扩展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
PDO扩展
$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'dbuser'; $password = 'dbpass'; $dbh = new PDO($dsn, $user, $password);
查看全部 -
PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,Db2,Oracle,PostgreSQL,Access等,这些数据库PHP都能够安装扩展来支持,一般情况下常说的LAMP架构指的是:Linux、Apache、Mysql、PHP,因此Mysql数据库在PHP中的应用非常广泛,我们会在本章中简单的了解Mysql的操作方法。
查看全部 -
在异常被捕获之后,我们可以通过异常处理对象获取其中的异常信息,前面我们已经了解捕获方式,以及获取基本的错误信息。
在实际应用中,我们通常会获取足够多的异常信息,然后写入到错误日志中。
通过我们需要将报错的文件名、行号、错误信息、异常追踪信息等记录到日志中,以便调试与修复问题。
try {
throw new Exception('wrong');
} catch(Exception $ex) {
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '异常行号:'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//将异常信息记录到日志中
PHP异常处理之 file_put_contents('error.log', $msg);
}
查看全部 -
在了解了异常处理的基本原理之后,我们可以通过try catch来捕获异常,我们将执行的代码放在try代码块中,一旦其中的代码抛出异常,就能在catch中捕获。
这里我们只是通过案例来了解try catch的机制以及异常捕获的方法,在实际应用中,不会轻易的抛出异常,只有在极端情况或者非常重要的情况下,才会抛出异常,抛出异常,可以保障程序的正确性与安全,避免导致不可预知的bug。
一般的异常处理流程代码为:
try { throw new Exception('wrong'); } catch(Exception $ex) { echo 'Error:'.$ex->getMessage().'<br>'; echo $ex->getTraceAsString().'<br>'; } echo '异常处理后,继续执行其他代码';
查看全部 -
PHP具有很多异常处理类,其中Exception是所有异常处理的基类。
Exception具有几个基本属性与方法,其中包括了:
message 异常消息内容
code 异常代码
file 抛出异常的文件名
line 抛出异常在该文件的行数其中常用的方法有:
getTrace 获取异常追踪信息
getTraceAsString 获取异常追踪信息的字符串
getMessage 获取出错信息如果必要的话,可以通过继承Exception类来建立自定义的异常处理类。
//自定义的异常类,继承了PHP的异常基类Exception class MyException extends Exception { function getInfo() { return '自定义错误信息'; } } try { //使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。 throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch" } catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象 echo $e->getInfo();//获取自定义的异常信息 echo $e->getMessage();//获取继承自基类的getMessage信息 }
查看全部 -
从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。
既然抛出异常会中断程序执行,那么为什么还需要使用异常处理?
异常抛出被用于在遇到未知错误,或者不符合预先设定的条件时,通知客户程序,以便进行其他相关处理,不至于使程序直接报错中断。
当代码中使用了try catch的时候,抛出的异常会在catch中捕获,否则会直接中断。
1、基本语法
try{
//可能出现错误或异常的代码
//catch表示捕获,Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
2、处理处理程序应当包括:
Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。//创建可抛出一个异常的函数 function checkNum($number){ if($number>1){ throw new Exception("异常提示-数字必须小于等于1"); } return true; } //在 "try" 代码块中触发异常 try{ checkNum(2); //如果异常被抛出,那么下面一行代码将不会被输出 echo '如果能看到这个提示,说明你的数字小于等于1'; }catch(Exception $e){ //捕获异常 echo '捕获异常: ' .$e->getMessage(); }
上面代码将获得类似这样一个错误:
捕获异常:: 异常提示-数字必须小于等于1
例子解释:
上面的代码抛出了一个异常,并捕获了它:
创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
在 "try" 代码块中调用 checkNum() 函数。
checkNum() 函数中的异常被抛出
"catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息查看全部 -
跟Unix系统命令类似,PHP使用unlink函数进行文件删除。
unlink($filename);
删除文件夹使用rmdir函数,文件夹必须为空,如果不为空或者没有权限则会提示失败。
rmdir($dir);
如果文件夹中存在文件,可以先循环删除目录中的所有文件,然后再删除该目录,循环删除可以使用glob函数遍历所有文件。
foreach (glob("*") as $filename) { unlink($filename); }
查看全部 -
与读取文件对应,PHP写文件也具有两种方式,最简单的方式是采用file_put_contents。
$filename = './test.txt'; $data = 'test'; file_put_contents($filename, $data);
上例中,$data参数可以是一个一维数组,当$data是数组的时候,会自动的将数组连接起来,相当于
$data=implode('', $data);
同样的,PHP也支持类似C语言风格的操作方式,采用fwrite进行文件写入。
$fp = fopen('./test.txt', 'w'); fwrite($fp, 'hello'); fwrite($fp, 'world'); fclose($fp);
查看全部 -
通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。
$filename = '/data/webroot/usercode/resource/test.txt'; $size = filesize($filename);
如果要转换文件大小的单位,可以自己定义函数来实现。
function getsize($size, $format = 'kb') { $p = 0; if ($format == 'kb') { $p = 1; } elseif ($format == 'mb') { $p = 2; } elseif ($format == 'gb') { $p = 3; } $size /= pow(1024, $p); return number_format($size, 3); } $filename = '/data/webroot/usercode/code/resource/test.txt'; $size = filesize($filename); $size = getsize($size, 'kb'); //进行单位转换echo $size.'kb';
值得注意的是,没法通过简单的函数来取得目录的大小,目录的大小是该目录下所有子目录以及文件大小的总和,因此需要通过递归的方法来循环计算目录的大小。
查看全部 -
文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。
fileowner:获得文件的所有者 filectime:获取文件的创建时间 filemtime:获取文件的修改时间 fileatime:获取文件的访问时间
其中最常用的是文件的修改时间,通过文件的修改时间,可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。
$mtime = filemtime($filename); echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));
查看全部 -
一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个is_file与file_exists.
$filename = './test.txt'; if (file_exists($filename)) { echo file_get_contents($filename); }
如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。
$filename = './test.txt'; if (is_file($filename)) { echo file_get_contents($filename); }
更加精确的可以使用is_readable与is_writeable在文件是否存在的基础上,判断文件是否可读与可写。
$filename = './test.txt'; if (is_writeable($filename)) { file_put_contents($filename, 'test'); } if (is_readable($filename)) { echo file_get_contents($filename); }
PHP的file_exists = is_dir + is_file。
* 如果要判断目录是否存在,请优先考虑函数 is_dir(directory)
* 如果要判断文件是否存在,请优先考虑函数 is_file(filepath)查看全部 -
PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中。
$content = file_get_contents('./test.txt');
file_get_contents也可以通过参数控制读取内容的开始点以及长度。
$content = file_get_contents('./test.txt', null, null, 100, 500);
PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。
$fp = fopen('./text.txt', 'rb'); while(!feof($fp)) { echo fgets($fp); //读取一行 } fclose($fp);
$fp = fopen('./text.txt', 'rb'); $contents = ''; while(!feof($fp)) { $contents .= fread($fp, 4096); //一次读取4096个字符 } fclose($fp);
使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。
查看全部 -
session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。
用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
$_SESSION['uid'] = $userinfo['uid']; $_SESSION['userinfo'] = $userinfo;
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
查看全部 -
删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。
session_start(); $_SESSION['name'] = 'jobs'; echo $_SESSION['name']; //提示name不存在
如果要删除所有的session,可以使用session_destroy函数销毁当前session,session_destroy会删除所有数据,但是session_id仍然存在。
session_start(); $_SESSION['name'] = 'jobs'; $_SESSION['time'] = time();
值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。
session_start(); $_SESSION['name'] = 'jobs'; $_SESSION['time'] = time(); unset($_SESSION); session_destroy(); var_dump($_SESSION); //此时已为空
如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除session_id的cookie值。
查看全部 -
在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION进行session的读写。
session_start(); $_SESSION['test'] = time(); var_dump($_SESSION);
session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。
session_start(); $_SESSION['ary'] = array('name' => 'jobs'); $_SESSION['obj'] = new stdClass(); var_dump($_SESSION);
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题,这个我们会在一些高级的课程中讲到。
查看全部
举报