php初探

1.

define("DB_HOST","localhost");

报错。必须把localhost换成127.0.0.1

另外 mysql_connect() 即将弃用。建议用mysqli。


2. 老师在讲logout的时候写下这样一段代码:

function logout(){
 $_SESSION=array();
    echo $_SESSION;
 if(isset($_COOKIE[session_name()])){
     echo session_name();
     echo "<br>";
     echo $_COOKIE[session_name()];
  setcookie(session_name(),"",time()-1);
  session_destroy();
  //header("location:login.php");
 }
}
我觉得很奇怪, 退出登录不是清掉session中的值就可以了?为什么还要扯cookie?




---------------------------转载---------------------------------

原文地址:http://segmentfault.com/a/1190000003012552

可以将 Session 理解为存放我们数据的“箱子”,当然,这些“箱子”都在服务端那。服务器给访问者唯一的“钥匙”,这个“钥匙”被称作 session_id。访问者凭借自己的 session_id,就能获取到自己存在服务器端的数据。

session_id 通过两种方式传给访问者(客户端):URL 或 cookie。详情参见:传送会话ID

Session 和 Cookie 有什么关系

Cookie 也是由于 HTTP 无状态的特点而产生的技术。也被用于保存访问者的身份标示和一些数据。每次客户端发起 HTTP 请求时,会将 Cookie 数据加到 HTTP header 中,提交给服务端。这样服务端就可以根据 Cookie 的内容知道访问者的信息了。
可以说,Session 和 Cookie 做着相似的事情,只是 Session 是将数据保存在服务端,通过客户端提交来的 session_id 来获取对应的数据;而 Cookie 是将数据保存在客户端,每次发起请求时将数据提交给服务端的。

上面提到,session_id 可以通过 URL 或 cookie 来传递,由于 URL 的方式比 cookie 的方式更加不安全且使用不方便,所以一般是采用 cookie 来传递 session_id。
服务端生成 session_id,通过 HTTP 报文发送给客户端(比如浏览器),客户端收到后按指示创建保存着 session_id 的 cookie。cookie 是以 key/value 形式保存的,看上去大概就这个样子的:PHPSESSID=e4tqo2ajfbqqia9prm8t83b1f2。在 PHP 中,保存 session_id 的 cookie 名称默认叫作PHPSESSID,这个名称可以通过 php.ini 中 session.name 来修改,也可以通过函数 session_name() 来修改。

通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。 会话通常被用来在多个页面请求之间保存及共享信息。 一般来说,会话 ID 通过 cookie 的方式发送到浏览器,并且在服务器端也是通过会话 ID 来取回会话中的数据。 如果请求中不包含会话 ID 信息,那么 PHP 就会创建一个新的会话,并为新创建的会话分配新的 ID。

会话的工作流程很简单。当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie), 如果请求中不包含会话 ID 信息,PHP 就会创建一个新的会话。 会话开始之后,PHP 就会将会话中的数据设置到 $_SESSION 变量中。 当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器器来进行保存。

---------------------over-------------------------

我以前也转过关于session的文章。当时是要做一个免登录功能,session里面有对应值,就可以免登陆。cookie的作用在我看来就是用来「记住密码」的。当时也知道有个jsession_id这个东西,但是一直都没有正式用过。

照这个说法,每次请求如果包含session_id,那浏览器就会把这个id发到服务器,让服务器根据session_id查找对应数据。我之前写的时候可能就是因为没有清掉这个session_id所以每次重启服务器,第一次访问都会报错!!!

官方文档

http://php.net/manual/zh/function.session-destroy.php

session_destroy() 销毁当前会话中的全部数据, 但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。 如果需要再次使用会话变量, 必须重新调用 session_start() 函数。

为了彻底销毁会话,比如在用户退出登录的时候,必须同时重置会话 ID。 如果是通过 cookie 方式传送会话 ID 的,那么同时也需要 调用 setcookie() 函数来 删除客户端的会话 cookie。

