解决IE8以下使用缓存信息问题

用户可能会设置一些选项来更改浏览器的默认缓存设置。通过发送上面的报头,您可以覆盖任何这些设置,强制浏览器不进行缓存。

<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997  05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache");
?>

 

保存会话技术之session

基本概念,session是一项服务器端的技术,利用这个技术,服务器在运行时可以为每一个用户的的浏览器创建一个其独享的session文件。

一个会话对应一个session,打个比方说:当你在网上购物的时候,小明在和你一起买东西,你买了4样商品,小明买了2样,但是当你们各自点击购物车的时候,都会只看到自己所选的商品,这个就是因为你们两个所选择的物品被分别储存在各自属于你们的session文件里,这个文件储存在服务器里。

创建session

session_start()

$_SESSION[“name”]=”gengzhie”;

$_SESSION[“age”]=”23″;

session 可以储存很多数据类型string,integer,bool,array,object

获取session

$name = $_SESSION[“name”];

echo $name;

更新session

重新保存某一变量的属性

删除session

//⑴删除某一个特定的key<=>val

unset($_SESSION[‘name’]);

//⑵删除所有的key<=>val

session_destroy();

echo “删除成功”

session可以干什么

网上购物车、保存登录用户信息、设置访问权限、某些数据存放在session中,供其他页面使用。

 

AJAX初学者篇

AJAX纠结了本人许久阿,纠结过后,当功能实现的内一刻,是豁然开朗,感觉编程当遇到自己不会的东西时,就好像把自己关在一个小黑屋里,什么都看不见,只能一点点摸索,可能会走错路,可能会找不到方向,心里很烦躁很纠结,但是当自己摸到门,打开门,看到外面阳光明媚的时候,所有烦恼都烟消云散了。

我是这么理解AJAX的,可能理解的只是表面的一些概念,要深入熟练应用还需要多多的练习呢~

AJAX不是什么编程语言,是需要和其他语言结合应用的一种技术,它解决了其他很多语言解决不了的问题,

代表性的    1. 页面无刷新的动态数据交换  2.局部刷新页面  3.界面的美观(增强用户体验)

我做的主要是验证用户名部分,给大家看下代码,有不足的地方希望给些建议。

用户名:
<input type=”text”  name=”username” id=”username” onblur=”user_name()”/>
<span id=”user_name” style=”color:red;font-size:12px;”></span>

 

function user_name()    //判断用户名
{
var user = document.getElementById(“username”);  //获取用户名id
var usermessage = document.getElementById(“user_name”);  //获取span的id

var user_match = /^[a-zA-Z0-9_] $/;  //验证格式只能是字母数字下划线组成

if(user.value.length==0)
{
usermessage.innerHTML=”* 账号不能为空”;

user.style.border=”2px solid red”;

return false;
}else
{

if (user.value.length < 6 || user.value.length > 20 )
{
usermessage.innerHTML=”* 用户名长度不少于 6 字节不超过 20 字节!”;
user.style.border=”2px solid red”;
return false;

}
if (!user.value.match(user_match))
{
usermessage.innerHTML=”* 用户名只能由字母数字下划线组成”;
user.style.border=”2px solid red”;
return false;
}
showHint(user.value);     //当前3项都符合条件时,执行的函数
if(usermessage.innerHTML!=”√”)
{
return false;
}
usermessage.innerHTML=”√”;
user.style.border=”1px solid #cccccc”;
return true;
}
}

 

var xmlHttp

function showHint(str)
{

xmlHttp=GetXmlHttpObject();

if (xmlHttp==null)
{
alert (“您的浏览器不支持AJAX!”);
return;
}

var url=”ajax.php”;     //定义回传数据的服务器的 url(文件名)
url=url “?user_name=” str;      //使用文本框的内容向 url 添加参数(user_name)
xmlHttp.onreadystatechange=stateChanged;     //创建一个 XMLHTTP 对象,并告知此对象当某个改变被触发时执行名为 stateChanged 的函数
xmlHttp.open(“GET”,url,false);  //向服务器发送一个 HTTP 请求
xmlHttp.send(null);//  如果输入域为空,此函数仅仅会清空 user_name 占位符的内容
}

function GetXmlHttpObject()    /*上面可调用名为 GetXmlHttpObject() 的函数。

此函数的作用是解决为不同浏览器创建不同的 XMLHTTP 对象的问题。*/
{
var xmlHttp=null;
try
{
// Firefox, Opera 8.0 , Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject(“Msxml2.XMLHTTP”);
}
catch (e)
{
xmlHttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
}

return xmlHttp;
}

