PHP经典实例读书笔记--Web基础

1、Web编程

  • PHP第一版是为了Web编程而写,所以能一直流行下来
  • HTTP请求是“无状态的”,每个请求与前一个状态并无连接
  • Cookie可以连接同一个用户的多个请求,可以跟踪用户的浏览历史,如购物车
  • Cookie存储在浏览器中,是服务器指示浏览器随请求发送的一个小文本串

2、设置cookie

问题

希望设置一个cookie,使网站能识别来自同一个Web浏览器的后续请求。

解决方案

调用setcookie()并提供一个cookie名和值。

setcookie('flavor','chocolate chip');
//PHP将cookie随HTTP首部发送给浏览器,如果没有使用输出缓冲,必须在没有输出之前调用setcookie()

//函数原型
bool setcookie(string $name [,string $value[,int $expire=0[,string $path[,string $domain[,bool $secure=false[,bool $httponly=false ]]]]]])

//第一个参数:cookie的键
//第二个参数:cookie的值
//第三个参数:cookie过期时间,默认在浏览器关闭时过期
//第四个参数:只有当页面请求的页面以指定的字符串开头才会发送给服务器
//第五个参数:只有当所请求的页面的主机名以指定的域名结尾时才会发送给服务器
//第六个参数:是否只允许使用HTTPS协议才发送
//第七个参数:是否只允许使用http协议发送请求

扩展:setcookie() 的有关文档http://www.php.net/setcookie


3、读取和删除cookie

问题

希望读取之前设置的一个cookie的值,或者删除已经存在的一个cookie。

解决方案

查看$_COOKIE超级全局变量数组。

if(isset($_COOKIE['flavor'])){
    print "You ate a {$_COOKIE['flavor']} cookie";
}
//浏览器向服务器发送一个cookie时,它只发送值。无法通过$_COOKIE访问cookie的域、路径、到期时间、安全状态,因为浏览器没有发送。

//删除一个cookie,只需要将指定的cookie的值设置为空,过期时间设置为过去时间
setcookie('flavor','',1);
//删除cookie时,必需具有相同的参数,包括路径、域和安全标志。

扩展:setcookie() 的有关文档http://www.php.net/setcookie


4、构建查询字符串

问题

需要构造一个链接,其中的查询字符串中包含键/值对。

解决方案

使用 http_build_query() 函数。

$vars = array('name'=>'Oscar th Grouch',
              'color'=>'green',
              'favorite_puctuation'=>'#');
$query_string = http_build_query($vars);
$url = '/muppet/select.php?'.$query_string;
//使用http_build_query()函数,能够将特殊的字符进行转义编码

//编码时可能与HTML实体冲突,破坏构造的URL,常用的两种选择
//1、选择不会与实体混淆的变量名,如_amp而不是amp
//2、输出URL之前将对应HTML实体的字符转换为相应的实体,使用htmlentities()
$url = '/muppet/select.php?'.htmlentities($query_string);

扩展:http_build_query() 的有关文档http://www.php.net/http_build_query


5、读取POST请求

问题

希望直接访问一个请求体,而不是访问PHP放在$_POST中的解析后的数据。例如希望处理一个XML文档,这个文档作为Web服务器请求的一部分提交。

解决方案

读取php://input流。

//读取全部请求内容,而不是几个参数的内容
$body = file_get_contents('php://input');

//函数原型 
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )

扩展:php://input 的有关文档http://www.php.net/wrappers


6、使用HTTP基本或摘要认证

问题

希望利用PHP用密码保护网站的某些部分。不是将密码保存在外部服文件中,让服务器来验证,而是希望在一个PHP程序中实现密码验证逻辑。

解决方案

使用$_SERVER[‘PHP_AUTH_USER’]和 $_SERVER[‘PHP_AUTH_PW’] 超级全局变量提供的用户名和密码,如果拒绝访问可发送一个WWW-Authenticate首部,用来标识认证安全域的响应,而且响应的HTTP状态码为401。

