var_dump(in_array(0, array('s' ));
这句话的结果是bool(true)。
因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类型,根据php教程 manual 中“comparison operators” 一章的说明可知,number 和string进行
比较的时候,会先将string类型首先转化为number,然后再进行比较操作。 's'转化为number的结果为0,而0 == 0 的结果是true,所以in_array(0, array('s', 'ss'))的结果也是true
如果把in_array 的第三个参数strict设置为 true,比较的时候 就会判断值和类型是否都相当。如果都相当的话,才会返回true,否则返回false.
关于php in_array语法
<?php
$a = array('1.10', 12.4, 1.13);
if (in_array('12.4', $a, true)) {
echo "'12.4' found with strict checkn";
}
if (in_array(1.13, $a, true)) {
echo "1.13 found with strict checkn";
}
?>
/*
分页简单得很,下面我们主要是讲一下关于分页原理与实现方法。
*/
/*
这样才能知道分几页。
比如说一个列表结果是126行,如果一页20行的话那么分7页,对吧。
我们的代码经理是这样的:
计算总行数:select count(*) from tablename where …..
查询列表select * from tablename where … limit…
我们看这种方式再没有任何优化的方式下这样第个列表都是再次查询。
首先我们假设数据更新频率不是很高的情况下,我们点第1页,第2页 。。。第n页 其实第一句sql得到的都是同一个结果,这样是不是后面都在做重复工作呢。那我们第1页得到结果数后是不是可以将结果一下传递下去就行了。
例如我们分页链接第2页是这样的 list.php?page=2&count=126
在程序上加一个判断:
if ($_get['count']) {
$count = $_get['count'];
} else {
$count =select count(*) from tablename where …..
}
这样优化以后如果我们只有第一页才计算总数,后面的页数都不用了,这样是不是就可以提升了效率。
还有这么种情况,也就是在模糊查询的情况下,我们有一个应用,我估计大部分查询结果数小于20,也就是都只有一页结果,那么如果都去计算总数是没有必要的,而且模糊查询效率也比较低。所以我突然想到跳出原来的思维,为什么一定要先计算总行数,再取列表呢?
其实完全可以先查询列表,如果列表结果数=20,那么我们再查询总行数,因为小于20的话,其实只有一页。总行数就等于查出来的列表结果数。
伪代码为:
if ($_get['page']<2) {
$list = select * from tablename where … limit 0,20 第一页时直接查询前20条
if (count($list)=20) {
$count =select count(*) from tablename where …..
} else {
$count =count($list);
}
} else {
$count = $_get['count'];
$list = select * from tablename where … limit page-1*20,page-1*20+20
}
先来看一个session实例
代码如下 | 复制代码 |
function getsessiondata ($session_name = 'php教程sessid', $session_save_handler = 'files') {
|
再看session原理
一直在使用session存储数据,一直没有好好总结一下session的使用方式以及其工作原理,今天在这里做一下梳理。
这里的介绍主要是基于php语言,其他的语言操作可能会有差别,但基本的原理不变。
1.在php中如何操作session:
session_start(); //使用该函数打开session功能
$_session //使用预定义全局变量操作数据
使用unset($_session['key']) //销毁一个session的值
简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?
2.session实现与工作原理
浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。然而服务端是怎么样标示不同的客户端或用户呢?
这里我们可以使用生活中的一个例子,假如你参加一个晚会,认识了很多人,你会采取什么方式来区分不同的人呢!你可能根据脸型,也有可能根据用户的名字,
或者人的身份证,即采用一个独一无二的标示。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上
由服务器为它生成的session_id.
简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,
浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。
以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。
如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期
时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。
下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler
来选择保存session的方式。
这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。
刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。
3.实例问题
现有系统a,b; 假设a系统是可以独立运行的web系统,即可以和浏览器直接处理session, b系统是基于mobile的,需要调用a系统的功能接口,
在保持a不改变的情况下,即登陆验证,session存储都不变的情况下,b系统能处理前端用户的请求。
这里提供的方案是使用php实现
在用户登陆成功后,将保存的session的session-id返回给b系统,然后B系统每次请求其他接口都带session_id。
A系统在session_start前加上session_id(session_id);
这样b系统就能安全的调用a
session函数还有
session_cache_expire — return current cache expire
session_cache_limiter — get and/or set the current cache limiter
session_commit — alias of session_write_close
session_decode — decodes session data from a string
session_destroy — destroys all data registered to a session
session_encode — encodes the current session data as a string
session_get_cookie_params — get the session cookie parameters
session_id — get and/or set the current session id
session_is_registered — find out whether a global variable is registered in a session
session_module_name — get and/or set the current session module
session_name — get and/or set the current session name
session_regenerate_id — update the current session id with a newly generated one
session_register — register one or more global variables with the current session
session_save_path — get and/or set the current session save path
session_set_cookie_params — set the session cookie parameters
session_set_save_handler — sets user-level session storage functions
session_start — initialize session data
session_unregister — unregister a global variable from the current session
session_unset — free all session variables
session_write_close — write session data and end session
本地时间函数
1. string date(string format,inieger times****p)
该函数返回一个表示时间的字符串,是由string format 控制的。
如:
代码如下 | 复制代码 |
<? print(date("y年 m月d日");//输出当前,年月日. print(date("y年 m月d日",60*60*24*365*10);//输出1980年1月1日. ?> |
也许你会问,怎麽没有times****p呢?若times****p为空时,或不写时,表示使用当前时间一刻times****p.
表示年份的控制符: y---四位的年份 y---两位的年份
表示月份的控制符: m---从1-12的月份 f---英文月份名 m---简写的月份名
表示日号的控制符: d---前面有0的月份中日期 j--前面没有0的日号
表示星期的控制符: l--英文星期 d--简写的星期
表示小时的控制符: h--从1到12小时 h---从0到23的小时
表示上下午的控制符 a ---am或pm a---am或pm
表示分钟的控制符: i---取值00-59
表示一年中第多少天: z--一年中的第多少天
2. array getdate(integer times****p)
该函数返回一个矩阵.
如:
代码如下 | 复制代码 |
<? $current_date=getdate(); print($current_date("hours")); print($current_date("minutes"); print($current_date("seconds"); ?> |
说明:
元素 描述
hours 24小时格式的小时
mday 月份中日期
minutes 分钟
mon 数字形式的月份
month 月份全称
seconds 秒数
wday 从0到6的数字形式的星期几
weekday 星期几的名称
year 年份
0 时间戳即从1970年1月1日到现在的秒数
yday 一年中数字形式的日期
3. boolean checkdate(integer month,integer day,integer year)
该函数检查日期是否合法.如:
代码如下 | 复制代码 |
<? if(checkdate(2,29,1980)) print("日期合法!n"); ?> |
代码如下 | 复制代码 |
<! doctype html public "-//w3c//dtd html 4.0//en" "http://www.w3.org/tr/rec-html140/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=gb2312"> <title>ajax用户注册演示程序</title> <script language="网页特效" type="text/网页特效"> <!-- //创建函数 function createxmlhttp() { var request; var browser = navigator.appname; //使用ie,则使用xmlhttp对象 if(browser == "microsoft internet explorer") { var arrversions = ["microsoft.xmlhttp", "msxml2.xmlhttp.4.0", "msxml2.xmlhttp.3.0", "msxml2.xmlhttp","msxml2.xmlhttp.5.0"]; for (var i=0; i < arrversions.length; i++) { try { //从中找到一个支持的版本并建立xmlhttp对象 request = new activexobject(arrversions[i]); return request; } catch (exception) { //忽略,继续 } } } else { //否则返回一个xmlhttprequest对象 request = new xmlhttprequest(); if(request.overridemimetype) { request.overridemimetype('text/xml'); } return request; } } //全局xmlhttp对象实例变量 var http = createxmlhttp(); //发送请求 function chkuser() { var url = "check.php教程"; //请求"checkusername" servlet var name = document.getelementbyid("username").value; url += ("?username="+escape(name)+"&oprate=chkuser"); http.open("get",url,true); http.onreadystatechange = processhttpresponse; http.send(null); return ; } //处理响应 function processhttpresponse() { if(http.readystate == 4) { if(http.status == 200) { var xmldocument = http.responsexml; if(http.responsetext!="该用户名有效,可以使用!") { //返回的信息动态显示 document.getelementbyid("showstr").style.display = ""; document.getelementbyid("username").style.background= "#ff0000"; document.getelementbyid("showstr").innertext = http.responsetext; } else { document.getelementbyid("username").style.background= "#ffffff"; document.getelementbyid("showstr").style.display = ""; document.getelementbyid("showstr").innertext = http.responsetext; } } else { alert("你所请求的页面发生异常,可能会影响你浏览该页的信息!"); alert(http.status); } } } //检验输入密码 function chkpassword() { var m=document.form1; if(m.password.value.length>20 || m.password.value.length<6 ) { document.getelementbyid("passwordstr").style.display = ""; document.getelementbyid("password").style.background= "#ff0000"; document.getelementbyid("passwordstr").innertext = "对不起,密码必须为英文字母、数字或下划线,长度为6~20!"; } else { document.getelementbyid("password").style.background= "#ffffff"; document.getelementbyid("passwordstr").style.display = "none"; } } //验证两次密码是否一致 function chkconfirmpassword() { var m=document.form1; if (m.password.value != m.confirmpassword.value) { document.getelementbyid("confirmpasswordstr").style.display = ""; document.getelementbyid("confirmpassword").style.background= "#ff0000"; document.getelementbyid("confirmpasswordstr").innertext = "对不起,密码与重复密码不一致!"; } else { document.getelementbyid("confirmpassword").style.background= "#ffffff"; document.getelementbyid("confirmpasswordstr").style.display = "none"; } } //验证email是否有效 function chkemail() { var m=document.form1; var email = m.email.value; //正则表达式 var regex = /^([a-za-z0-9_-])+@([a-za-z0-9_-])+(.[a-za-z0-9_-])+/; var flag = regex.test(email); if(!flag) { document.getelementbyid("emailstr").style.display = ""; document.getelementbyid("email").style.background= "#ff0000"; document.getelementbyid("emailstr").innertext = "对不起,邮箱地址无效!"; } else { document.getelementbyid("email").style.background= "#ffffff"; document.getelementbyid("emailstr").style.display = "none"; } } //提交检查函数 function submitcheck() { var m=document.form1; if(m.username.value.length==0) { alert("对不起,用户名必须为英文字母、数字或下划线,长度为5~20。"); m.username.focus(); return false; } if(m.password.value.length==0) { alert("对不起,密码必须为英文字母、数字或下划线,长度为5~20。"); m.password.focus(); return false; } if (m.password.value != m.confirmpassword.value) { alert("对不起,密码与重复密码不一致!"); m.confirmpassword.focus(); return false; } if(m.email.value.length==0) { alert("对不起,邮箱地址不能为空!!"); m.email.focus(); return false; } m.submit(); } //--> </script> <body > <form name="form1" method="post" action="register.php"> <h3 align="center">ajax用户注册程序</h3> <table align="center" width="500" border="1" > <tr> <td><font color="red">*</font></td> <td width="100">用户帐号:</td> <td><input type="text" name="username" maxlength="20" style="background=#ffffff" onblur="chkuser()"></td> <td><div id="showstr" style="background-color:#ff9900;display:none"></div></td> </tr> <tr> <td><font color="red">*</font></td> <td>用户密码:</td> <td align="left"><input type="password" name="password" maxlength="22" style="background=#ffffff" onblur="chkpassword()"/> </td> <td><div id="passwordstr" style="background-color:#ff9900;display:none"></div></td> </tr> <tr> <td><font color="red">*</font></td> <td>确认密码:</td> <td><input type="password" name="confirmpassword" maxlength="20" style="background=#ffffff" onblur="chkconfirmpassword()"/></td> <td><div id="confirmpasswordstr" style="background-color:#ff9900;display:none"></div></td> </tr> <tr> <td><font color="red">*</font></td> <td>email:</td> <td><input type="text" name="email" maxlength="100" style="background=#ffffff" onblur="chkemail()"></td> <td><div id="emailstr" style="background-color:#ff9900;display:none"></div></td> </tr> </table> <div align="center"> <input type="button" name="ok" value=" 确定 " onclick="submitcheck()"> <input type="reset" name="reset" value=" 取消 "> </form> </div> </body> </html> |
reg.php检测程序
代码如下 | 复制代码 |
<?php
$uname = $_get['username'];
$sql="select * from t1 where name='".$uname."'"; if(strlen($uname)<6||strlen($uname)>20) |