function stateChanged()   //每当 XMLHTTP 对象的状态发生改变时,stateChanged() 函数就会执行。当状态变更为 4(“完成”)时,user_name 占位符的内容就被响应文本来填充。
{
if (xmlHttp.readyState == 4)
{
if(xmlHttp.responseText == “false”)
{

document.getElementById(“user_name”).innerHTML=”* 用户名已存在”;
document.getElementById(“username”).style.border=”2px solid red”;
return false;

}
else
{    document.getElementById(“user_name”).innerHTML=”√”;
document.getElementById(“username”).style.border=”1px solid #cccccc”;
return true;

}
}
}

 

PHP分页

分页是大多数网站都会用到的,所以我个人觉得理解分页的用法和原理是很重要的。下面是我做的分页。

<?php
$con = mysql_connect(“localhost”,”root”,””);
mysql_query(“set names utf8”, $con);
if(!$con)
{die(“Could not connect:”.mysql_error());
}
mysql_select_db(“db_log”,$con);//连接数据库

$pagesize = 2;//每页显示个数
if(isset($_GET[“page_value”])) //获取当前页
{    $current_page=$_GET[“page_value”];
$page = $current_page*$pagesize-$pagesize; //检索条件的开始位置
}
else{
$page = 0;
$current_page = 1;
}
$sql = “SELECT count(`id`) as `id_sum`  from `tab` “;//算出记录数
$result = mysql_query($sql,$con);
$num_arr = mysql_fetch_array($result);
$num = $num_arr[“id_sum”];//总记录数
$first=1;
$prev=$current_page-1;//上一页
$next=$current_page 1;//下一页
$sql=”SELECT * FROM tab limit $page,$pagesize “; //检索出从行$page开始的$pagesize行,$page为开始位置,$pagesize为行数
$result=mysql_query($sql,$con);
$begin_page=$current_page-3;//设置选中页左边留的页码个数
$finish_page=$current_page 3;//设置选中页右边边留的页码个数
if($num)         //求出总页数
{
if($num <= $pagesize)
{
$$total_pages = 1;      //当总记录数小于等于每页显示的个数时,那么只有一页
}

if ($num % $pagesize > 0)
{
$total_pages= (int)($num / $pagesize) 1;    //当有余数时,那么取$num / $pagesize得整数 1.为总页数
}
else
{
$total_pages= $num / $pagesize;   //或者,如果能整除的情况下,就等于$num / $pagesize 页
}

}

因为我想要的效果是这样的

所选的页数前面有3个页码,后面有3个页码,但是就有两种特殊情况,当我选的当前页码数小于4的时候,前面留的数就会出现负数,所以我做了个判断,当它小于4的时候,所选页数-3的数为1,
$beginpage = $begin_page > 0 ? $begin_page : 1; //当前页数-3大于0时,选中页左移3个页码页数为当前页-3,否则为1,

同样的道理尾页时,假如一共有13页,我的判断不能让它超过13页,所以所选页数 3如果超过了尾页,那么它的值就是尾页的页数,
$finishpage = $finish_page < $total_pages? $finish_page :$total_pages;                  //这里用到了一个三元运算符,意思是当$finish_page(选中的页码数 3)<$total_pages(总页数)时,执行$finish_page,否则执行$total_pages;这么做是为了不让右边留的页码数超过总页数。

假如,一共有9页,一共可以显示7个页码,我当前选择的第六页,为了方便观察,我故意写成汉字,

【3】【4】【5】【六】【7】【8】【9】

我做这个判断是为了,当选择6以上的页数时该怎么办,正常会是这样:

【4】【5】【6】【七】【8】【9】【10】会出现第10页,之后报错。因为本身没有第10页,所以就让它选择6以上时,最后一页只显示‘9’

其实接下来的判断是我后发现的问题,因为一开始一心只想着要显示7个页码,所以忽略了页数小于7页的时候怎么办,试了一下,发现会变成这样

【-2】【-1】【0】【1】【2】【3】【4】

为了避免负数的出现,就要判断一下,当总页数小于‘7’时该怎么办。

if($total_pages>=7)
{
$page_count1 = 7;
$page_count2 = $total_pages-6;
}
else
{
$page_count1 = $total_pages;
$page_count2 = 1;
}

如果只是做上面的判断,会出现一个问题,就是当我选择的页码数小于4时,例如我选择第一页时,

他会变成这样【1】【2】【3】【4】,

选择最后一页时也是会逐渐减少页码个数。【9】【10】【11】【12】【13】,

但是中间的数会正常显示【2】【3】【4】【5】【6】【7】【8】,