<?php
// 初始化会话。
// 如果要使用会话,别忘了现在就调用:
session_start();

// 重置会话中的所有变量
$_SESSION = array();

// 如果要清理的更彻底,那么同时删除会话 cookie
// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// 最后,销毁会话
session_destroy();
?>



3. 不懂{}的意思。

function insert($table,$array){
    $keys=join(",",array_keys($array));
    //echo $keys;
    $vals="'".join("','",array_values($array))."'";
    //echo $vals;
    //insert admin(username,password,email) values('a','0cc175b9c0f1b6a831c399e269772661','a')
    $sql="insert {$table}($keys) values({$vals})";
    mysql_query($sql);
    return mysql_insert_id();
}

{$table}是告诉PHP引擎在解析这个变量的时候当作一个整体去解析,因为PHP引擎在解析变量的时候会尽可能多的去向后取合法字符,它认为取得的合法字符越多,变量的含义越明确,所以我们写的时候最好把变量括成一个整体。

http://blog.csdn.net/yboker/article/details/8536304

如果$cid=aa, 那么{$cid}dd=aadd,而$ciddd=ciddd;

当然,{}的用法不止这些。随便百度就有很多。

另外我觉得那个header()也是非常神奇的存在。

http://blog.csdn.net/yboker/article/details/8174681

header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端。
标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头 
与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件 
(http://www.w3.org/Protocols/rfc2068/rfc2068)。
在 PHP 中送回 HTML 资料前,需先 传完所有的标头。



4. 传值的时候,老师一会儿用request取,一会儿用post取。总体来说,直接接在URL后面的用request,表单还是post。

$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过POST和GET方法提交的所有数据都可以通过$_REQUEST数组获得。

GET表单值可以通过_GET获取;但通过action的url设置的参数总是获取不到的,<form method="get" action="a.asp?b=b">跟<form method="get"action="a.asp">是一样的,也就是说,在这种情况下,GET方式会忽略action页面后边带的参数列表。POST表单值可以通过_POST获取;但通过action的url参数设置的参数则可以不能通过_POST获取到。action=test.php?id=1这种就是GET方式传值,可以用$_REQUEST和$_GET接受传值,但不能用POST方式获取到值,即使表单是POST方式提交。所在,在提交表单时,如果action中同时有参数,最好只能通过POST表单方式,对于表单内数据,直接通过POST获取,对于action中参数, 通过GET获取。



5. Notice: Undefined variable: str in /Users/gao/PhpstormProjects/shop/lib/mysql.func.php on line 34

总是出现这种东西很烦。还有各种warning,DEPRECATED. 


6.$_SERVER['PHP_SELF'] 表示当前 php 文件相对于网站根目录的位置地址

http://www.5idev.com/p-php_server_php_self.shtml

PHP $_SERVER['PHP_SELF'] 安全性

由于利用 $_SERVER['PHP_SELF'] 可以很方便的获取当前页面地址,因此一些程序员在提交表单数据到当前页面进行处理时,往往喜欢使用如下这种方式:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

假设该页面地址为:

http://www.5idev.com/php/index.php

访问该页面,得到的表单 html 代码如下:

<form method="post" action="/php/index.php">

这段代码是正确的,但是当访问地址变成:

http://www.5idev.com/php/index.php/test/foo

页面正常执行了,表单 html 代码变成:

<form method="post" action="/php/index.php/test/foo">

显然这段代码不是我们期望的,攻击者可以在 URL 后面随意加上攻击代码。要解决该问题,可以:

  1. 使用 htmlentities($_SERVER['PHP_SELF']) 替代 $_SERVER['PHP_SELF'],让 URL 中可能的恶意代码转换为用于显示的 html 代码而无法执行。
  2. 可以的条件下,使用 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['REQUEST_URI'] 替代 $_SERVER['PHP_SELF']
  3. 在公共代码里将 $_SERVER['PHP_SELF'] 进行重写:
$phpfile = basename(__FILE__);
$_SERVER['PHP_SELF'] = substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], $phpfile)).$phpfile; 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值