-基础笔记-
慕课网 PHP 基础语法巩固(2) 课堂笔记,包含会话,文件,数据库操作等细碎的摘要
会话控制
session
HTTP 是无状态协议,HTTP 不知道请求来自哪个客户端,Session 提供在 PHP 脚本中定义全局变量的方法,使全局变量在同一个 Session 中对所有的 PHP 脚本文件内都有效,解决 HTTP 断链接的问题
Session 可以减轻服务器压力,缺点在于每次请求会传输大量重复的信息
Session 允许通过将数据存储在 HTTP 服务器中,使得用户在回话过程中保持该数据
session_start(); $_SESSION['id'] = 'info'
|
每一次请求有 SessionID 区分不同的信息,SessionID 存储到 cookie 中,Session 数据通过变量$_SESSION
存储到 Session 文件中
SessionID:
- PHP 回话启用
- 检查 SessionID,如果没有启动新会话 + SessionID
- 一直使用的 SessionID 相同,默认会话在活动,超过一定时间则视为过期
- 默认情况下 SessionID 存在 Cookie 中,也可以存在 URL 中
Session 函数:
bool session_start() string session_id(string $id) string session_name(string $name) bool session_destroy(void)
session.auto_start(bool) session.name(string) session.save_handler(string) session.save_path(string) session.gc_maxlifetime(int) session.gc_probability(int)
|
- 必须在 session_start()函数之前调用 session_name()函数
- 垃圾回收进程概率计算:gc_probability/gc_divisor
cookie
cookie 是服务器发送到用户浏览器上并保存在浏览器里的数据,会在浏览器下一次请求时一起发送到服务器上
session 是存储在服务器的数据
cookie 是存储在客户端的数据
cookie 的用途:
会话状态管理,个性化设置,浏览器行为跟踪
bool setcookie(string $name,string $value,[$expire,$path,$domain])
|
文件操作
API
filetype($filename); filesize($filename); filectime($filename); filemtime($filename); fileatime($filename);
date_default_timezone_set('PRC'); date('Y-m-d H:i:s',filectime($filename));
is_readable($filename); is_writable($filename)/is_writeable($filename); is_executable($filename); is_file($filename);
|
pathinfo($filename, $options);
dirname($path); basename($filename,$suffix); file_exists($filename);
|
touch($filename,$time,$atime);
unlink($filename,$context); rename($oldname,$newname,$path); copy($filename);
|
$handle = fopen($filename, r|r+|w|...) fread($handle, $size) fwrite($handle, 'info',$size)|fput()
ftell($handle) fseek($handle,$size) fpassthru() rewind($handle) ftruncate($handle,$size)
fgetc($handle) fgets($handle) fgetss($handle) fgetcsv() fputcsv() file_get_contents() file_put_contents() file() readfile()
feof($handle) fclose()
parse_ini_file($filename) parse_ini_string($ini) highlight_string($str) highlight_file()
|
‘r’:只读方式打开,将文件指针指向文件头。
‘r+’:读写方式打开,将文件指针指向文件头。
‘w’:写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’:读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’:写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’:读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘x’:创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
‘x+’:创建并以读写方式打开,其他的行为和 ‘x’ 一样。
函数和类的封装
- 创建文件
- 可以用 touch()创建,也可以直接 file_get_contents()
function create_file(string $filename){ if(file_exists($filename)){ return false; } if(!file_exists(dirname($filename))){ mkdir(dirname($filename),0777,true); } if(file_put_contents($filename,'')!==false){ return true; } return false; }
|
function del_file(string $filename){ if(!file_exists($filename)||!is_writable($filename)){ return false; } if(unlink($filename)){ return true; } return false; }
|
function copy_file(string $filename,string $dest){ if(!is_dir($dest)){ mkdir($dest,0777,true); } $destName=$dest.DIRECTORY_SEPARATOR.basename($filename); if(file_exists($destName)){ return false; } if(copy($filename,$destName)){ return true; } return false; }
|
function rename_file(string $oldName,string $newName){ if(!is_file($oldName)){ return false; } $path=dirname($oldName); $destName=$path.DIRECTORY_SEPARATOR.$newName; if(is_file($destName)){ return false; } if(rename($oldName,$newName)){ return true; } return false; }
|
function cut_file(string $filename,string $dest){ if(!is_file($filename)){ return false; } if(!is_dir($dest)){ mkdir($dest,0777,true); } $destName=$dest.DIRECTORY_SEPARATOR.basename($filename); if(is_file($destName)){ return false; } if(rename($filename,$destName)){ return true; } return false; }
|
function get_file_info(string $filename){ if(!is_file($filename)||!is_readable($filename)){ return false; } return [ 'atime'=>date("Y-m-d H:i:s",fileatime($filename)), 'mtime'=>date("Y-m-d H:i:s",filemtime($filename)), 'ctime'=>date("Y-m-d H:i:s",filectime($filename)), 'size'=>trans_byte(filesize($filename)), 'type'=>filetype($filename) ]; }
|
function trans_byte(int $byte,int $precision=2){ $kb=1024; $mb=1024*$kb; $gb=1024*$mb; $tb=1024*$gb; if($byte<$kb){ return $byte.'B'; }elseif($byte<$mb){ return round($byte/$kb,$precision).'KB'; }elseif($byte<$gb){ return round($byte/$mb,$precision).'MB'; }elseif($byte<$tb){ return round($byte/$gb,$precision).'GB'; }else{ return round($byte/$tb,$precision).'TB'; } }
|
function read_file(string $filename){ if(is_file($filename) && is_readable($filename)){ return file_get_contents($filename); } return false; }
|
function read_file_array(string $filename,bool $skip_empty_lines=false){ if(is_file($filename)&&is_readable($filename)){ if($skip_empty_lines){ return file($filename,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); }else{ return file($filename); } } return false; }
|
function write_file(string $filename,$data){ $dirname=dirname($filename); if(!file_exists($dirname)){ mkdir($dirname,0777,true); } if(is_array($data)||is_object($data)){ $data=serialize($data); } if(file_put_contents($filename,$data)!==false){ return true; }else{ return false; } }
|
function write_file1(string $filename,$data,bool $clearFlag=false){ $dirname=dirname($filename); if(!file_exists($dirname)){ mkdir($dirname,0777,true); } if(is_file($filename)&&is_readable($filename)){ if(filesize($filename)>0){ $srcData=file_get_contents($filename); } }
if(is_array($data)||is_object($data)){ $data=serialize($data); } $data=$srcData.$data; if(file_put_contents($filename,$data)!==false){ return true; }else{ return false; } }
|
function truncate_file(string $filename,int $length){ if(is_file($filename)&&is_writable($filename)){ $handle=fopen($filename,'r+'); $length=$length<0?0:$length; ftruncate($handle,$length); fclose($handle); return true; } return false; }
|
- 下载文件
- 在 html 里添加下载链接
- 建立
down_file()
函数
- 建立 php 文件进行下载
<a href="download.php?filename=download.zip">file_name.zip</a>
|
function down_file(string $filename,array $allowDownExt=array('jpeg','jpg','png','gif','txt','html','php','rar','zip')){ if(!is_file($filename)||!is_readable($filename)){ return false; } $ext=strtolower(pathinfo($filename,PATHINFO_EXTENSION)); if(!in_array($ext,$allowDownExt)){ return false; } header('Content-Type:application/octet-stream');
header('Accept-Ranges: bytes');
header('Accept-Length: '.filesize($filename));
header('Content-Disposition: attachment;filename=king_'.basename($filename));
$read_buffer=1024; $sum_buffer=0; $handle=fopen($filename,'rb'); while(!feof($handle) && $sum_buffer<$filesize){ echo fread($handle,$read_buffer); $sum_buffer+=$read_buffer; } fclose($handle); exit; }
|
$filename=$_GET['filename']; down_file($filename);
|
function upload_file(array $fileInfo,string $uploadPath='./uploads',bool $imageFlag=true,array $allowExt=array('jpeg','jpg','png','gif'),int $maxSize=2097152){
define('UPLOAD_ERRS',[ 'upload_max_filesize'=>'超过了PHP配置文件中upload_max_filesize选项的值', 'form_max_size'=>'超过了表单MAX_FILE_SIZE选项的值', 'upload_file_partial'=>'文件部分被上传', 'no_upload_file_select'=>'没有选择上传文件', 'upload_system_error'=>'系统错误', 'no_allow_ext'=>'非法文件类型', 'exceed_max_size'=>'超出允许上传的最大值', 'not_true_image'=>'文件不是真实图片', 'not_http_post'=>'文件不是通过HTTP POST方式上传上来的', 'move_error'=>'文件移动失败' ]);
if($fileInfo['error']===UPLOAD_ERR_OK){ $ext=strtolower(pathinfo($fileInfo['name'],PATHINFO_EXTENSION)); if(!in_array($ext,$allowExt)){ echo UPLOAD_ERRS['no_allow_ext']; return false; } if($fileInfo['size']>$maxSize){ echo UPLOAD_ERRS['exceed_max_size']; return false; } if($imageFlag){ if(@!getimagesize($fileInfo['tmp_name'])){ echo UPLOAD_ERRS['not_true_image']; return false; } } if(!is_uploaded_file($fileInfo['tmp_name'])){ return UPLOAD_ERRS['not_http_post']; } if(!is_dir($uploadPath)){ mkdir($uploadPath,0777,true); } $uniName=md5(uniqid(microtime(true),true)).'.'.$ext; $dest=$uploadPath.DIRECTORY_SEPARATOR.$uniName;
if(@!move_uploaded_file($fileInfo['tmp_name'],$dest)){ echo UPLOAD_ERRS['move_error']; return false; } echo '文件上传成功'; return $dest; }else{ switch($fileInfo['error']){ case 1: $mes=UPLOAD_ERRS['upload_max_filesize']; break; case 2: $mes=UPLOAD_ERRS['form_max_size']; break; case 3: $mes=UPLAOD_ERRS['upload_file_partial']; break; case 4: $mes=UPLOAD_ERRS['no_upload_file_select']; break; case 6: case 7: case 8: $mes=UPLAOD_ERRS['upload_system_error']; break; } echo $mes; return false; } }
|
- 压缩单个文件
ZipArchive()
一个用 Zip 压缩的文件存档类
- 压缩包要打开后将文件添加到压缩包中
function zip_file(string $filename){ if(!is_file($filename)){ return false; } $zip=new ZipArchive(); $zipName=basename($filename).'.zip'; if($zip->open($zipName,ZipArchive::CREATE|ZipArchive::OVERWRITE)){ if($zip->addFile($filename)){ @unlink($filename); } $zip->close(); return true; }else{ return false; } }
|
function zip_files(string $zipName,...$files){ $zipExt=strtolower(pathinfo($zipName,PATHINFO_EXTENSION)); if('zip'!==$zipExt){ return false; } $zip=new ZipArchive(); if($zip->open($zipName,ZipArchive::CREATE|ZipArchive::OVERWRITE)){ foreach($files as $file){ if(is_file($file)){ $zip->addFile($file); } } $zip->close(); return true; }else{ return false; } }
|
function unzip_file(string $zipName,string $dest){ if(!is_file($zipName)){ return false; } if(!is_dir($dest)){ mkdir($dest,0777,true); } $zip=new ZipArchive(); if($zip->open($zipName)){ $zip->extractTo($dest); $zip->close(); return true; }else{ return false; } }
|
函数和类的封装源码: code/lib/file.func.php
MySQL
具体参考 PHP & MySQL learning notes (1)->3.mySQL
PHP 操作 MySQL
- MySQL:非永久链接,性能低,PHP5.5 之后废弃
- MySQLi:永久链接,减轻了服务器压力
- PDO:实现 MySQLi 常用功能,支持大部分数据库
连接数据库:mysql -uroot -p password
选择数据库:use db
设置字符集:set names utf8
mysql_select_db("DATABASE NAME", $con)
mysql_connect($server,$username,$password) mysql_select_db($database_name) mysql_set_charset($charset)
mysql_query($query)
mysql_query($query)
|
代码示例
header('content-type:text/html;charset=utf-8');
$link = @mysql_connect('localhost','root','') or die('数据库连接失败!');
mysql_select_db('test') or die('选择的数据库不存在!');
mysql_set_charset('utf8');
$result = mysql_query("INSERT INTO users VALUES(NULL ,'李四',20)");
$result = mysql_query("UPDATE users SET money=25 where id=3");
$result = mysql_query("DELETE FROM users where id=3");
$result = mysql_query("DROP TABLE test");
$result = mysql_query("SELECT * FROM users");
while($line = mysql_fetch_array($result,MYSQL_ASSOC)){ $data[] = $line; } var_dump($data);
mysql_close($link);
|
MySQLi 操作
$connect = mysqli_connect('host','username','password'.'database'); $result = mysqli_query($connect,$sql); mysqli_fetch_all($result)
|
错误及常用命令
- Parse error(解析错误): syntax error(语法错误), unexpected ‘<’, expecting end of file
- Notice(通知): Undefined variable(未定义的变量): sdkljflskdjflksdjflksdjfklj
- Catchable fatal(致命) error: Object of class stdClass could not be converted to string
- Warning(警告): settype(): Invalid(非法) type
</br>
header('content-type:text/html;charset=utf-8'); date_defalut_timezone_set('PRC');
@
echo($var,....) var_dump($var) print_r($var) unset($var,...) time()
is_[int|float|double|bool...]($var) isset() function_exists() file_exists() $var = file_get_contents($filename)
serialize() unserialize() setcookie(string $name, string $value, int $expire = 0, string $path = "", string $domain = "") $var = strip_tags()
exit()|die();
|
相关链接:
mysql 笔记
PHP & MySQL learning notes (2)
PHP & MySQL learning notes (1)