其实我想要的就是页码个数始终是7个,

所以就得加一个判断:
if($current_page-3<=0)
{
$pages1 = 1;
$pages2 = $page_count1;
}

elseif($current_page>$total_pages-3)
{
$pages1 = $page_count2;
$pages2 = $total_pages;
}

else
{
$pages1 = $beginpage;      //其它情况就循环 $beginpage到$finishpage
$pages2 = $finishpage;
}
?>

<?php

//当前页不等于1时,显示首页和上一页,如果等于1,就不显示

if($current_page!=1)
{
?>
<a href = “http://www.ceshi1.com/user.php?page_value=<?php echo $first?>”>首页</a>
<a href = “http://www.ceshi1.com/user.php?page_value=<?php echo $prev ;?>”>上一页</a>

<?php
}

for($i=$pages1;$i<=$pages2;$i )
{
//这个判断是为了把我选中的页和其它页区分开
if($i==$current_page)
{
echo “[$i] “;
}
else
{
echo “<a href =”http://www.ceshi1.com/user.php?page_value=”.$i.””>[“.$i.”]  </a>”;
}

}

if($current_page!=$total_pages)
{
?>
<a href = “http://www.ceshi1.com/user.php?page_value=<?php echo $next ;?>”>下一页</a>
<a href = “http://www.ceshi1.com/user.php?page_value=<?php echo $total_pages?>”>尾页</a>
<?php
}
?>

JS批量删除和全选

由于本人刚接触javascript,理解起来有些吃力,所以如果有不对的地方希望大家提出来,我再加以改正。这次写的主要是针对JS的批量删除和全选。

先说说我对JS的理解吧,javascript是一种脚本语言,它往往不能独立使用,而是配合html/jsp/php/.net等等使用的,它是客户端脚本语言,也就是说,它是给用户们看的,既然是给用户们看的,那么,恰当的应用JS就会增强用户体验效果,让用户们看起来觉得好看,方便,才会愿意去看。程序员做一个程序目的不就是为了让他所做的能够得到更多的人认可么,谁也不想自己做一个网站没人关注。

下面就针对我用JS做的批量删除和全选说一下,我做的是用户列表页,先把数据从数据库里取出来,做成表,这样样就有数据了,我想实现的效果是,当我选N项,点击批量删除的时候,弹出一个对话框,提示”确认删除N项吗?“,点击”确定“按钮,提示”批量删除成功“,点击”取消“按钮,返回当前页面。

首先,加一个“批量删除”的按钮

<input class=”alldel” onclick=”return batchdel()” type=”submit”  value=”批量删除”>  //“onclick”意思是当点击的时候,会触发一个事件,会执行batchdel()这个函数里的内容。

<li><input type=”checkbox”  id=”check” name=”checks[]” value=”<?php echo $row[“id”];?>” ></li>    //我是用复选框实现我想要的效果。”value”=我所选择的id.

然后定义batchdel()函数里的内容

function batchdel()
{
var checkbox = document.getElementsByName(“checks[]”);  //定义一个变量checkbox,找到name为‘checks[]’的元素。
var number = 0;  //初始化一下number
if(checkbox.length != 0)  //判断条件是当选择的个数不为0时
{
for( i = 0; i < checkbox.length; i )  //循环遍历复选框
{
if (checkbox[i].checked == true)  //如果[i]个复选框为选中状态
{
number ;  //累加所选的个数
}
}
if(number == 0)  //如果个数=0,也就是没有选中内容的时候
{
alert(“请选择”);   //弹出一个提示框,提示用户请选择内容

}else
{
var txt=”确定删除这” number “项吗?”;   //定义一个变量txt ,显示内容是确认删除这number项吗?number为几,显示的就是几。
if (confirm(txt))   //判断txt,这里用到的是confirm函数,confirm的意思就是弹出一个带有“确定”和“取消”的提示框。
{
return true;
}
else
{
return false;
}
}
}

}

接下来说JS实现全选和取消全选

我想实现的是点击“全选”按钮的时候,复选框全部是选中状态,同时按钮上的字变成“取消全选”,再点击“取消全选“的时候,复选框全部都是没被选中的状态,同时按钮上的字再变回”全选“。

先定义一个按钮

<input type=”button” id=”all_checked” name=”all_checked” value=”全选” onclick=”checkedAll()” >

再定义checkedAll()