//这是采用系统自带的基本认证方式,基本认证用户名和密码用明文传输,不安全
if(!valid($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW'])){
    http_response_code(401);
    header('WWW-Authenticate: Basic realm="My Website"');
    echo 'you need to enter a valid username and password';
    exit();
}

//使用摘要认证时,密码本身不会从浏览器发送到服务器,而是发送一些散列值

扩展:HTTP认证 的有关文档http://www.php.net/feature.http-auth


7、使用cookie认证

问题

希望更多的控制用户登录过程,如提供自己登录的表单。

解决方案

将认证状态存储在一个cookie中,或者存储为一个会话的一部分,用户登录成功时,存储用户名,散列值和一个密语。使用户无法由用户名建立cookie

//发送cookie之前,将cookie加盐之后再用md5加密
$secret_word = 'if i ate spinach';
if(validate($_POST['username'],$_POST['password'])){
    setcookie('login',$_POST['username'].','.md5($_POST['username'].$secret_word));
}
//为了方便用户使用,可以使用会话机制,将相应的信息存在服务器中

扩展:md5() 的有关文档http://www.php.net/md5


8、读写HTTP首部

问题

读写一个HTTP请求首部。

解决方案

要读取一个首部,可以使用$_SERVER超级全局变量或者使用header()函数来写

//查看有哪些首部
echo "<pre>";
print_r($_SERVER);
echo $_SERVER['HTTP_USER_AGENT'];
//也可以使用getallheades()函数来查看有哪些首部
$header = getallheaders();

//通过header()函数来指定HTTP的头部
header('Content-Type:image/png');

扩展:getallheaders() 的有关文档http://www.php.net/getallheaders


9、发送一个特定的HTTP状态码

问题

希望显示设置HTTP状态码。例如,希望指示用户没有权限访问这个页面,或者页面不存在。

解决方案

使用 http_response_code() 来设置

http_response_code(404);
//常用的http状态响应码
200 请求成功
301 请求的资源已经永久的移动
302 重定向,请求的资源被暂时移动
304 未修改,与上次请求的内容相同
401 未认证,Unauthorized
403 禁止访问
404 未找到
500 服务器故障
502 服务器无响应
504 网关超时

扩展:http_response_code() 的有关文档http://www.php.net/http_response_code


10、重定向到不同的位置

问题

希望将用户自动重定向到一个新的URL。例如,成功保存表单数据后,希望用户重定向到一个确认页面,确认数据已经保存

解决方案

使用 header() 中的Location首部,并指定新URL,然后调用 exit() 方法

//重定向必须包含协议名和主机名
header('Location: http://www.520dxm.top/confirm.php?id=123');
//重定向的时候,可以直接传递参数
exit();
//重定向URL要用GET获取。不能通过POST来获取一个URL,不过可以利用JavaScript,通过POST模拟重定向

扩展:header() 的有关文档http://www.php.net/header


11、浏览器刷新输出

问题

希望强制将输出发送到浏览器。例如,希望在完成一个可能很慢的数据库查询之前为用户提供一个状态更新。

解决方案

使用 flush()

print 'Finding identical snowflakes ...';
//强制完成数据输出,不过Web服务器可能有一定的缓存,可以用空白填充
flush();
$sth = $dbh->query('select * from snowflakes');

扩展:flush() 的有关文档http://www.php.net/flush


12、浏览器缓冲输出

问题

希望在发送首部或cookie之前生成输出。

解决方案

使用 ob_start() ,在最下面调用ob_end_flush(),这样一来生成输出的命令和发送首部的命令可以混合在一起了,调用用ob_end_flush(),之前不会发送输出

ob_start();
echo 'hello world';
setcookie('name','xujun');
ob_flush_end();

funcion mangle_email($s){
    //对$s中的字符串进行处理
}

//ob_start还可以传入一个回调函数,用于处理缓冲输出
ob_start('mangle_email');
I would not like spam sent to xujunrt@163.com
ob_flush_end();

扩展:ob_start() 的有关文档http://www.php.net/ob-start


13、压缩Web输出

问题

希望向支持自动解压缩的浏览器发送压缩内容。

解决方案

在php.ini文件中,配置 zlib.output_compression=1

浏览器通过Accept-Encoding首部告诉服务器它可以接受压缩响应。

zlib.output_compression_level=1
...
zlib.output_compression_level=9
压缩级别越高,消耗服务器CPU资源的时间越多。压缩之后的数据量越小

扩展:zlib 的有关文档http://www.php.net/zlib


14、读写环境变量

问题

希望读写环境变量的值。

解决方案

使用 getenv() 和 putenv()

$path = getenv('PATH');
//默认情况下环境变量不会自动加载到$_ENV中,可以到variables_order配置开启
$name = $_ENV['USER'];

//希望在脚本中动态设置环境变量
putenv('ORACLE_SID = ORACLE');//配置oci扩展

扩展:getenv() 的有关文档http://www.php.net/getenv


15、 将移动浏览器重定向到专为移动设备优化的网站

问题

希望将移动设备或平板设备浏览器重定向到专门为这些设备优化的一个替代网站或替代内容。

解决方案

使用 get_browser() 返回的对象来确定这是否是一个移动浏览器

//前提是下载一个php_browscap.ini文件,将其配置到php.ini中
if($browser->ismobilebrowser){
    //手机浏览器
}else{
    //网页浏览器
}
//为了避免麻烦,可以使用$_SERVER['HTTP_USER_AGENT'],来判断

扩展:getenv() 的有关文档http://www.php.net/getenv

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值