<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/simpman" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/simpman" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 04 Nov 2008 06:24:00 GMT</lastBuildDate><title>那一季的思念</title><description>the season full of missing</description><link>http://9inaruto.cn/blog/index.php</link><language>zh-cn</language><copyright>那一季的思念</copyright><item><title>PHP用户认证及管理完全源码</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743064/5192433/1/item.html</link><description>&lt;br/&gt;-- begin auth.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;?php&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;$id = &amp;quot;xxxCOM&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if(!isset($PHP_AUTH_USER)) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;WWW-Authenticate: Basic realm=&amp;quot;$id&amp;quot;&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;HTTP/1.0 401 Unauthorized&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;require(&amp;#039;error.inc&amp;#039;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;$name = $PHP_AUTH_USER;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$pass = $PHP_AUTH_PW;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;require(&amp;quot;connect.inc&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$query = &amp;quot;select * from auth where username=&amp;#039;$name&amp;#039; &amp;amp;&amp;amp; realm=&amp;#039;$id&amp;#039;&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$result = mysql_db_query(&amp;quot;admin&amp;quot;, $query);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;if(mysql_num_rows($result) == 0) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;WWW-Authenticate: Basic realm=&amp;quot;$id&amp;quot;&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;HTTP/1.0 401 Unauthorized&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;require(&amp;#039;error.inc&amp;#039;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;$active = mysql_result($result,0,&amp;quot;active&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;if($active == &amp;#039;no&amp;#039;) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;TITLE&amp;gt;404 Not Found&amp;lt;/TITLE&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;H1&amp;gt;Not Found&amp;lt;/H1&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;The requested URL&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;? echo $REQUEST_URI; ?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;was not found on this server.&amp;lt;P&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;?php&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- end auth.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- begin connect.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;?php mysql_connect(&amp;quot;localhost&amp;quot;, &amp;quot;user&amp;quot;, &amp;quot;&amp;quot;); ?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- end connect.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- begin error.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;此文件存放错误信息及返回!&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- end error.inc --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- 用户库结构(自己调整)--&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;CREATE TABLE auth (&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;id smallint(6) DEFAULT &amp;#039;0&amp;#039; NOT NULL auto_increment,&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;username varchar(16) DEFAULT &amp;#039;&amp;#039; NOT NULL,&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;lastname tinyblob,&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;firstname tinyblob,&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;password varchar(16),&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;realm varchar(16),&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;active char(3),&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;PRIMARY KEY (id),&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;UNIQUE id (id),&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;UNIQUE username (username)&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- 用户库结构结束--&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- 添加用户示例--&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;insert into auth (username, lastname, firstname, password, realm, active) values (&amp;#039;admin&amp;#039;,&amp;#039;my&amp;#039;,&amp;#039;love&amp;#039;,&amp;#039;password&amp;#039;,&amp;#039;xxxCOM&amp;#039;,&amp;#039;yes&amp;#039;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- 结束--&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;--用户管理程序开始 usermanage.php --&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;?php include(&amp;quot;auth.inc&amp;quot;); ?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;lt;?php&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($PHP_AUTH_USER != &amp;quot;admin&amp;quot;) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;WWW-Authenticate: Basic realm=&amp;quot;xxxCOM 客户认证&amp;quot;&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;HTTP/1.0 401 Unauthorized&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;Access Denied!n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;};&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($PHP_AUTH_PW != &amp;quot;mypassword&amp;quot;) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;WWW-Authenticate: Basic realm=&amp;quot;xxxCOM 客户认证&amp;quot;&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;Header(&amp;quot;HTTP/1.0 401 Unauthorized&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;Access Denied!n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;};&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($activate) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;include(&amp;quot;connect.inc&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$query1 = &amp;quot;UPDATE auth SET active=&amp;#039;yes&amp;#039; where id=&amp;#039;$id&amp;#039;&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$result1 = mysql_db_query(&amp;quot;admin&amp;quot;, $query1);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($result1) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;$user activatedn&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;} else {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;Error: Unknown Errorn&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($deactivate) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;include(&amp;quot;connect.inc&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$query2 = &amp;quot;UPDATE auth SET active=&amp;#039;no&amp;#039; where id=&amp;#039;$id&amp;#039;&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$result2 = mysql_db_query(&amp;quot;admin&amp;quot;, $query2);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($result2) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;$user deactivatedn&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;} else {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;Error: Unknown Errorn&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($delete) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;include(&amp;quot;connect.inc&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$query3 = &amp;quot;delete from auth where id=&amp;#039;$id&amp;#039;&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$result3 = mysql_db_query(&amp;quot;admin&amp;quot;, $query3);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($result3) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;$user 已删除!n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;} else {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;Error: Unknown Errorn&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;br&amp;gt;n&amp;lt;a href=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;返回&amp;lt;/a&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/font&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;exit;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;html&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;head&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;title&amp;gt;用户管理&amp;lt;/title&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/head&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;body&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;$PHP_SELF&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;Username&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;Real Name&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;Activated&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;include(&amp;quot;connect.inc&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$query = &amp;quot;SELECT * FROM auth&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$result = mysql_db_query(&amp;quot;admin&amp;quot;, $query);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if ($result) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;while ($r = mysql_fetch_array($result)) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$id = $r[&amp;quot;id&amp;quot;];&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$username = $r[&amp;quot;username&amp;quot;];&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$lastname = $r[&amp;quot;lastname&amp;quot;];&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$firstname = $r[&amp;quot;firstname&amp;quot;];&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;$activated = $r[&amp;quot;active&amp;quot;];&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;if ($activated == &amp;quot;yes&amp;quot;) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$username&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$lastname, $firstname&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$activated&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;$PHP_SELF?deactivate=yes&amp;amp;id=$id&amp;amp;user=$username&amp;quot;&amp;gt;Deactivate&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;$PHP_SELF?delete=yes&amp;amp;id=$id&amp;quot;&amp;gt;Delete&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;} elseif ($activated == &amp;quot;no&amp;quot;) {&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$username&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$lastname, $firstname&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;$activated&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;$PHP_SELF?activate=yes&amp;amp;id=$id&amp;quot;&amp;gt;Activate&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href=&amp;quot;$PHP_SELF?delete=yes&amp;amp;id=$id&amp;quot;&amp;gt;Delete&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;}&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;mysql_free_result($result);&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/table&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/body&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;echo &amp;quot;&amp;lt;/html&amp;gt;n&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;?&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;-- usermanage.php 结束--&amp;nbsp;&amp;nbsp;&lt;br/&gt; &lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=php%25E7%2594%25A8%25E6%2588%25B7%25E8%25AE%25A4%25E8%25AF%2581%25E5%258F%258A%25E7%25AE%25A1%25E7%2590%2586%25E5%25AE%258C%25E5%2585%25A8%25E6%25BA%2590%25E7%25A0%2581&quot; rel=&quot;tag&quot;&gt;php用户认证及管理完全源码&lt;/a&gt;</description><category>php+mysql</category><pubDate>Tue, 04 Nov 2008 14:24:00 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?219</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?219</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743064/5192433</fs:itemid></item><item><title>完全PHP5之session篇</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743065/5192433/1/item.html</link><description>1、什么是session？&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Session的中文译名叫做“会话”，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。目前社会上对session的理解非常混乱：有时候我们可以看到这样的话“在一个浏览器会话期间，...”，这里的会话是指从一个浏览器窗口打开到关闭这个期间； 也可以看到“用户（客户端）在一次会话期间”这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到选购商品到结账登出这样一个网上购物的过程；然而有时候也可能仅仅是指一次连接；其中的差别只能靠上下文来推断了。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然而当session一词与网络协议相关联时，它又往往隐含了“面向连接”和/或“保持状态”这样两个含义，“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始。“保持状态”则是指通信的一方能够把一系列的消息关联起来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 鉴于这种混乱已不可改变，要为session下个定义就很难有统一的标准。而在阅读session相关资料时，我们也只有靠上下文来推断理解了。不过我们可以这样理解：例如我们打电话，从拨通的那一刻起到挂断电话期间，因为电话一直保持着接通的状态，所以把这种接通的状态叫做session。它是访客与整个网站交互过程中一直存在的公有变量，在客户端不支持COOKIE的时候，为了保证数据正确、安全，就采用SESSION变量。访问网站的来客会被分配一个唯一的标识符，即所谓的会话 ID。它要么存放在客户端的 cookie，要么经由 URL 传递。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SESSION的发明填补了HTTP协议的局限：HTTP协议被认为是无状态协议，无法得知用户的浏览状态，当它在服务端完成响应之后，服务器就失去了与该浏览器的联系。这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因此通过SESSION(cookie是另外一种解决办法)记录用户的有关信息，以供用户再次以此身份对web服务器提起请求时作确认。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。网站编程人员都有这样的体会，每一页中的变量是不能在下一页中使用的(虽然form，url也可以实现，但这都是非常不理想的办法)，而SESSION中注册的变量就可以作为全局变量使用了。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么SESSION到底有什么用处呢？网上购物时大家都用过购物车，你可以随时把你选购的商品加入到购物车中，最后再去收银台结帐。在整个过程中购物车一直扮演着临时存贮被选商品的角色，用它追踪用户在网站上的活动情况，这就是SESSION的作用，它可以用于用户身份认证，程序状态记录，页面之间参数传递等。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SESSION的实现中采用COOKIE技术，SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE；在服务器端保存其他session变量，比如session_name等等。当用户请求服务器时也把session_id一起发送到服务器，通过session_id提取所保存在服务器端的变量，就能识别用户是谁了。同时也不难理解为什么SESSION有时会失效了。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当客户端禁用COOKIE时(点击IE中的“工具”—“Internet选项”，在弹出的对话框里点击“安全”—“自定义级别”项，将“允许每个对话COOKIE”设为禁用)，session_id将无法传递，此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态，如果客户端设置了禁用，则系统自动把session_id附加到url上传递。windows主机则无此功能。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;2、Session常见函数及用法？&lt;br/&gt;●Session_start()：开始一个会话或者返回已经存在的会话。&lt;br/&gt;&amp;nbsp;&amp;nbsp; 说明：这个函数没有参数，且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出，否则会发生以下错误：&lt;br/&gt;Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………&lt;br/&gt;你可以在php.ini里启动session.auto_start=1，这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制，如果确实启用了 session.auto_start，则不能将对象放入会话中，因为类定义必须在启动会话之前加载以在会话中重建对象。&lt;br/&gt;请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义，除非用户以后定义它们。&lt;br/&gt;警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象（即某对象将一个指向自己的引用传递给另一个对象）。&lt;br/&gt;●注册SESSION变量 ：&lt;br/&gt;PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。和GET，POST，COOKIE的使用方法相似。&lt;br/&gt;&amp;nbsp;&amp;nbsp; 注意：session_register()，session_unregister ，session_is_registered在php5下不再使用，除非在php.ini里把register_globle设为on，不过出于安全考虑，强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了，官方建议用$_SESSION代替之。例如：&lt;br/&gt;Page1.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;Session_start();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //使用SESSION前必须调用该函数。&lt;br/&gt;$_SESSION[‘name’]=”我是黑旋风李逵!”;&amp;nbsp;&amp;nbsp; //注册一个SESSION变量&lt;br/&gt;$_SESSION[‘passwd’]=”mynameislikui”;&lt;br/&gt;$_SESSION[‘time’]=time();&lt;br/&gt;echo &amp;#039;&amp;lt;br /&amp;gt;&amp;lt;a href=&amp;quot;page2.php&amp;quot;&amp;gt;通过COOKIE传递SESSION&amp;lt;/a&amp;gt;&amp;#039;;&amp;nbsp;&amp;nbsp; //如果客户端支持cookie，可通过该链接传递session到下一页。&lt;br/&gt;echo &amp;#039;&amp;lt;br /&amp;gt;&amp;lt;a href=&amp;quot;page2.php?&amp;#039; . SID . &amp;#039;&amp;quot;&amp;gt;通过URL传递SESSION&amp;lt;/a&amp;gt;&amp;#039;;//客户端不支持cookie时，使用该办法传递session.&lt;br/&gt;?&amp;gt;&lt;br/&gt;Page2.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_start();&lt;br/&gt;echo $_SESSION[&amp;#039;name&amp;#039;]; //&lt;br/&gt;echo $_SESSION[&amp;#039;passwd&amp;#039;];&amp;nbsp;&amp;nbsp; //&lt;br/&gt;echo date(&amp;#039;Y m d H:i:s&amp;#039;, $_SESSION[&amp;#039;time&amp;#039;]);&lt;br/&gt;echo &amp;#039;&amp;lt;br /&amp;gt;&amp;lt;a href=&amp;quot;page1.php&amp;quot;&amp;gt;返回山一页&amp;lt;/a&amp;gt;&amp;#039;;&lt;br/&gt;?&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;有两种方法传递一个会话 ID：&lt;br/&gt;cookie&lt;br/&gt;URL 参数&lt;br/&gt;会话模块支持这两种方法。cookie 更优化，但由于不总是可用，也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。&lt;br/&gt;PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本，需要手工在编译 PHP 时激活。在 Unix 下，用 --enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini)，相对 URI 将被自动修改为包含会话 ID。&lt;br/&gt;●session_id&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session_id() 用于设定或取得当前session_id。php5中既可以使用session_id()，也可以通过附加在url上的SID取得当前会话的session_id和session_name。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果session_id()有具体指定值的话，将取代当前的session_id值。使用该函数前必须启动会话：session_start();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当我们使用session cookies时，如果指定了一个session_id()值，每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。&lt;br/&gt;session_id()如果没有指定值，则返回当前session_id();当前会话没有启动的话，则返回空字符串。&lt;br/&gt; ●检查session是否存在？&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在以往的php版本中通常使用session_is_register()检查session是否存在，如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量，则session_is_register()函数不再起作用。你可以使用&lt;br/&gt;isset($_SESSION[‘xxx’])来替代。&lt;br/&gt;● 更改session_id&amp;nbsp;&amp;nbsp;session_regenerate_id() 更改成功则返回true，失败则返回false。&lt;br/&gt;使用该函数可以为当前session更改session_id，但不改变当前session的其他信息。例如：&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_start();&lt;br/&gt;$old_sessionid = session_id();&lt;br/&gt;session_regenerate_id();&lt;br/&gt;$new_sessionid = session_id();&lt;br/&gt;echo &amp;quot;原始 SessionID: $old_sessionid&amp;lt;br /&amp;gt;&amp;quot;;&lt;br/&gt;echo &amp;quot;新的 SessionID: $new_sessionid&amp;lt;br /&amp;gt;&amp;quot;;&lt;br/&gt;echo&amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br/&gt;print_r($_SESSION);&lt;br/&gt;echo&amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br/&gt;?&amp;gt;&lt;br/&gt;●session_name()返回当前session的name或改变当前session的name。如果要改变当前session的name，必须在session_start()之前调用该函数。注意：session_name不能只由数字组成，它至少包含一个字母。否则会在每时每刻都生成一个新的session id.&lt;br/&gt;session改名示例：&lt;br/&gt;&amp;lt;?php&lt;br/&gt;$previous_name = session_name(&amp;quot;WebsiteID&amp;quot;);&lt;br/&gt;echo &amp;quot;新的session名为： $previous_name&amp;lt;br /&amp;gt;&amp;quot;;&lt;br/&gt;?&amp;gt;&lt;br/&gt;&lt;br/&gt;●如何删除session？&lt;br/&gt;1、unset ($_SESSION[&amp;#039;xxx&amp;#039;])删除单个session，unset($_SESSION[&amp;#039;xxx&amp;#039;]) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用，可将之打入冷宫。&lt;br/&gt;unset($_SESSION)&amp;nbsp;&amp;nbsp;此函数千万不可使用，它会将全局变量$_SESSION销毁，而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。&lt;br/&gt;2、$_SESSION=array()删除多个session&lt;br/&gt;3、session_destroy()结束当前的会话，并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的，如果要删除cookie的话，必须借助setcookie()函数。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;返回值：布尔值。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;功能说明：这个函数结束当前的session，此函数没有参数，且返回值均为true&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp; session_unset() 如果使用了$_SESSION，则该函数不再起作用。由于PHP5必定要使用$_SESSION，所以此函数可以打入冷宫了。&lt;br/&gt;&lt;br/&gt;下面是PHP官方关于删除session的案例：&lt;br/&gt;&amp;lt;?php&lt;br/&gt;// 初始化session.&lt;br/&gt;session_start();&lt;br/&gt;/*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/&lt;br/&gt;$_SESSION = array();&lt;br/&gt;/***删除sessin id.由于session默认是基于cookie的，所以使用setcookie删除包含session id的cookie.***/&lt;br/&gt;if (isset($_COOKIE[session_name()])) {&lt;br/&gt;&amp;nbsp;&amp;nbsp; setcookie(session_name(), &amp;#039;&amp;#039;, time()-42000, &amp;#039;/&amp;#039;);&lt;br/&gt;}&lt;br/&gt;// 最后彻底销毁session.&lt;br/&gt;session_destroy();&lt;br/&gt;?&amp;gt;&lt;br/&gt;&lt;br/&gt;由此我们可以得出删除Session的步骤：&lt;br/&gt;①session_start()&lt;br/&gt;②$_SESSION=array()/unset($_SESSION[&amp;#039;xxx&amp;#039;])&lt;br/&gt;③session_destroy()&lt;br/&gt;&lt;br/&gt;● SESSION安全:&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据，还需要采取更多措施来主动保护会话的完整性。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;评估会话中携带的数据并实施附加保护措施通常要付出代价，降低用户的方便程度。例如，如果要保护用户免于受简单的社交策略侵害（注：指在 URL 中显示的会话 ID 会被别人在电脑屏幕上看到，或被别的网站通过 HTTP Referer 得到等），则应该启用 session.use_only_cookies。此情形下，客户端必须无条件启用 cookie，否则会话就不工作。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;有几种途径会将现有的会话 ID 泄露给第三方。泄露出的会话 ID 使第三方能够访问所有与指定 ID 相关联的资源。第一，URL 携带会话 ID。如果连接到外部站点，包含有会话 ID 的 URL 可能会被存在外部站点的 Referer 日志中。第二，较主动的攻击者可能会侦听网段的数据包。如果未加密，会话 ID 会以明文方式在网络中流过。对此的解决方式是在服务器上实施 SSL 并强制用户使用。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;默认情况下，所有与特定会话相关的数据都被存储在由 INI 选项 session.save_path 指定的目录下的一个文件中。对每个会话会建立一个文件（不论是否有数据与该会话相关）。这是由于每打开一个会话即建立一个文件，不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制，此行为有个副作用，有可能造成用户定制的会话处理器（例如用数据库）丢失了未存储数据的会话。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;上面介绍函数下文将会用到，但还有一些有关session的函数也介绍一下：&lt;br/&gt; session_encode&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;函数功能：sesssion信息编码&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;函数原型：string session_encode(void);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;返回值：字符串&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;功能说明：返回的字符串中包含全局变量中各变量的名称与值，形式如：a&amp;amp;#124;s:12:&amp;quot;it is a test&amp;quot;;c&amp;amp;#124;s:4:&amp;quot;lala&amp;quot;; a是变量名 s:12代表变量a的值&amp;quot;it is a test的长度是12 变量间用分号”;”分隔。&lt;br/&gt; session_decode&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;函数功能：sesssion信息解码&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;函数原型：boolean session_decode (string data)&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;返回值：布尔值&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;功能说明：这个函数可将session信息解码，成功则返回逻辑值true&lt;br/&gt;Php5不再使用session_id，而是把它变成一个常量SID，并保存在cookie中。如果客户端禁用了cookie，php会自动通过url自动传动传递SID，其条件是设置php.ini中的session.use_trans_sid = 1。此时即使客户端即使禁用了cookie也没关系了。&lt;br/&gt;&amp;nbsp;&amp;nbsp; 用 strip_tags() 来输出 SID 以避免 XSS 相关的攻击。&lt;br/&gt;&lt;br/&gt;Session跨页传递问题：&lt;br/&gt;session跨页传递需要考虑三种情况：&lt;br/&gt;①客户端禁用了cookie。&lt;br/&gt;②浏览器出现问题，暂时无法存取cookie&lt;br/&gt;③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项&lt;br/&gt;为什么会这样呢？下面解释一下原因：&lt;br/&gt;Session文件分为两部分：session变量保存在服务器端（默认以文件方式存储session）；而session id则以cookie形式保存在客户端。(注意：session默认是基于cookie的)。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当用户的浏览器向服务器提出请求时，同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件，即保存在服务器端的session变量值。事实上，session id可以使用客户端的Cookie或者Http1.1协议的Query_String（就是访问的URL的“?”后面的部分）来传送给服务器，然后服务器读取Session的目录……。也就是说，session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候，就在服务器上产生了一个session文件，随之也产生了与之唯一对应的一个session id，定义session变量以一定形式存储在刚才产生的session文件中。通过session id，可以取出定义的变量。跨页后，为了使用session，你必须又执行session_start();将又会产生一个session文件，与之对应产生相应的session id，用这个session id是取不出前面提到的第一个session文件中的变量的，因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件，直接读取与这个id对应的session文件。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是：session不一定必须依赖cookie，这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时，PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的，其一：“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”；其二：运行PHP的服务器必须是unix/linux系统，windows不具备此项功能。&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 明白了以上的道理，我们就可以得出解决session跨页传递问题的三条途径：&lt;br/&gt;1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项，让PHP自动跨页传递session id。&lt;br/&gt;2、手动通过URL传值、隐藏表单传递session id。&lt;br/&gt;3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。&lt;br/&gt;下面举例说明：&lt;br/&gt;第一种情况：&lt;br/&gt;page1.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_start();&lt;br/&gt;$_SESSION[&amp;#039;var1&amp;#039;]=&amp;quot;中华人民共和国&amp;quot;;&lt;br/&gt;$url=&amp;quot;&amp;lt;a href=&amp;quot;.&amp;quot;&amp;#92;&amp;quot;s2.php&amp;#92;&amp;quot;&amp;gt;下一页&amp;lt;/a&amp;gt;&amp;quot;;&lt;br/&gt;echo $url;&lt;br/&gt;?&amp;gt;&lt;br/&gt;page2.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_start();&lt;br/&gt;echo &amp;quot;传递的session变量var1的值为：&amp;quot;.$_SESSION[&amp;#039;var1&amp;#039;];&lt;br/&gt;?&amp;gt;&lt;br/&gt;运行以上代码，在客户端cookie正常的情况下，应该可以在得到结果“中华人民共和国”。&lt;br/&gt;现在你手动关闭客户端的cookie，再运行，可能得不到结果了吧。如果得不到结果，再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”，又得到结果“中华人民共和国”&lt;br/&gt;&lt;br/&gt;第二种途径：&lt;br/&gt;s1.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_start();&lt;br/&gt;$_SESSION[&amp;#039;var1&amp;#039;]=&amp;quot;中华人民共和国&amp;quot;;&lt;br/&gt;$sn = session_id();&lt;br/&gt;$url=&amp;quot;&amp;lt;a href=&amp;quot;.&amp;quot;&amp;#92;&amp;quot;s2.php?s=&amp;quot;.$sn.&amp;quot;&amp;#92;&amp;quot;&amp;gt;下一页&amp;lt;/a&amp;gt;&amp;quot;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//PHP5定义了一个常量SID来表示session_id()，$url还可以写成$url=&amp;#039;&amp;lt;a href=&amp;quot;page2.php?&amp;#039; . SID . &amp;#039;&amp;quot;&amp;gt;下一页&amp;lt;/a&amp;gt;&amp;#039;;&lt;br/&gt;echo $url;&lt;br/&gt;?&amp;gt;&lt;br/&gt;s2.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;session_id($_GET[&amp;#039;s&amp;#039;]);&lt;br/&gt;session_start();&lt;br/&gt;echo &amp;quot;传递的session变量var1的值为：&amp;quot;.$_SESSION[&amp;#039;var1&amp;#039;];&lt;br/&gt;?&amp;gt;&lt;br/&gt;第三种途径：&lt;br/&gt;login.html&lt;br/&gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&amp;gt;&lt;br/&gt;&amp;lt;html&amp;gt;&lt;br/&gt;&amp;lt;head&amp;gt;&lt;br/&gt;&amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;&lt;br/&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=??????&amp;quot;&amp;gt;&lt;br/&gt;&amp;lt;/head&amp;gt;&lt;br/&gt;&amp;lt;body &amp;gt;&lt;br/&gt;请登录：&lt;br/&gt;&amp;lt;form name=&amp;quot;login&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;mylogin1.php&amp;quot;&amp;gt;&lt;br/&gt;用户名:&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br/&gt;口　令:&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;pass&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br/&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;登录&amp;quot;&amp;gt;&lt;br/&gt;&amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;/body&amp;gt;&lt;br/&gt;&amp;lt;/html&amp;gt;&lt;br/&gt;mylogin1.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;$name=$_POST[&amp;#039;name&amp;#039;];&lt;br/&gt;$pass=$_POST[&amp;#039;pass&amp;#039;];&lt;br/&gt;if(!$name &amp;amp;#124;&amp;amp;#124; !$pass) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &amp;quot;用户名或密码为空，请&amp;lt;a href=&amp;#92;&amp;quot;login.html&amp;#92;&amp;quot;&amp;gt;重新登录&amp;lt;/a&amp;gt;&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;die();&lt;br/&gt;}&lt;br/&gt;if (!($name==&amp;quot;laogong&amp;quot; &amp;amp;&amp;amp; $pass==&amp;quot;123&amp;quot;)) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &amp;quot;用户名或密码不正确，请&amp;lt;a href=&amp;#92;&amp;quot;login.html&amp;#92;&amp;quot;&amp;gt;重新登录&amp;lt;/a&amp;gt;&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;die();&lt;br/&gt;}&lt;br/&gt;//注册用户&lt;br/&gt;ob_start();&lt;br/&gt;session_start();&lt;br/&gt;$_SESSION[&amp;#039;user&amp;#039;]= $name;&lt;br/&gt;$psid=session_id();&lt;br/&gt;$fp=fopen(&amp;quot;e:&amp;#92;&amp;#92;tmp&amp;#92;&amp;#92;phpsid.txt&amp;quot;,&amp;quot;w+&amp;quot;);&lt;br/&gt;fwrite($fp,$psid);&lt;br/&gt;fclose($fp);&lt;br/&gt;//身份验证成功，进行相关操作&lt;br/&gt;echo &amp;quot;已登录&amp;lt;br&amp;gt;&amp;quot;;&lt;br/&gt;echo &amp;quot;&amp;lt;a href=&amp;#92;&amp;quot;mylogin2.php&amp;#92;&amp;quot;&amp;gt;下一页&amp;lt;/a&amp;gt;&amp;quot;;&lt;br/&gt;?&amp;gt;&lt;br/&gt;mylogin2.php&lt;br/&gt;&amp;lt;?php&lt;br/&gt;$fp=fopen(&amp;quot;e:&amp;#92;&amp;#92;tmp&amp;#92;&amp;#92;phpsid.txt&amp;quot;,&amp;quot;r&amp;quot;);&lt;br/&gt;$sid=fread($fp,1024);&lt;br/&gt;fclose($fp);&lt;br/&gt;session_id($sid);&lt;br/&gt;session_start();&lt;br/&gt;if(isset($_SESSION[&amp;#039;user&amp;#039;]) &amp;amp;&amp;amp; $_SESSION[&amp;#039;user&amp;#039;]=&amp;quot;laogong&amp;quot; ) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;已登录!&amp;quot;;&lt;br/&gt;}&lt;br/&gt;else {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//成功登录进行相关操作&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &amp;quot;未登录，无权访问&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &amp;quot;请&amp;lt;a href=&amp;#92;&amp;quot;login.html&amp;#92;&amp;quot;&amp;gt;登录&amp;lt;/a&amp;gt;后浏览&amp;quot;;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;die();&lt;br/&gt;}&lt;br/&gt;?&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;另外，关于session保存在数据库的问题，正在研究中...&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%25AE%258C%25E5%2585%25A8php5%25E4%25B9%258Bsession%25E7%25AF%2587&quot; rel=&quot;tag&quot;&gt;完全php5之session篇&lt;/a&gt;</description><category>php+mysql</category><pubDate>Tue, 04 Nov 2008 14:16:02 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?218</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?218</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743065/5192433</fs:itemid></item><item><title>PHP中session的默认实现方式是cookies原理</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743066/5192433/1/item.html</link><description>PHP中session的默认实现方式是cookies原理.&lt;br/&gt;&lt;br/&gt;将session_id存储于客户端中，将session_name等session变量存储与服务器session_path指定的目录中&lt;br/&gt;&lt;br/&gt;每当客户端发送HTTP请求时都会同时发送session_id过去，服务器根据session_id获取相应的值信息&lt;br/&gt;&lt;br/&gt;session_id的发送如果客户端cookies被禁止了那么PHP5会自动采用URL的方式发送&lt;br/&gt;&lt;br/&gt;session的配置项目中&lt;br/&gt;&lt;br/&gt;php.ini中有关session的一些设定会影响到session函数的使用，所以我们先整体了解一下php.ini中有关session的设定。&lt;br/&gt;以php5版本为例&lt;br/&gt;&lt;br/&gt;;处理session存取的模式（预设：files）&lt;br/&gt;session.save_handler = files&lt;br/&gt;&lt;br/&gt;;session档案存放路径（预设：/tmp）&lt;br/&gt;session.save_path = /tmp&lt;br/&gt;&lt;br/&gt;;session使用cookie的功能（预设：启动 1）&lt;br/&gt;session.use_cookies = 1&lt;br/&gt;&lt;br/&gt;;session的名字（预设：PHPSESSID）&lt;br/&gt;session.name = PHPSESSID&lt;br/&gt;&lt;br/&gt;;自动启动（预设：关 0，此处可以改为1）&lt;br/&gt;session.auto_start = 0&lt;br/&gt;&lt;br/&gt;;session使用cookie的生存期，以秒为单位（预设：随浏览器关闭而消失 0）&lt;br/&gt;session.cookie_lifetime = 0&lt;br/&gt;&lt;br/&gt;;session使用cookie的路径（预设：与domian相同或根路径 /）&lt;br/&gt;session.cookie_path = /&lt;br/&gt;&lt;br/&gt;;session使用cookie的域名称（预设：空）&lt;br/&gt;session.cookie_domain =&lt;br/&gt;&lt;br/&gt;;处理连续资料的方式，本功能只有WDDX模组或PHP内部使用（预设：php）&lt;br/&gt;session.serialize_handler = php&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;;按千分之一的比率进行垃圾收集&lt;br/&gt;;垃圾收集的处理几率（预设：1）&lt;br/&gt;session.gc_probability = 1&lt;br/&gt;;设置进程比率，（php5新增参数，预设：1000）&lt;br/&gt;session.gc_divisor = 1000&lt;br/&gt;&lt;br/&gt;;（垃圾收集）被处理前的生存期（预设：1440[秒]）&lt;br/&gt;session.gc_maxlifetime = 1440&lt;br/&gt;&lt;br/&gt;;PHP 4.2和以前的版本都有个BUG,即使你禁止了&quot;允许注册全局变量&quot;.仍然可以让你在全局变量范围中初始化一个SESSION的值&lt;br/&gt;;PHP 4.3 和以后的版本会发出相应的警告,你可以禁止警告.PHP5中,只有你打开了bug_compat_42(=ON),警告才会显示.&lt;br/&gt;session.bug_compat_42，0&lt;br/&gt;session.bug_compat_warn = 1&lt;br/&gt;&lt;br/&gt;;session在重新整理时检查session是否还存在（预设：空）&lt;br/&gt;session.referer_check =&lt;br/&gt;&lt;br/&gt;;特别设定session值的长度（预设：关）&lt;br/&gt;session.entropy_length = 0&lt;br/&gt;&lt;br/&gt;;特别设定session值的文件&lt;br/&gt;session.entropy_file =&lt;br/&gt;&lt;br/&gt;;使用cache限制器（预设：不要cache）&lt;br/&gt;session.cache_limiter = nocache&lt;br/&gt;&lt;br/&gt;;使用cache的生存期&lt;br/&gt;session.cache_expire = 180&lt;br/&gt;&lt;br/&gt;;使用sid值（session_id）传送模式（基于安全，预设：关）&lt;br/&gt;session.use_trans_sid = 0&lt;br/&gt;&lt;br/&gt;;选择一个HASH函数,0为MD5(128比特强度),1为SHA-1(160比特强度)&lt;br/&gt;session.hash_function = 0&lt;br/&gt;&lt;br/&gt;;定义当转换2进制hash数据为一些可读的数据时,每个字符存储多少个比特.&lt;br/&gt;;4 比特: 0-9, a-f&lt;br/&gt;;5 比特: 0-9, a-v&lt;br/&gt;;6 比特: 0-9, a-z, A-Z, &quot;-&quot;, &quot;,&quot;&lt;br/&gt;session.hash_bits_per_character = 5&lt;br/&gt;&lt;br/&gt;;URL重指向的标签&lt;br/&gt;url_rewriter.tags = &quot;a=href,area=href,frame=src,input=src,form=fakeentry&quot;&lt;br/&gt;&lt;br/&gt;对以上设置进行修改以后应该重启Apache服务器，以加载以上的修改。&lt;br/&gt;&lt;br/&gt;在使用session时一般也就是以下几个步骤：&lt;br/&gt;1.启动session，使用session_start()函数；&lt;br/&gt;如果使用的状态是cookie base的session传递方式，之后程式的开头都必须使用session_start()函数，而且一定要放在页面开头，之前不能有任何结果输出（比如：echo输出或者html）&lt;br/&gt;如果在php.ini的设置中session.use_trans_sid = 1，点击页面上的连接可以正常传值到第二页，网址会自动加上(举例)[?PHPSESSID=8234c3f661bd1eac450c23d5650e0881]&lt;br/&gt;如果在php.ini的设置中session.use_trans_sid = 0，需要使用URL的方式传递session id，[SID]是php在启动session后自动产生的变量，可以在URL中使用，如：第二页(URLs)&lt;br/&gt;传递过来的第二页也要先启动session，调用session_start()函数。&lt;br/&gt;&lt;br/&gt;2.注册session，不推荐使用session_register()函数，使用$_SESSION[]来注册；&lt;br/&gt;需要先调用session_start()函数，使用$_SESSION[&quot;session_name&quot;] = &quot;session_value&quot;;的方式注册session&lt;br/&gt;&lt;br/&gt;3.清楚session，使用session_destroy()函数&lt;br/&gt;结束session，同时删除session文件，需要事先调用过session_start()&lt;br/&gt;&lt;br/&gt;4.取得session的id，使用session_id()函数&lt;br/&gt;&lt;br/&gt;5.查看session是否已被注册,使用session_is_registered()函数&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;下面再将跟session有关的函数罗列一下，用到自己查php手册即可&lt;br/&gt;session_cache_expire ;得到目前cache的存活时间&lt;br/&gt;session_cache_limiter ;得到或设计目前cache的限制器&lt;br/&gt;session_decode ;从某一字符串进行session资料的解码&lt;br/&gt;session_destroy ;注销一个session&lt;br/&gt;session_encode ;把session字符串进行编码&lt;br/&gt;session_id ;得到或设定目前的session id&lt;br/&gt;session_is_registered ;检测session是否已经建立&lt;br/&gt;session_module_name ;取得或设定目前session的组能&lt;br/&gt;session_name ;取得或设定目前session的名称（预设：PHPSESSID）&lt;br/&gt;session_regenerate_id ;更新当前的session id&lt;br/&gt;session_register ;注册session&lt;br/&gt;session_save_path ;得到或设定目前session文件的存储路径&lt;br/&gt;session_start ;启动session&lt;br/&gt;session_unregister ;注销某个指定的session&lt;br/&gt;session_unset ;释放所有session里的资料&lt;br/&gt;session_write_close ;写入session资料并结束session功能&lt;br/&gt;session_set_save_handler;设定使用者session的存储方式&lt;br/&gt;session_get_cookie_params ;取得session在cookie的参数&lt;br/&gt;session_set_cookie_params ;设定session在cookie的参数 &lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=sessioncookies&quot; rel=&quot;tag&quot;&gt;sessioncookies&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%258E%259F%25E7%2590%2586&quot; rel=&quot;tag&quot;&gt;原理&lt;/a&gt;</description><category>php+mysql</category><pubDate>Tue, 04 Nov 2008 13:25:03 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?217</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?217</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743066/5192433</fs:itemid></item><item><title>.__set() __get() __isset() __unset()四个方法的应用</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743067/5192433/1/item.html</link><description>一般来说，总是把类的属性定义为private，这更符合现实的逻辑。但是，对属性的读取和赋值操作是非常频繁的，因此在PHP5中，预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。&lt;br/&gt;上一节中，我们为每个属性做了设置和获取的方法，在PHP5中给我们提供了专门为属性设置值和获取值的方法，“__set()”和“__get()”这两个方法，这两个方法不是默认存在的，而是我们手工添加到类里面去的，像构造方法(__construct())一样,类里面添加了才会存在，可以按下面的方式来添加这两个方法，当然也可以按个人的风格来添加：&lt;br/&gt;//__get()方法用来获取私有属性&lt;br/&gt;private function__get($property_name)&lt;br/&gt;&amp;#123;&lt;br/&gt;if(isset($this-&gt;$property_name))&lt;br/&gt;&amp;#123;&lt;br/&gt;return($this-&gt;$property_name);&lt;br/&gt;&amp;#125;else&lt;br/&gt;&amp;#123;&lt;br/&gt;return(NULL);&lt;br/&gt;&amp;#125;&lt;br/&gt;&amp;#125;&lt;br/&gt;//__set()方法用来设置私有属性&lt;br/&gt;private function__set($property_name,$value)&lt;br/&gt;&amp;#123;&lt;br/&gt;$this-&gt;$property_name=$value;&lt;br/&gt;&amp;#125;&lt;br/&gt;__get()方法：这个方法用来获取私有成员属性值的,有一个参数，参数传入你要获取的成员属性的名称，返回获取的属性值，这个方法不用我们手工的去调用，因为我们也可以把这个方法做成私有的方法，是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了，是不能直接获取值的（比如：“echo $p1-&gt;name”这样直接获取是错误的），但是如果你在类里面加上了这个方法，在使用“echo $p1-&gt;name”这样的语句直接获取值的时候就会自动调用__get($property_name)方法，将属性name传给参数$property_name，通过这个方法的内部执行，返回我们传入的私有属性的值。如果成员属性不封装成私有的，对象本身就不会去自动调用这个方法。&lt;br/&gt;__set()方法：这个方法用来为私有成员属性设置值的，有两个参数，第一个参数为你要为设置值的属性名，第二个参数是要给属性设置的值，没有返回值。这个方法同样不用我们手工去调用，它也可以做成私有的，是在直接设置私有属性值的时候自动调用的，同样属性私有的已经被封装上&lt;br/&gt;了，如果没有__set()这个方法，是不允许的，比如：$this-&gt;name=‘zhangsan’,这样会出错，但是如果你在类里面加上了__set($property_name, $value)这个方法，在直接给私有属性赋值的时候，就会自动调用它，把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value，通过这个方法的执行，达到赋值的目的。如果成员属性不封装成私有的，对象本身就不会去自动调用这个方法。为了不传入非法的值，还可以在这个方法给做一下判断。代码如下：&lt;br/&gt;&lt;?php&lt;br/&gt;classPerson&lt;br/&gt;&amp;#123;&lt;br/&gt;//下面是人的成员属性， 都是封装的私有成员&lt;br/&gt;private $name;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //人的名子&lt;br/&gt;private $sex;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//人的性别&lt;br/&gt;private $age;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//人的年龄&lt;br/&gt;//__get()方法用来获取私有属性&lt;br/&gt;private function__get($property_name)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;在直接获取私有属性值的时候，自动调用了这个__get()方法&lt;br/&gt;&quot;;&lt;br/&gt;if(isset($this-&gt;$property_name))&lt;br/&gt;&amp;#123;&lt;br/&gt;return($this-&gt;$property_name);&lt;br/&gt;&amp;#125;&lt;br/&gt;else&lt;br/&gt;&amp;#123;&lt;br/&gt;return(NULL);&lt;br/&gt;&amp;#125;&lt;br/&gt;&amp;#125;&lt;br/&gt;//__set()方法用来设置私有属性&lt;br/&gt;private function__set($property_name,$value)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;在直接设置私有属性值的时候，自动调用了这个__set()方法为私有属性赋值&lt;br/&gt;&quot;;&lt;br/&gt;$this-&gt;$property_name=$value;&lt;br/&gt;&amp;#125;&lt;br/&gt;&amp;#125;&lt;br/&gt;$p1=newPerson();&lt;br/&gt;//直接为私有属性赋值的操作， 会自动调用__set()方法进行赋值&lt;br/&gt;$p1-&gt;name=&quot;张三&quot;;&lt;br/&gt;$p1-&gt;sex=&quot;男&quot;;&lt;br/&gt;$p1-&gt;age=20;&lt;br/&gt;//直接获取私有属性的值， 会自动调用__get()方法，返回成员属性的值&lt;br/&gt;echo&quot;姓名：&quot;.$p1-&gt;name.&quot;&lt;br/&gt;&quot;;&lt;br/&gt;echo&quot;性别：&quot;.$p1-&gt;sex.&quot;&lt;br/&gt;&quot;;&lt;br/&gt;echo&quot;年龄：&quot;.$p1-&gt;age.&quot;&lt;br/&gt;&quot;;&lt;br/&gt;?&gt;&lt;br/&gt;程序执行结果：&lt;br/&gt;在直接设置私有属性值的时候，自动调用了这个__set()方法为私有属性赋值&lt;br/&gt;在直接设置私有属性值的时候，自动调用了这个__set()方法为私有属性赋值&lt;br/&gt;在直接设置私有属性值的时候，自动调用了这个__set()方法为私有属性赋值&lt;br/&gt;在直接获取私有属性值的时候，自动调用了这个__get()方法&lt;br/&gt;姓名：张三&lt;br/&gt;在直接获取私有属性值的时候，自动调用了这个__get()方法&lt;br/&gt;性别：男&lt;br/&gt;在直接获取私有属性值的时候，自动调用了这个__get()方法&lt;br/&gt;年龄：20&lt;br/&gt;以上代码如果不加上__get()和__set()方法，程序就会出错，因为不能在类的外部操作私有成员，而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。&lt;br/&gt;__isset()方法：在看这个方法之前我们看一下“isset()”函数的应用，isset()是测定变量是否设定用的函数，传入一个变量作为参数，如果传入的变量存在则传回true，否则传回false。那么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢？分两种情况，如果对象里面成员是公有的，我们就可以使用这个函数来测定成员属性，如果是私有的成员属性，这个函数就不起作用了，原因就是因为私有的被封装了，在外部不可见。那么我们就不可以在对象的外部使用“isset()”函数来测定私有成员属性是否被设定了呢？可以，你只要在类里面加上一个“__isset()”方法就可以了，当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设定时，就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作，“__isset()”方法也可以做成私有的。你可以在类里面加上下面这样的代码就可以了：&lt;br/&gt;private function__isset($nm)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;当在类外部使用isset()函数测定私有成员$nm时，自动调用&lt;br/&gt;&quot;;&lt;br/&gt;return isset($this-&gt;$nm);&lt;br/&gt;&amp;#125;&lt;br/&gt;__unset()方法：看这个方法之前呢，我们也先来看一下“unset()”这个函数，“unset()”这个函数的作用是删除指定的变量且传回true，参数为要删除的变量。那么如果在一个对象外部去删除对象内部的成员属性用“unset()”函数可不可以呢，也是分两种情况，如果一个对象里面的成员属性是公有的，就可以使用这个函数在对象外面删除对象的公有属性，如果对象的成员属性是私有的，我使用这个函数就没有权限去删除，但同样如果你在一个对象里面加上“__unset()”这个方法，就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后，在对象外部使用“unset()”函数删除对象内部的私有成员属性时，自动调用“__unset()”函数来帮&lt;br/&gt;我们删除对象内部的私有成员属性，这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码就可以了：&lt;br/&gt;private function__unset($nm)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;当在类外部使用unset()函数来删除私有成员时自动调用的&lt;br/&gt;&quot;;&lt;br/&gt;unset($this-&gt;$nm);&lt;br/&gt;&amp;#125;&lt;br/&gt;我们来看一个完整的实例：&lt;br/&gt;&lt;?php&lt;br/&gt;classPerson&lt;br/&gt;&amp;#123;&lt;br/&gt;//下面是人的成员属性&lt;br/&gt;private $name;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //人的名子&lt;br/&gt;private $sex;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//人的性别&lt;br/&gt;private $age;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//人的年龄&lt;br/&gt;//__get()方法用来获取私有属性&lt;br/&gt;private function__get($property_name)&lt;br/&gt;&amp;#123;&lt;br/&gt;if(isset($this-&gt;$property_name))&lt;br/&gt;&amp;#123;&lt;br/&gt;return($this-&gt;$property_name);&lt;br/&gt;&amp;#125;else&amp;#123;&lt;br/&gt;return(NULL);&lt;br/&gt;&amp;#125;&lt;br/&gt;&amp;#125;&lt;br/&gt;//__set()方法用来设置私有属性&lt;br/&gt;private function__set($property_name,$value)&lt;br/&gt;&amp;#123;&lt;br/&gt;$this-&gt;$property_name=$value;&lt;br/&gt;&amp;#125;&lt;br/&gt;//__isset()方法&lt;br/&gt;private function__isset($nm)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;isset()函数测定私有成员时，自动调用&lt;br/&gt;&quot;;&lt;br/&gt;return isset($this-&gt;$nm);&lt;br/&gt;&amp;#125;&lt;br/&gt;//__unset()方法&lt;br/&gt;private function__unset($nm)&lt;br/&gt;&amp;#123;&lt;br/&gt;echo&quot;当在类外部使用unset()函数来删除私有成员时自动调用的&lt;br/&gt;&quot;;&lt;br/&gt;unset($this-&gt;$nm);&lt;br/&gt;&amp;#125;&lt;br/&gt;&amp;#125;&lt;br/&gt;$p1=newPerson();&lt;br/&gt;$p1-&gt;name=&quot;this is a person name&quot;;&lt;br/&gt;//在使用isset()函数测定私有成员时，自动调用__isset()方法帮我们完成，返回结果为true&lt;br/&gt;echovar_dump(isset($p1-&gt;name)).&quot;&lt;br/&gt;&quot;;&lt;br/&gt;echo $p1-&gt;name.&quot;&lt;br/&gt;&quot;;&lt;br/&gt;//在使用unset()函数删除私有成员时，自动调用__unset()方法帮我们完成，删除name私有属性&lt;br/&gt;unset($p1-&gt;name);&lt;br/&gt;//已经被删除了， 所这行不会有输出&lt;br/&gt;echo $p1-&gt;name;&lt;br/&gt;?&gt;&lt;br/&gt;输出结果为：&lt;br/&gt;isset()函数测定私有成员时，自动调用&lt;br/&gt;bool(true)&lt;br/&gt;this is a person name&lt;br/&gt;当在类外部使用unset()函数来删除私有成员时自动调用的&lt;br/&gt;__set()、__get()、__isset()、__unset()这四个方法都是我们添加到对象里面的，在需要时自动调用的，来完成在对象外部对对象内部私有属性的操作。&lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=__set%2528%2529&quot; rel=&quot;tag&quot;&gt;  set()&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=__get%2528%2529&quot; rel=&quot;tag&quot;&gt;  get()&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=__isset%2528%2529&quot; rel=&quot;tag&quot;&gt;  isset()&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=__unset%2528%2529%25E5%259B%259B%25E4%25B8%25AA%25E6%2596%25B9%25E6%25B3%2595%25E7%259A%2584%25E5%25BA%2594%25E7%2594%25A8__unset%2528%2529&quot; rel=&quot;tag&quot;&gt;  unset()四个方法的应用  unset()&lt;/a&gt;</description><category>php+mysql</category><pubDate>Sun, 02 Nov 2008 11:19:13 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?216</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?216</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743067/5192433</fs:itemid></item><item><title>常用的CSS命名规则</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743068/5192433/1/item.html</link><description>头：header &lt;br/&gt;内容：content/container &lt;br/&gt;尾：footer &lt;br/&gt;导航：nav &lt;br/&gt;侧栏：sidebar &lt;br/&gt;栏目：column &lt;br/&gt;页面外围控制整体布局宽度：wrapper &lt;br/&gt;左右中：left right center &lt;br/&gt;登录条：loginbar &lt;br/&gt;标志：logo &lt;br/&gt;广告：banner &lt;br/&gt;页面主体：main &lt;br/&gt;热点：hot &lt;br/&gt;新闻：news &lt;br/&gt;下载：download &lt;br/&gt;子导航：subnav &lt;br/&gt;菜单：menu &lt;br/&gt;子菜单：submenu &lt;br/&gt;搜索：search &lt;br/&gt;友情链接：friendlink &lt;br/&gt;页脚：footer &lt;br/&gt;版权：copyright &lt;br/&gt;滚动：scroll &lt;br/&gt;内容：content &lt;br/&gt;标签页：tab &lt;br/&gt;文章列表：list &lt;br/&gt;提示信息：msg &lt;br/&gt;小技巧：tips &lt;br/&gt;栏目标题：title &lt;br/&gt;加入：joinus &lt;br/&gt;指南：guild &lt;br/&gt;服务：service &lt;br/&gt;注册：regsiter &lt;br/&gt;状态：status &lt;br/&gt;投票：vote &lt;br/&gt;合作伙伴：partner &lt;br/&gt;&lt;br/&gt;(二)注释的写法: &lt;br/&gt;/* Footer */ &lt;br/&gt;内容区 &lt;br/&gt;/* End Footer */ &lt;br/&gt;&lt;br/&gt;(三)id的命名: &lt;br/&gt;(1)页面结构 &lt;br/&gt;容器: container &lt;br/&gt;页头：header &lt;br/&gt;内容：content/container &lt;br/&gt;页面主体：main &lt;br/&gt;页尾：footer &lt;br/&gt;导航：nav &lt;br/&gt;侧栏：sidebar &lt;br/&gt;栏目：column &lt;br/&gt;页面外围控制整体布局宽度：wrapper &lt;br/&gt;左右中：left right center &lt;br/&gt;(2)导航 &lt;br/&gt;导航：nav &lt;br/&gt;主导航：mainbav &lt;br/&gt;子导航：subnav &lt;br/&gt;顶导航：topnav &lt;br/&gt;边导航：sidebar &lt;br/&gt;左导航：leftsidebar &lt;br/&gt;右导航：rightsidebar &lt;br/&gt;菜单：menu &lt;br/&gt;子菜单：submenu &lt;br/&gt;标题: title &lt;br/&gt;摘要: summary &lt;br/&gt;(3)功能 &lt;br/&gt;标志：logo &lt;br/&gt;广告：banner &lt;br/&gt;登陆：login &lt;br/&gt;登录条：loginbar &lt;br/&gt;注册：regsiter &lt;br/&gt;搜索：search &lt;br/&gt;功能区：shop &lt;br/&gt;标题：title &lt;br/&gt;加入：joinus &lt;br/&gt;状态：status &lt;br/&gt;按钮：btn &lt;br/&gt;滚动：scroll &lt;br/&gt;标签页：tab &lt;br/&gt;文章列表：list &lt;br/&gt;提示信息：msg &lt;br/&gt;当前的: current &lt;br/&gt;小技巧：tips &lt;br/&gt;图标: icon &lt;br/&gt;注释：note &lt;br/&gt;指南：guild &lt;br/&gt;服务：service &lt;br/&gt;热点：hot &lt;br/&gt;新闻：news &lt;br/&gt;下载：download &lt;br/&gt;投票：vote &lt;br/&gt;合作伙伴：partner &lt;br/&gt;友情链接：link &lt;br/&gt;版权：copyright &lt;br/&gt;&lt;br/&gt;(四)class的命名: &lt;br/&gt;(1)颜色:使用颜色的名称或者16进制代码,如 &lt;br/&gt;.red &amp;#123; color: red; &amp;#125; &lt;br/&gt;.f60 &amp;#123; color: #f60; &amp;#125; &lt;br/&gt;.ff8600 &amp;#123; color: #ff8600; &amp;#125; &lt;br/&gt;(2)字体大小,直接使用&quot;font+字体大小&quot;作为名称,如 &lt;br/&gt;.font12px &amp;#123; font-size: 12px; &amp;#125; &lt;br/&gt;.font9pt &amp;#123;font-size: 9pt; &amp;#125; &lt;br/&gt;(3)对齐样式,使用对齐目标的英文名称,如 &lt;br/&gt;.left &amp;#123; float:left; &amp;#125; &lt;br/&gt;.bottom &amp;#123; float:bottom; &amp;#125; &lt;br/&gt;(4)标题栏样式,使用&quot;类别+功能&quot;的方式命名,如 &lt;br/&gt;.barnews &amp;#123; &amp;#125; &lt;br/&gt;.barproduct &amp;#123; &amp;#125; &lt;br/&gt;注意事项:: &lt;br/&gt;1.一律小写; &lt;br/&gt;2.尽量用英文; &lt;br/&gt;3.不加中杠和下划线; &lt;br/&gt;4.尽量不缩写，除非一看就明白的单词. &lt;br/&gt;主要的 master.css &lt;br/&gt;模块 module.css &lt;br/&gt;基本共用 base.css &lt;br/&gt;布局，版面 layout.css &lt;br/&gt;主题 themes.css &lt;br/&gt;专栏 columns.css &lt;br/&gt;文字 font.css &lt;br/&gt;表单 forms.css &lt;br/&gt;补丁 mend.css &lt;br/&gt;打印 print.css &lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%25B8%25B8%25E7%2594%25A8%25E7%259A%2584css%25E5%2591%25BD%25E5%2590%258D%25E8%25A7%2584%25E5%2588%2599&quot; rel=&quot;tag&quot;&gt;常用的css命名规则&lt;/a&gt;</description><category>css前台</category><pubDate>Sun, 02 Nov 2008 09:31:39 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?215</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?215</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743068/5192433</fs:itemid></item><item><title>eclipse快捷键大全</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743069/5192433/1/item.html</link><description>1. 常用快捷键 &lt;br/&gt;(1)Ctrl+Space &lt;br/&gt;说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。 &lt;br/&gt;注:避免输入法的切换设置与此设置冲突&lt;br/&gt;(2)Ctrl+Shift+Space &lt;br/&gt;说明:变量提示 &lt;br/&gt;(3)Ctrl+/ &lt;br/&gt;说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+&amp;#92;&lt;br/&gt;(4)Ctrl+Shift+/ &lt;br/&gt;说明:添加/* */注释&lt;br/&gt;(5)Ctrl+Shift+&amp;#92; &lt;br/&gt;说明:消除/* */注释&lt;br/&gt;(6)Ctrl+Shift+F &lt;br/&gt;说明:自动格式化代码&lt;br/&gt;(7)Ctrl+1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//***************************** &lt;br/&gt;说明:批量修改源代码中的变量名,此外还可用在catch块上.&lt;br/&gt;(8)Ctril+F6 &lt;br/&gt;说明:界面切换&lt;br/&gt;(9)Ctril+Shift+M &lt;br/&gt;说明:查找所需要得包&lt;br/&gt;(10)Ctril+Shift+O &lt;br/&gt;说明:自动引入所需要得包&lt;br/&gt;(11)Ctrl+Alt+S &lt;br/&gt;说明:源代码得快捷菜单。其中的Generate getters and setters 和 Surround with try/catch &lt;br/&gt;block比较常用.建议把它们添加为快捷键.快捷键设置在windows-&gt;preferences-&gt;Workbench-&gt;Keys&lt;br/&gt;2. 快捷键列表 &lt;br/&gt;编辑 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 查找并替换 Ctrl+F &lt;br/&gt;文本编辑器 查找上一个 Ctrl+Shift+K &lt;br/&gt;文本编辑器 查找下一个 Ctrl+K &lt;br/&gt;全局 撤销 Ctrl+Z &lt;br/&gt;全局 复制 Ctrl+C &lt;br/&gt;全局 恢复上一个选择 Alt+Shift+↓ &lt;br/&gt;全局 剪切 Ctrl+X &lt;br/&gt;全局 快速修正 Ctrl1+1 &lt;br/&gt;全局 内容辅助 Alt+/ &lt;br/&gt;全局 全部选中 Ctrl+A &lt;br/&gt;全局 删除 Delete &lt;br/&gt;全局 上下文信息 Alt+？Alt+Shift+?Ctrl+Shift+Space &lt;br/&gt;Java编辑器 显示工具提示描述 F2 &lt;br/&gt;Java编辑器 选择封装元素 Alt+Shift+↑ &lt;br/&gt;Java编辑器 选择上一个元素 Alt+Shift+← &lt;br/&gt;Java编辑器 选择下一个元素 Alt+Shift+→ &lt;br/&gt;文本编辑器 增量查找 Ctrl+J &lt;br/&gt;文本编辑器 增量逆向查找 Ctrl+Shift+J &lt;br/&gt;全局 粘贴 Ctrl+V &lt;br/&gt;全局 重做 Ctrl+Y&lt;br/&gt;查看 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 放大 Ctrl+= &lt;br/&gt;全局 缩小 Ctrl+-&lt;br/&gt;窗口 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 激活编辑器 F12 &lt;br/&gt;全局 切换编辑器 Ctrl+Shift+W &lt;br/&gt;全局 上一个编辑器 Ctrl+Shift+F6 &lt;br/&gt;全局 上一个视图 Ctrl+Shift+F7 &lt;br/&gt;全局 上一个透视图 Ctrl+Shift+F8 &lt;br/&gt;全局 下一个编辑器 Ctrl+F6 &lt;br/&gt;全局 下一个视图 Ctrl+F7 &lt;br/&gt;全局 下一个透视图 Ctrl+F8 &lt;br/&gt;文本编辑器 显示标尺上下文菜单 Ctrl+W &lt;br/&gt;全局 显示视图菜单 Ctrl+F10 &lt;br/&gt;全局 显示系统菜单 Alt+-&lt;br/&gt;导航 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;Java编辑器 打开结构 Ctrl+F3 &lt;br/&gt;全局 打开类型 Ctrl+Shift+T &lt;br/&gt;全局 打开类型层次结构 F4 &lt;br/&gt;全局 打开声明 F3 &lt;br/&gt;全局 打开外部javadoc Shift+F2 &lt;br/&gt;全局 打开资源 Ctrl+Shift+R &lt;br/&gt;全局 后退历史记录 Alt+← &lt;br/&gt;全局 前进历史记录 Alt+→ &lt;br/&gt;全局 上一个 Ctrl+, &lt;br/&gt;全局 下一个 Ctrl+. &lt;br/&gt;Java编辑器 显示大纲 Ctrl+O &lt;br/&gt;全局 在层次结构中打开类型 Ctrl+Shift+H &lt;br/&gt;全局 转至匹配的括号 Ctrl+Shift+P &lt;br/&gt;全局 转至上一个编辑位置 Ctrl+Q &lt;br/&gt;Java编辑器 转至上一个成员 Ctrl+Shift+↑ &lt;br/&gt;Java编辑器 转至下一个成员 Ctrl+Shift+↓ &lt;br/&gt;文本编辑器 转至行 Ctrl+L&lt;br/&gt;搜索 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 出现在文件中 Ctrl+Shift+U &lt;br/&gt;全局 打开搜索对话框 Ctrl+H &lt;br/&gt;全局 工作区中的声明 Ctrl+G &lt;br/&gt;全局 工作区中的引用 Ctrl+Shift+G&lt;br/&gt;文本编辑 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;文本编辑器 改写切换 Insert &lt;br/&gt;文本编辑器 上滚行 Ctrl+↑ &lt;br/&gt;文本编辑器 下滚行 Ctrl+↓&lt;br/&gt;文件 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 保存 Ctrl+X Ctrl+S &lt;br/&gt;全局 打印 Ctrl+P &lt;br/&gt;全局 关闭 Ctrl+F4 &lt;br/&gt;全局 全部保存 Ctrl+Shift+S &lt;br/&gt;全局 全部关闭 Ctrl+Shift+F4 &lt;br/&gt;全局 属性 Alt+Enter &lt;br/&gt;全局 新建 Ctrl+N&lt;br/&gt;项目 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 全部构建 Ctrl+B&lt;br/&gt;源代码 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;Java编辑器 格式化 Ctrl+Shift+F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //***************** &lt;br/&gt;Java编辑器 取消注释 Ctrl+&amp;#92; &lt;br/&gt;Java编辑器 注释 Ctrl+/ &lt;br/&gt;Java编辑器 添加导入 Ctrl+Shift+M &lt;br/&gt;Java编辑器 组织导入 Ctrl+Shift+O &lt;br/&gt;Java编辑器 使用try/catch块来包围 未设置，太常用了，所以在这里列出,建议自己设置。也可以使用Ctrl+1自动修正。&lt;br/&gt;运行 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 单步返回 F7 &lt;br/&gt;全局 单步跳过 F6 &lt;br/&gt;全局 单步跳入 F5 &lt;br/&gt;全局 单步跳入选择 Ctrl+F5 &lt;br/&gt;全局 调试上次启动 F11 &lt;br/&gt;全局 继续 F8 &lt;br/&gt;全局 使用过滤器单步执行 Shift+F5 &lt;br/&gt;全局 添加/去除断点 Ctrl+Shift+B &lt;br/&gt;全局 显示 Ctrl+D &lt;br/&gt;全局 运行上次启动 Ctrl+F11 &lt;br/&gt;全局 运行至行 Ctrl+R &lt;br/&gt;全局 执行 Ctrl+U&lt;br/&gt;重构 &lt;br/&gt;作用域 功能 快捷键 &lt;br/&gt;全局 撤销重构 Alt+Shift+Z &lt;br/&gt;全局 抽取方法 Alt+Shift+M &lt;br/&gt;全局 抽取局部变量 Alt+Shift+L &lt;br/&gt;全局 内联 Alt+Shift+I &lt;br/&gt;全局 移动 Alt+Shift+V &lt;br/&gt;全局 重命名 Alt+Shift+R &lt;br/&gt;全局 重做 Alt+Shift+Y &lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=eclipse%25E5%25BF%25AB%25E6%258D%25B7%25E9%2594%25AE%25E5%25A4%25A7%25E5%2585%25A8&quot; rel=&quot;tag&quot;&gt;eclipse快捷键大全&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%25BC%2580%25E5%258F%2591php%25E5%25B7%25A5%25E5%2585%25B7&quot; rel=&quot;tag&quot;&gt;开发php工具&lt;/a&gt;</description><category>php+mysql</category><pubDate>Sun, 02 Nov 2008 09:27:03 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?214</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?214</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743069/5192433</fs:itemid></item><item><title>主键和外键</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743070/5192433/1/item.html</link><description>主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 &lt;br/&gt;&lt;br/&gt;必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境，就很难对这些键进行修改，所以在开发阶段就设计好主键和外键就是非常必要和值得的。&lt;br/&gt;&lt;br/&gt;主键：&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途：&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 惟一地标识一行。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 作为一个可以被外键有效引用的对象。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;基于以上这两个用途，下面给出了我在设计物理层面的主键时所遵循的一些原则：&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据，并抱怨它没有什么用处，那就证明它的主键设计地很好。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 主键应该是单列的，以便提高连接和筛选操作的效率。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注：使用复合键的人通常有两个理由为自己开脱，而这两个理由都是错误的。其一是主键应当具有实际意义，然而，让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键，我也反对这种做法，理由是：复合主键常常导致不良的外键，即当连接表成为另一个从表的主表，而依据上面的第二种方法成为这个表主键的一部分，然，这个表又有可能再成为其它从表的主表，其主键又有可能成了其它从表主键的一部分，如此传递下去，越靠后的从表，其主键将会包含越多的列了。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. 永远也不要更新主键。实际上，因为主键除了惟一地标识一行之外，再没有其他的用途了，所以也就没有理由去对它更新。如果主键需要更新，则说明主键应对用户无意义的原则被违反了。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注：这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4. 主键不应包含动态变化的数据，如时间戳、创建时间列、修改时间列等。&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预，就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限，就可能产生认为修改主键的动机，这样，这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E4%25B8%25BB%25E9%2594%25AE%25E5%2592%258C%25E5%25A4%2596%25E9%2594%25AE&quot; rel=&quot;tag&quot;&gt;主键和外键&lt;/a&gt;</description><category>php+mysql</category><pubDate>Thu, 30 Oct 2008 20:02:20 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?213</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?213</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743070/5192433</fs:itemid></item><item><title>存储引擎是什么</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743071/5192433/1/item.html</link><description>&lt;strong&gt;存储引擎是什么？&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;　　MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术，你能够获得额外的速度或者功能，从而改善你的应用的整体功能。&lt;br/&gt;&lt;br/&gt;　　例如，如果你在研究大量的临时数据，你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者，你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。&lt;br/&gt;&lt;br/&gt;　　这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎，可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎，以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。&lt;br/&gt;&lt;br/&gt;　　选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是，其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能，要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL，我们仅需要修改我们使用的存储引擎就可以了。&lt;br/&gt;&lt;br/&gt;　　在这篇文章中，我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面)，相反，我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的，在介绍每一个存储引擎的具体情况之前，我们必须要了解一些基本的问题。&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;存储引擎:MyISAM、MERGE、MEMORY、EXAMPLE&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;　　MyISAM&lt;br/&gt;&lt;br/&gt;　　MyISAM引擎是大多数MySQL安装程序的默认引擎，起源于早期版本MySQL支持的ISAM引擎。这种引擎提供了最佳的性能和功能的组合，尽管它缺少事务处理功能(使用InnoDB或者BDB引擎)并且使用表级锁定。&lt;br/&gt;&lt;br/&gt;　　除非你需要事务处理功能，否则MyISAM引擎可以有效存储和处理绝大多数应用所需的数据。不过如果数据插入和更新操作比读取数据还要多的的应用可能会引起MyISAM引擎性能降低。根据原来的设计思路，MyISAM引擎是针对那些90%以上的数据库访问都是读操作的数据库来优化的。&lt;br/&gt;&lt;br/&gt;　　由于表级锁定，有大量的插入或者更新行的数据库就会成为性能的瓶颈，因为这个表在增加数据的时候被锁定了。幸运的是这种限制在非事务处理数据库中不是个大问题。&lt;br/&gt;&lt;br/&gt;表1. MyISAM小结 &lt;br/&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;br/&gt;&lt;strong&gt;名称&lt;/strong&gt;　　　　　　　MyISAM&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;版本&lt;/strong&gt;　　　　　　　v3.23&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;默认安装&lt;/strong&gt;　　　　　是&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;数据存储限制&lt;/strong&gt;　　　无&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;索引限制&lt;/strong&gt;　　　　　每个表64个索引;每个索引最多16个列&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;事务处理支持&lt;/strong&gt;　　　不支持&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;锁定级别&lt;/strong&gt;　　　　　表级锁定&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;MERGE&lt;br/&gt;&lt;br/&gt;　　MERGE引擎类型允许你把许多&lt;a href=&quot;http://www.chinabyte.com/key/3031/148031.html&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;结构&lt;/span&gt;&lt;/a&gt;相同的表合并为一个表。然后，你可以执行查询，从多个表返回的结果就像从一个表返回的结果一样。每一个合并的表必须有同样的表定义。&lt;br/&gt;&lt;br/&gt;　　MERGE存储引擎在下面这种使用场合会最为有用，如果需要把日志纪录不停的录入MySQL数据库，并且每天、每周或者每个月都创建一个单一的表，而且要制作来自多个表的合计查询，MERGE表这时会非常有效。然而，这项功能有局限性。你只能合并MyISAM表而且必须严格遵守相同的表定义的限制。虽然这看起来好像是一个大问题，但是，如果你使用另外一种表类型(例如InnoDB)，这种合并可能就不需要了。&lt;br/&gt;&lt;br/&gt;表 2. MERGE小结&lt;br/&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;br/&gt;&lt;strong&gt;名称&lt;/strong&gt;　　　　　　MERGE&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;版本&lt;/strong&gt;　　　　　　v3.23.25&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;默认安装&lt;/strong&gt;　　　　是&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;数据存储限制&lt;/strong&gt;　　基本表必须是MyISAM&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;索引限制&lt;/strong&gt;　　　　N/A&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;事务处理支持&lt;/strong&gt;　　否&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;锁定级别&lt;/strong&gt;　　　　表级锁定&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;MEMORY &lt;br/&gt;&lt;br/&gt;　　MEMORY(内存)存储引擎(以前称作HEAP存储引擎)在内存中存储全部数据。一旦MySQL服务器关闭，存储在内存中的任何信息都将丢失。然而，单个表的格式将保留，使你能够创建一个用于存储信息的临时表。这样，每次数据库服务器启动时，你不需要重新创新这个表就可以快速地访问信息。&lt;br/&gt;&lt;br/&gt;　　长期使用MEMORY存储引擎一般来说不是一个好主意，因为数据很容易丢失。然而，如果你有足够的内存，使用基于MEMORY的表在大型数据集中执行复杂的查询是一种非常有效的方法，它能够很大程度的提高性能。&lt;br/&gt;&lt;br/&gt;　　使用MEMORY表的最佳方法是使用一个“select”语句从你原来的基于磁盘的表中选择一个大型的数据集，然后对你需要的具体部分进一步分析那些信息。我过去曾经使用这个技术提取了一个月的网络记录数据，实际上就是从使用ARCHIVE存储引擎制作的表中提取的数据，然后对具体的URL、网站和其它重点进行查询。&lt;br/&gt;&lt;br/&gt;表3.MEMORY小结 &lt;br/&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;br/&gt;&lt;strong&gt;名称&lt;/strong&gt;　　　　　　MEMORY&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;版本&lt;/strong&gt;　　　　　　1.0(从4.1版以后就称作MEMORY)&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;默认安装&lt;/strong&gt;　　　　是&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;数据存储限制&lt;/strong&gt;　　不支持BLOG和文本类型&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;索引限制&lt;/strong&gt;　　　　无&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;事务处理支持&lt;/strong&gt;　　不支持&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;锁定级别&lt;/strong&gt;　　　　表级&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;EXAMPLE&lt;br/&gt;&lt;br/&gt;　　EXAMPLE引擎实际上是一个存储引擎编程的例子，能够用作MySQL系统中其它引擎的基础。EXAMPLE不支持数据插入，对于任何形式的数据库访问来说也不是一个实用的引擎。然而，EXAMPLE是一个很好的指南，指导你如何开发自己的存储引擎，因此对于程序员来说是一个有效的引擎。&lt;br/&gt;&lt;br/&gt;表4. EXAMPLE小结 &lt;br/&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;br/&gt;&lt;strong&gt;名称&lt;/strong&gt;　　　　　　EXAMPLE&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;版本&lt;/strong&gt;　　　　　　4.1.3&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;默认安装&lt;/strong&gt;　　　　否&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;数据存储限制&lt;/strong&gt;　　N/A&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;索引限制&lt;/strong&gt;　　　　N/A&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;事务处理支持&lt;/strong&gt;　　N/A&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;锁定级别&lt;/strong&gt;　　　　N/A&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%25AD%2598%25E5%2582%25A8%25E5%25BC%2595%25E6%2593%258E%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&quot; rel=&quot;tag&quot;&gt;存储引擎是什么&lt;/a&gt;</description><category>php+mysql</category><pubDate>Thu, 30 Oct 2008 18:49:37 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?212</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?212</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743071/5192433</fs:itemid></item><item><title>图像替换技术</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743072/5192433/1/item.html</link><description>&lt;br/&gt;[code]&amp;lt;style&amp;gt;&lt;br/&gt;#header {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padding: 25px 0 0 0;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;overflow: hidden;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background-image: url(http://ximicc.com/attachments/month_0803/sample-opaque.gif);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background-repeat: no-repeat;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height: 0px !important;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height /**/:25px;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br/&gt;&amp;lt;/style&amp;gt;&lt;br/&gt;&amp;lt;h3 id=&amp;quot;header&amp;quot;&amp;gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Revised Image Replacement&lt;br/&gt;&amp;lt;/h3&amp;gt;[/code]&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%259B%25BE%25E5%2583%258F%25E6%259B%25BF%25E6%258D%25A2%25E6%258A%2580%25E6%259C%25AF&quot; rel=&quot;tag&quot;&gt;图像替换技术&lt;/a&gt;</description><category>css前台</category><pubDate>Wed, 29 Oct 2008 17:52:56 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?211</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?211</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743072/5192433</fs:itemid></item><item><title>Web与排版学上的字体问题</title><link>http://item.feedsky.com/~feedsky/simpman/~7084069/139743073/5192433/1/item.html</link><description>关于字体的讨论，其实无论是国外还是国内，都已经有不少，可是我发现绝大部分的内容或者有失偏颇，或者不够全面，下面我试图将自己一段时间内的观点总结一下，以求提出一个比较容易接受的 CSS 字体选择的&lt;br/&gt;。 &lt;br/&gt;&lt;br/&gt;事关大小&lt;br/&gt;&lt;br/&gt;字体的大小总是一个困扰人的问题，用绝对单位还是用相对单位？或者具体来说，用什么单位？ex? em? pt? px? 百分比? 让我们看看 CSS 2.1 Spec 中的说明:&lt;br/&gt;&lt;br/&gt;1、相对大小包括：em, ex, px &lt;br/&gt;2、绝对大小包括：in, cm, mm, pt, pc &lt;br/&gt;3、em 就是相对 font-size 制定的大小而言的，例如 margin: 1.2em 就是指设置 1.2 个字符宽度的 margin，当 em 本身用于 font-size 时，指的是它所继承元素的相对大小。 &lt;br/&gt;4、百分比也是相对 font-size 而言的。 &lt;br/&gt;&lt;br/&gt;因此我认为，em 和百分比都不适合设置字体的大小，因为相互变动的因素太多了，修改一个地方就有可能影响很多其他的地方。ex 是根据拉丁字母的 x 的高度而言的，这不适合汉字的大小，所以也否决了。px 是根据当前显示设备的解析度而言的，同一个 px 对应不同的设备——比如屏幕或纸张——实际的大小会有一定差异。&lt;br/&gt;&lt;br/&gt;所以我认为，如果网页中应该存在作为绝对参照系的长度，那么 pt 和 px 应该是首选，其他的长度根据这个绝对参照系，按照百分比或者 em 来变动。&lt;br/&gt;&lt;br/&gt;下面谈谈网页和印刷中大小造成的差异。99% 的网页是用来在屏幕上阅读的，而问题在于，屏幕的解析度要比纸张低得多，所以如果直接把字体按照纸张上印刷的那个大小显示，肯定是看不清的，仅就英文字体而言，许多细微的点划、衬线都没法在那么低的解析度下表现出来，所以我们只能用专门设计给屏幕显示的字体。&lt;br/&gt;&lt;br/&gt;这些字体的优劣是很难评述的，有一种看法认为，尽管纸张印刷中都倾向于有衬线 (serif) 的字体比无衬线 (sans-serif) 的要易读，但屏幕上无衬线的字体反而要好一些。所以微软把 Verdana 吹捧为了最适合网页使用的字体。我通常也偏向于使用 Verdana、Arial 多于 Times、Georgia。&lt;br/&gt;&lt;br/&gt;是不是没有好的字体呢？不是，Sabon、Minion、Jansen-Text, Adobe Caslon, Adobe Garamond 等等都是非常适合阅读的字体，只不过这些字体都是商业的，也就是说，不是可以免费得到的。Microsoft 提供的字体中也有质量比较好的，比如 Hermann Zapf 亲自监制的 Palatino Linotype。事实上，Adobe 选择的 35 种标准的 PostScript 字体 (Times Roman, Helvetica, Courier, Palatino 等等) 中，Zapf 设计的 Palatino 就是使用最广泛的，也最容易阅读的字体。这些字体由 URW 免费提供了，是质量很好的字体，可惜的是并非应用得特别广泛 (不过大部分的 Linux Distribution 中都包括 urw-fonts 这个 package，大部分的 TeX distribution 也都包括 urw 这个 package)。&lt;br/&gt;&lt;br/&gt;说到 Palatino, 我们也可以看看 Web 上 Palatino 和 Palatino Linotype 的区别：&lt;br/&gt;&lt;br/&gt;Palatino 的比较（点击下图可放大）&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;相信可以看出，高质量的 Type1 字体，本身就带有字体圆整效果，这是比 Truetype 优越的地方。&lt;br/&gt;&lt;br/&gt;我的建议&lt;br/&gt;我的建议是什么呢？恐怕还是老生常谈：&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;1、用pt 作为绝对参照系。 &lt;br/&gt;2、中文字体尽量使用 9pt, 10.5 和 12pt 中的一种。 &lt;br/&gt;3、一定要仔细调整行高，避免调整字母间距。 &lt;br/&gt;4、选择字体的时候，先考虑 Type1，再考虑 Truetype，最后考虑都没有的情况，比如我想用 Palatino, 那么应该：font-family: Palatino, &quot;Palatino Linotype&quot;, serif;。 &lt;/span&gt;&lt;br/&gt;－－－－－－－－－引用分隔线－－－－－－－－－&lt;br/&gt;&lt;br/&gt;9pt, 10.5 和 12pt 的汉字之所以显示效果很好，是因为在truetype中嵌入了相应的优化过的点阵字体，这种技术好像是叫做hint。&lt;br/&gt;&lt;br/&gt;有些繁体或者日文汉字是可以在8pt等极小尺寸下优秀显示的，也是因为嵌入了特别优化过的点阵字体。&lt;br/&gt;&lt;br/&gt;对英文来说，在屏幕上衬线字体的显示确实不如无衬线字体。不过，汉字呢？似乎是完全相反的情况。 屏幕上的宋体恐怕比黑体看得舒服的不是一点点，当然，是因为分辨率的原因。&lt;br/&gt;&lt;br/&gt;Type1和Truetype 的区别？这个我确实不知道，需要了解一下。&lt;br/&gt;&lt;br/&gt;ps：相关概念 &lt;br/&gt;&lt;br/&gt; 1、点阵字、TrueType字、PS字&lt;br/&gt;&lt;br/&gt;点阵字:&amp;nbsp;&amp;nbsp;一般用于屏幕显示，如软件菜单文字。这种字体最大的缺点是精度低，放大、变形后有很严重的锯齿，不能作为印刷字体。 &lt;br/&gt;TrueType字体: 是由直线、曲线等图形数据来描述文字的轮廓，采用二次曲线，一套字体即可用于屏幕显示又可作为打印字体。是使用最为广泛的字体。 &lt;br/&gt;PS字:&amp;nbsp;&amp;nbsp;也就是PostScript字体，与TrueType字体一样也是由直线、曲线等图形数据来描述文字的轮廓。&amp;nbsp;&amp;nbsp;&lt;br/&gt;TrueType字与PS字的区别： TrueType字体装在电脑中，屏幕显示与打印使用同一套字体。而PS字则不同，在照排机中装入PS字，用于最终打印输出，而电脑中装入与PS字相对应的点阵字，用于屏幕显示。输出时电脑发送字体的代码到照排机中，然后照排机根据字体代码寻找相应的PS字。&lt;br/&gt;&lt;br/&gt;TrueType字库是由Microsoft和Apple在1991年共同推出的，供前端排版时显示和打印输出，虽然打印质量没有PostScript字库好，但是完全可以满足一般用字的需求。&lt;br/&gt;&lt;br/&gt;PostScript是Adobe于1985年发表的文件描述技术，按该 PostScript页面描述语言语法定义的字库就是PostScipt字库，其主要特点是可以精确地描述绘制字型，因而按印刷工业中的质量标准，PostScript字库在平滑性、细节和忠实性方面比TrueType字库要好。PostScript字库一般装于后端输出设备如激光打印或RIP软件中，而它在前端的使用需要依靠特殊的软件比如Adobe 的ATM，由于PostScript字库在操作系统软件中的兼容性不是很理想，目前主要还是用于后端输出。&lt;br/&gt;&lt;br/&gt;OpenType也叫Type 2字体，是由Microsoft和Adobe公司从1995年开始联合开发的另外一种字体格式。它也是一种PostScript轮廓字体，比TrueType更为强大，最明显的一个好处就是可以把PostScript字体嵌入到TrueType的软件中，因此不管在屏幕显示和打印都可以获得优秀的输出质量。同时支持Windows、Mac和Linux系统平台，支持Unicode大字符集，还有版权保护。此外OpenType还可以包含连体字、上下标、花饰字等丰富的排版特性。可以说它是Type 1和TrueType的超集。&lt;br/&gt;&lt;br/&gt;注：OpenType标准定义了OpenType文件名称的后缀名。包含TureType字体的OpenType文件后缀名为.ttf，包含PostScript字体的文件后缀名为.OTF。如果是包含一系列TrueType字体的字体包文件，那么后缀名为.TTC&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; 对于中文字体的情况有所不同，中文字体在屏幕上的清晰显示依赖的是点阵字体，或者简单的说，就是微软随 Windows 提供的宋体和新宋体 (simsun &amp; nsimsun)，这套字体是华康公司 (Dynalab) 设计的，对 9pt 到 12pt 左右的字体都设计了对应的点阵字体。其中使用得最广泛的是 9pt, 10.5pt 和 12pt 的字体：&lt;br/&gt;&lt;br/&gt;那么比这个大小要大的汉字呢？就要依赖操作系统的字体圆整 (anti-alias，以下简称 aa) 技术了，一般大家认为，Mac OS X 和 Linux 下的 AA 要比 Windows 的 ClearType 好很多。然而不管怎么说，用太大的汉字是比较危险的。 &lt;br/&gt;&lt;br/&gt;事关空间&lt;br/&gt;&lt;br/&gt;今天新加一节，本来计划好的，昨天写的时候又忘了。&lt;br/&gt;&lt;br/&gt;这里的空间指的是 letter-spacing 和 line-height，也就是字间距和行间距。首先，良好的行间距是排版最重要的地方，你可能不能自由选择字体，字号的选择也受诸多限制，但至少行间距的选择是可以完全由自己控制的。&lt;br/&gt;&lt;br/&gt;所谓的 line-height，指的是两行字基线 (base-line) 之间的距离，什么是基线？下面图中的红线便是，对于汉字，则应该就是底部的水平线。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;在印刷排版中，习惯用 pt 来指定行高，比如所谓采用 12/14pt 排版，就是字号 12pt，行高 14pt；而 Web 中似乎习惯用百分比来设置，这个见仁见智，只要自己看得顺眼就行。但必须注意的是，浏览器默认的行高一定是不够的，尤其对于希望浏览者长时间阅读的内容，行高 - 字号至少要有 2pt 以上。更苛刻的排版学家通常推荐 3pt 以上，但毕竟 Web 上可以随意一点。&lt;br/&gt;&lt;br/&gt;但 letter-spacing 又是另一回事，我没学过书法，汉字的间距不好多说，但英文字母的间距却不应该随便调整，尤其不宜统一调整。因为实际上，Type1、TrueType、OpenType 这些字体格式中都包含了一个叫做 kerning table 的东西，也就是字母间距的微调。为什么要做这种微调？两个简单的例子是 AV 和 We，如果不做微调，“A”和“V”之间的距离就会过宽，“e”也不会像我们平常书写的那样和“W”契合得那么自然，下图显示了 Adobe Reader 中，使用 Sabon Next 字体时的 kerning 效果：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;大部分的 User Agent，当然也包括你的浏览器，都会根据字体的 kerning table 自动做这个微调工作，但倘若你使用 CSS 来修改 letter-spacing，这个工作就白费工夫了。所以我才建议不要随便调整 letter-spacing。比如 WordPress 原来的 Classic Theme (Dave Shea 设计，Matt 修改)，就犯了这个毛病。&lt;br/&gt;&lt;br/&gt;事关风格&lt;br/&gt;&lt;br/&gt;谈到英文字体，可以扯出许多掌故，不过这里且说说 Web 开发有关的。&lt;br/&gt;&lt;br/&gt;关于 Times New Roman，首先，与大家一般保留的印象不同，Times 不应该是一个适合长时间阅读的字体，尤其不适合书籍的阅读，因为众所周知的，Times 一开始是给报纸设计的一种字体，而为了适应报纸这种在劣质纸张的快速印刷的环境，字体的衬线不得不夸张一些，否则细节很容易被油墨破坏，所以把 Times 用在书籍上其实是一种很不负责任的方式。&lt;br/&gt;&lt;br/&gt;比这个更不负责任的是用 Times New Roman，Times New Roman 其实是一种压缩 (Condensed) 了的 Times，比原来的 Times 更细长，更不易读了。下面的一个比较应该比较容易分辨出优劣来：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Tags - &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt; , &lt;a href=&quot;http://9inaruto.cn/blog/tag.php?tag=%25E5%25AD%2597%25E4%25BD%2593%25E9%2597%25AE%25E9%25A2%2598&quot; rel=&quot;tag&quot;&gt;字体问题&lt;/a&gt;</description><category>css前台</category><pubDate>Sat, 25 Oct 2008 14:31:54 +0800</pubDate><author>yeahoh &lt;simpman@163.com&gt;</author><guid isPermaLink="false">http://9inaruto.cn/blog/read.php?210</guid><dc:creator>yeahoh &lt;simpman@163.com&gt;</dc:creator><fs:srclink>http://9inaruto.cn/blog/read.php?210</fs:srclink><fs:srcfeed>http://9inaruto.cn/blog/feed.php</fs:srcfeed><fs:itemid>feedsky/simpman/~7084069/139743073/5192433</fs:itemid></item></channel></rss>