function checkedAll()
{
var allCheckVal = document.getElementById(“all_checked”).value;     //定义变量    allCheckVal = 按钮上的字(“全选”)
var checked = false;
if(allCheckVal == “全选”)  //当按钮上的字为“全选”时
{
document.getElementById(“all_checked”).value = “取消全选”;   //点击变成取消全选
checked = true;   //同时checked值为true
}
else
{
document.getElementById(“all_checked”).value = “全选”;
checked = false;
}

var allcheck=document.getElementsByName(“checks[]”);
for(var i=0;i<allcheck.length;i )
{
allcheck[i].checked = checked;
}
}

因为变量checked只可能有两个值,一个是true,一个是false,当点击’全选‘时,字变’取消全选‘,checked值为true,点击’取消全选‘时,字变’全选‘,checked值为false。

PHP MySQL入门

   连接数据库

语法:mysql_connect(servername,username,password);

例子:

<?php

$con = mysql_connect(“localhost”,”root”,””);

if(!$con)

{

die(“Could not connect: ” . mysql_error());

}

?>

    创建数据库 (CREATE DATABASE)

语法:CREATE DATABASE database_name

例子:

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
 {
 die("Could not connect: " . mysql_error());
 }

if (mysql_query("CREATE DATABASE db_log",$con))
 {
 echo "Database created";
 }
else
 {
 echo "Error creating database: " . mysql_error();
 }

mysql_close($con);
?>

   创建数据库表 (CREATE TABLE)

语法:CREATE TABLE table_name

例子:

<?php
$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

// Create database
if (mysql_query(“CREATE DATABASE db_log”,$con))
  {
  echo “Database created”;
  }
else
  {
  echo “Error creating database: ” . mysql_error();
  }

// Create table in db_log database
mysql_select_db(“db_log”, $con);
$sql = “CREATE TABLE log 
(id INT(5) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
username VARCHAR(15) NOT NULL,
password VARCHAR(15) NOT NULL,
age INT(3) NOT NULL
)”;
mysql_query($sql,$con);

mysql_close($con);
?>

   插入数据 (INSERT INTO)

语法:INSERT INTO table_name VALUES(value1,value2……)

例子:

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
 {
 die("Could not connect: " . mysql_error());
 }

mysql_select_db("db", $con);

mysql_query("INSERT INTO log(username,password, Age) 
VALUES ("Peter", "123456", "35")");

mysql_close($con);
?>

   检索数据 (SELECT)

语法:SELECT column_name FROM table_name

例子:

<?php

$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

mysql_select_db(“db_log”, $con);

$result = mysql_query(“SELECT * FROM log”);

while($row = mysql_fetch_array($result))
  {
  echo $row[“username”] . ” ” . $row[“password”];
  echo “<br />”;
  }

mysql_close($con);

?>

   过滤数据 (WHERE)

语法:SELECT column_name FROM table_name WHERE column_name = “value”

例子:

<?php

$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

mysql_select_db(“db_log”, $con);

$result = mysql_query(“SELECT * FROM log

WHERE username=””Peter”);

while($row = mysql_fetch_array($result))
  {
  echo $row[“username”] . ” ” . $row[“age”];
  echo “<br />”;
  }

?>

   排序 (ORDER BY)

语法:SELECT column_name(s) FROM table_name ORDER BY column_name

例子:

<?php

$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

mysql_select_db(“db_log”, $con);

$result = mysql_query(“SELECT * FROM log ORDER BY age”);

while($row = mysql_fetch_array($result))
  {
  echo $row[“username”];
  echo ” ” . $row[“password”];
  echo ” ” . $row[“Age”];
  echo “<br />”;
  }

mysql_close($con);

?>

  更新 (UPDATE)

语法:UPDATE table_name

SET column_name = new_valule

WHERE column_name = some_valule

例子:

<?php
$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

mysql_select_db(“db_log”, $con);

mysql_query(“UPDATE log SET Age = “36”
WHERE username = “Peter” AND password = “123456””);

mysql_close($con);
?>

  删除数据库,表(DROP)

语法:DROP DATABASE database_name;

           DROP TABLE table_name;

例子:

<?php

$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

if (mysql_query(“CREATE DATABASE db_log”,$con))
  {
  echo “Database created”;
  }
else
  {
  echo “Error creating database: ” . mysql_error();
  }
  mysql_query(“DROP DATABASE db_log”,$con);

mysql_close($con);

?>

   删除数据库中数据(DELETE FROM)

语法:DELETE FROM table_name WHERE column_name =some_value

例子:

<?php
$con = mysql_connect(“localhost”,”root”,””);
if (!$con)
  {
  die(“Could not connect: ” . mysql_error());
  }

mysql_select_db(“db_log”, $con);

mysql_query(“DELETE FROM log WHERE Age=”36″”);

mysql_close($con);
?>

   关闭连接 (mysql_close())

语法:mysql_close();

数据库如何创建索引

在创建索引之前,首先要了解什么是索引?

在SQl server中索引就是数据库表的目录,表中数据和相应的存储位置的列表。

索引是对数据库表中的一列或者多列的值进行排序的一种结构。

索引的作用:提高查询优化,确保数据的唯一性以及可以对任何全文索引字段中的大量文本的搜索进行优化。加速表与表之间的连接。

主要索引介绍

1.常规索引(INDEX)

就是普通的,正常的索引,其实他没有什么特别的特性,它可以唯一性的,也可以非唯一。因为唯一的已经有主键索引,所以常规索引经常用于设置非唯一,但是又经常能用到的,比如名字,因为有人可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或者更多次,这时就可以用到常规索引了,

可以提升数据库性能。

你可能经常希望针对非主键甚至非唯一的字段的搜索进行优化,所以应当可以通过为这些字段建立索引来优化这种搜索。这种索引就称作常规索引或正常索引。比如性别,商品类别等可以用常规索引。

2.主键索引(PRIMARY)

这是关系数据库中最常见的索引类型

主要作用是确定数据库表里一条特定的数据记录的位置,标识唯一性。

主键索引是不允许重复的,这样会加快寻找制定位置的速度,而且无论以后是否会删除以前存在的记录,每条记录都会有唯一的主键索引。一般我们会把id设置为主键索引。

最好为每一张数据表都定义一个主键.

一个表只能制定一个主键.

主键的值不能为空.

3.唯一索引(DNIQUE)

与主键索引的作用一样,都可以防止创建重复的值。

当插入一条新记录的时候,会自动检查新记录的字段的值是否已经存在,如果存在,MySQL会拒绝插入。

不同的是,每个表可以有多个唯一索引。比如用户名,文章名,个人介绍都可以用唯一索引。

创建唯一索引往往不是为了提高访问速度,而只是为了不让数据重复,像上面提到的用户名,文章名,大多数都不是重复的,而主键只能创建一个,所以就要用到唯一索引。

4.全文索引(FULLTEXT)

用来搜索存储在CHAR,VARCHAR,TEXT数据类型中的文本,比如文章,书籍之类内容比较多的,用全文索引。文本字段上的普通索引只能加快出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作,如果字段里存放的是由几个神智更多单词构成的较大段文字,普通索引就吃力了,需要处理的数据量越大,响应的时间就越长,这时就要用到全文索引,在生成这种类型索引时,mysql将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录,全文索引既可以跟数据表一起创建,也可以等日后有必要时再使用下面命令添加:

ALER TABLE tablename ADD FULLTEXT (column1,column2)有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或者多个给定单词的数据记录了。

全文索引的基本语法:

SELECT*FROM tablename WHERE MATCH(column1,column2) AGAINST(“word1″,”word2,””word3”)

上面这条命令将把column1和column2字段里有word1,word2和word3的数据记录全部查出来。

提示:InnoDB数据表不支持全文索引。所以我们平时用到全文索引的时候也比较少。

 

一个没有建立任何索引的表知识一个未经排序的数据的集合,打个比方说,你想去书店买一本书,书店有成千上万本书,你想找一本《PHP与MySQL》,如果没有索引,你就要一本一本去找,可能找几天,甚至几个月,如果有了索引,你可以先去2层楼,找软件类书籍,再找有关PHP,最后找到《PHP与MySQL》,按照索引顺序很快找到。

事情都有两面性,索引在加快搜索速度的同时,也降低了插入,删除,修改的速度。还是上面的例子,如果要新添加一本《PHP与MySQL》,没有索引的话,把这本书直接扔到大库里就行了,什么都不用管,但是如果有索引,就要先去2楼,再找到软件类书籍,有关PHP,最后放到有关于PHP的一类里。

索引还有一个缺点就是需要使用更多的磁盘空间,索引越多,占用的空间也就越多,多余的索引只会导致不必要的硬盘空间消耗,所以建议只对WHERE,GROUP BY和ORDER BY子句中需要的列进行添加索引。

对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

索引和表一样是独立的数据对象,可以单独使用,也可以在创建表时创建。

例如:创建一个索引名为ind1在用户表名字字段和年龄字段,单独创建时可以这么输入: creat index ind1 on users<name,age>;可以指定多个列。

这样,在查询的时候,按名字查询或者是年龄查询都会加快查询速度。

假如想删除索引输入         drop index ind1 on users;   不用再去可以指定name 或 age,因为创建这个索引名,它就知道在哪个字段上。

多列都可以指定索引,可以一个一个的去取索引名,这样就可以单独管理了