将以下代码另存为online_list.php(保存前注重修改必要的参数)
<?$host="localhost";//mysql的host
$user="root";//mysql的用户名称
$pw="";//mysql的密码
$db="";//mysql数据库名称
$update_time="30";//更新的频率---秒数
session_start();
if(!$_SESSION['name'])session_register("name");
$con=mysql_connect($host,$user,$pw)or die("连接数据库失败");
$now=time();
mysql_select_db($db,$con)or die("错误的数据库$db");
if(!empty($name)){//假如用户已经登入了
$query=mysql_query("select count(username) from online_list where username='$name'",$con);//查询在线到表是否已经有用户的名称
$result=mysql_result($query,0);//查询的结果
if($result!=0){//假如用户已经在在线列表了
@mysql_query("update online_list set second_time='$now' where username='$name'",$con);//更新用户的最后在线时间
}else{//假如用户已经不在在线列表
@mysql_query("insert into online_list(username,userip,online_time,second_time)values('$name','$REMOTE_ADDR','$now','$now')",$con);//新增一个用户到在线列表
}
}
else{//假如用户没有登入
$query=mysql_query("select count(userip) from online_list where userip='$REMOTE_ADDR'",$con);//查询在线到表是否已经有访客的ip 地址
$result=mysql_result($query,0);//查询的结果
if($result!=0){//假如访客的ip地址已经在在线列表了
@mysql_query("update online_list set second_time='$now' where userip='$REMOTE_ADDR'",$con);//更新访客的最后在线时间
}else{//假如用户列表没有访客的ip地址
@mysql_query("insert into online_list(username,userip,online_time,second_time)values('访客','$REMOTE_ADDR','$now','$now')",$con);//新增一个访客到在线列表
}
}
$del_time=$now-$update_time;
@mysql_query("delete from online_list where second_time<$del_time",$con);//删除在$update_time秒内没有动作的用户
?>
Php部分常见问题总结-转载
我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值?
在PHP4.2以后的版本中register_global默认为off
若想取得从另一页面提交的变量:
方法一:在PHP.ini中找到register_global,并把它设置为on.
方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注意extract($_SESSION)前必须要有Session_Start()).
方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等,这种方法虽然麻烦,但比较安全.
2:调试你的程序
在运行时必须知道某个变量为何值。我是这样做的,建立一文件debug.php,其内容如下:
PHP代码:--------------------------------------------------------------------------------
<?PHP
Ob_Start();
Session_Start();
Echo "<pre>";
Echo "本页得到的_GET变量有:";
Print_R($_GET);
Echo "本页得到的_POST变量有:";
Print_R($_POST);
Echo "本页得到的_COOKIE变量有:";
Print_R($_COOKIE);
Echo "本页得到的_SESSION变量有:";
Print_R($_SESSION);
Echo "</pre>";
?>
--------------------------------------------------------------------------------
然后在php.ini中设置:include_path = "c:/php",并将debug.php放在此文件夹,
以后就可以在每个网页里包含此文件,查看得到的变量名和值.
3:如何使用session
凡是与session有关的,之前必须调用函数session_start();
为session付值很简单,如:
PHP代码:--------------------------------------------------------------------------------
<?php
Session_start();
$Name = "这是一个Session例子";
Session_Register("Name");//注意,不要写成:Session_Register("$Name");
Echo $_SESSION["Name"];
//之后$_SESSION["Name"]为"这是一个Session例子"
?>
--------------------------------------------------------------------------------
在php4.2之后,可以为session直接付值:
PHP代码:--------------------------------------------------------------------------------
<?PHP
Session_Start();
$_SESSION["name"]="value";
?>
--------------------------------------------------------------------------------
取消session可以这样:
PHP代码:--------------------------------------------------------------------------------
<?php
session_start();
session_unset();
session_destroy();
?>
--------------------------------------------------------------------------------
取消某个session变量在php4.2以上还有BUG.
注意:
1:在调用Session_Start()之前不能有任何输出.例如下面是错误的.
==========================================
1行
2行 <?PHP
3行 Session_Start();//之前在第一行已经有输出
4行 .....
5行 ?>
==========================================
提示1:
凡是出现"........headers already sent..........",就是Session_Start()之前向浏览器输出信息.
去掉输出就正常,(COOKIE也会出现这种错误,错误原因一样)
提示2:
如果你的Session_Start()放在循环语句里,并且很难确定之前哪里向浏览器输出信息,可以用下面这种方法:
1行 <?PHP Ob_Start(); ?>
........这里是你的程序......
2:这是什么错误
Warning: session_start(): open(/tmpsess_7d190aa36b4c5ec13a5c1649cc2da23f, O_RDWR) failed:....
因为你没有指定session文件的存放路径.
解决方法:
(1)在c盘建立文件夹tmp
(2)打开php.ini,找到session.save_path,修改为session.save_path= "c:/tmp"
4:为什么我向另一网页传送变量时,只得到前半部分,以空格开头的则全部丢失
PHP代码:--------------------------------------------------------------------------------
<?php
$Var="hello php";//修改为$Var=" hello php";试试得到什么结果
$post= "receive.php?Name=".$Var;
header("location:$post");
?>
--------------------------------------------------------------------------------
receive.php的内容:
PHP代码:--------------------------------------------------------------------------------
<?PHP
Echo "<pre>";
Echo $_GET["Name"];
Echo "</pre>";
?>
--------------------------------------------------------------------------------
正确的方法是:
PHP代码:--------------------------------------------------------------------------------
<?php
$Var="hello php";
$post= "receive.php?Name=".urlencode($Var);
header("location:$post");
?>
--------------------------------------------------------------------------------
在接收页面你不需要使用Urldecode(),变量会自动编码.
5:如何截取指定长度汉字而不会出现以"?>"结尾,超出部分以"..."代替
一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字,包括标点.
PHP代码:--------------------------------------------------------------------------------
<?PHP
$str="这个字符好长呀,^_^";
$Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符...
Echo "$Short_Str";
Function csubstr($str,$start,$len)
{
$strlen=strlen($str);
$clen=0;
for($i=0;$i<$strlen;$i++,$clen++)
{
if ($clen>=$start+$len)
break;
if(ord(substr($str,$i,1))>0xa0)
{
if ($clen>=$start)
$tmpstr.=substr($str,$i,2);
$i++;
}
else
{
if ($clen>=$start)
$tmpstr.=substr($str,$i,1);
}
}
return $tmpstr;
}
Function showShort($str,$len)
{
$tempstr = csubstr($str,0,$len);
if ($str<>$tempstr)
$tempstr .= "..."; //要以什么结尾,修改这里就可以.
return $tempstr;
}
--------------------------------------------------------------------------------
6:规范你的SQL语句
在表格,字段前面加上"`",这样就不会因为误用关键字而出现错误,
当然我并不推荐你使用关键字.
例如
$Sql="INSERT INTO `xltxlm` (`author`, `title`, `id`, `content`, `date`) VALUES ('xltxlm', 'use`', 1, 'criterion your sql string ', '2003-07-11 00:00:00')"
"`"怎么输入? 在TAB键上面.
7:如何使Html/PHP格式的字符串不被解释,而是照原样显示
PHP代码:--------------------------------------------------------------------------------
<?PHP
$str="<h1>PHP</h1>";
Echo "被解释过的: ".$str."<br>经过处理的:";
Echo htmlentities(nl2br($str));
?>
--------------------------------------------------------------------------------
8:怎么在函数里取得函数外的变量值
PHP代码:--------------------------------------------------------------------------------
<?PHP
$a="PHP";
foo();
Function foo()
{
global $a;//删除这里看看是什么结果
Echo "$a";
}
?>
--------------------------------------------------------------------------------
9:我怎么知道系统默认支持什么函数
PHP代码:--------------------------------------------------------------------------------
<?php
$arr = get_defined_functions();
Function php() {
}
echo "<pre>";
Echo "这里显示系统所支持的所有函数,和自定以函数phpn";
print_r($arr);
echo "</pre>";
?>
--------------------------------------------------------------------------------
10:如何比较两个日期相差几天
PHP代码:--------------------------------------------------------------------------------
<?PHP
$Date_1="2003-7-15";//也可以是:$Date_1="2003-6-25 23:29:14";
$Date_2="1982-10-1";
$Date_List_1=explode("-",$Date_1);
$Date_List_2=explode("-",$Date_2);
$d1=mktime(0,0,0,$Date_List_1[1],$Date_List_1[2],$Date_List_1[0]);
$d2=mktime(0,0,0,$Date_List_2[1],$Date_List_2[2],$Date_List_2[0]);
$Days=round(($d1-$d2)/3600/24);
Echo "偶已经奋斗了 $Days 天^_^";
?>
--------------------------------------------------------------------------------
11:为什么我升级PHP后,原来的程序出现满屏的 Notice: Undefined variable:
这是警告的意思,由于变量未定义引起的.
打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL & ~E_NOTICE
对于Parse error错误
error_reporting(0)无法关闭.
如果你想关闭任何错误提示,打开php.ini,找到display_errors,设置为display_errors = Off.以后任何错误都不会提示.
那什么是error_reporting?
使用函式 date() 实现
<?php echo $showtime=date("Y-m-d H:i:s");?>
显示的格式: 年-月-日 小时:分钟:妙
相关时间参数:
a - "am" 或是 "pm"
A - "AM" 或是 "PM"
d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
D - 星期几,三个英文字母; 如: "Fri"
F - 月份,英文全名; 如: "January"
h - 12 小时制的小时; 如: "01" 至 "12"
H - 24 小时制的小时; 如: "00" 至 "23"
g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
G - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
i - 分钟; 如: "00" 至 "59"
j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
l - 星期几,英文全名; 如: "Friday"
m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
M - 月份,三个英文字母; 如: "Jan"
s - 秒; 如: "00" 至 "59"
S - 字尾加英文序数,二个英文字母; 如: "th","nd"
t - 指定月份的天数; 如: "28" 至 "31"
U - 总秒数
w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
Y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"
可以自由设定显示的内容,连接符号或是显示位置,例如 date("m-d H") 或者date("dmY");?>等
Call to undefined function mysql_connect()
很多初学者都经常碰到这种问题,但对老鸟来说这不是什么问题了,仔细分析一下就知道是mysql.dll文件没存在,或没有把php.ini里面的.extension=php_mysql.dll前面的; 去了.
php.ini的everyone权限不够,给php.ini文件增加everyone的所有权先后问题解决。
问题其实很简单的,可能还有一些其他的问题,各位要根据自己的具体情况去解决问题了.
在使用PHP 编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email ,更新帐号(密码,email )等事情。
为了在保证该系统安全的同时,不会加重我现有数据库的负担。因此这个新的系统要依赖cookies.这确实是一个两难的选择,因为如果只是设置一个用户名的cookie,是很不安全的,这行不通,但从数据库的负担考虑,我也不能加入一个简单的无序码而交由我的数据库来进行验证。
解决的方法是同时设置两个cookie,一个是用户名的cookie,一个是无序码的cookie. 这个无序码实际上是由用户名和一个超级密码(只有程序设计者知道)组合通过md5 ()函数运算产生的。由于md5 ()是一个单向的无序码,因此是不可以破解的。在用户更改email 时,我也可以用该email 和超级密码产生一个无序码,以让用户确认修改。这实际上是一个公匙/ 私匙类的系统。不明白?不要紧,下面再慢慢说明。
有趣的是,这个系统的扩展能力是可以达到无穷的,因为该系统的主要工作是计算md5 ()函数的值,而且由web 服务器完成,在负载增加时,可以加入其它的服务器来分担负载,虽然认证系统不会拖跨一个数据库,但是这样做就让最终的瓶颈只能出现在数据库上。
以下是该库中的两个函数——记号产生和记号认证函数。
<?php
$hidden_hash_var='your_secret_password_here';
$LOGGED_IN=false;
unset($LOGGED_IN);
function user_isloggedin() {
global $user_name,$id_hash,$hidden_hash_var,$LOGGED_IN;
file://已经进行无序码的检测了吗
file://如果是的话,返回该变量
if ( isset($LOGGED_IN) ) {
return $LOGGED_IN;
}
file://are both cookies present?
if ($user_name && $id_hash) {
/*
由cookies中得来的用户名和系统超级密码产生一个认证用的无序码如果该无序码与cookie中的无序码一样,则cookies中的变量是可信的,用户已经登录
*/
$hash=md5($user_name.$hidden_hash_var);
if ($hash == $id_hash) {
file://无序码符合,设置一个全局变量,这样我们在再次调用该函数的时候,
file://就无需再次进行md5()运算
$LOGGED_IN=true;
return true;
} else {
file://两个无序码不符合,没有登录
$LOGGED_IN=false;
return false;
}
} else {
$LOGGED_IN=false;
return false;
}
}
function user_set_tokens($user_name_in) {
/*
一旦用户名和密码通过验证,就调用这个函数
*/
global $hidden_hash_var,$user_name,$id_hash;
if (!$user_name_in) {
$feedback .= ' ERROR - User Name Missing When Setting Tokens ';
return false;
}
$user_name=strtolower($user_name_in);
file://使用用户名和超级密码创建一个无序码,作判断是否已经登录用
$id_hash= md5($user_name.$hidden_hash_var);
file://设置cookies的有效期为一个月,可设置为任何的值
setcookie('user_name',$user_name,(time()+2592000),'/','',0);
setcookie('id_hash',$id_hash,(time()+2592000),'/','',0);
}
?>
再来看另一段有趣的代码,用户怎样才能安全地改变他们的email地址呢?他们可以在任何时候改变email地址,但是要进行确认。
<?php
function user_change_email ($password1,$new_email,$user_name) {
global $feedback,$hidden_hash_var;
if (validate_email($new_email)) {
$hash=md5($new_email.$hidden_hash_var);
file://改变数据库中确认用的无序码值,但不改变email
file://发出一个带有新认证码的确认email
$user_name=strtolower($user_name);
$password1=strtolower($password1);
$sql="UPDATE user SET confirm_hash='$hash' WHERE user_name='$user_name' AND password='". md5($password1) ."'";
$result=db_query($sql);
if (!$result || db_affected_rows($result) < 1) {
$feedback .= ' ERROR - Incorrect User Name Or Password ';
return false;
} else {
$feedback .= ' Confirmation Sent ';
user_send_confirm_email($new_email,$hash);
return true;
}
} else {
$feedback .= ' New Email Address Appears Invalid ';
return false;
}
}
function user_confirm($hash,$email) {
/*
用户点击认证email的相关连接时,连到一个确认的页面,该页面会调用这个函数,
*/
global $feedback,$hidden_hash_var;
file://verify that they didn't tamper with the email address
$new_hash=md5($email.$hidden_hash_var);
if ($new_hash && ($new_hash==$hash)) {
file://在数据库中找出这个记录
$sql="SELECT * FROM user WHERE confirm_hash='$hash'";
$result=db_query($sql);
if (!$result || db_numrows($result) < 1) {
$feedback .= ' ERROR - Hash Not Found ';
return false;
} else {
file://确认email,并且设置帐号为已经激活
$feedback .= ' User Account Updated - You Are Now Logged In ';
user_set_tokens(db_result($result,0,'user_name'));
$sql="UPDATE user SET email='$email',is_confirmed='1' WHERE confirm_hash='$hash'";
$result=db_query($sql);
return true;
}
} else {
$feedback .= ' HASH INVALID - UPDATE FAILED ';
return false;
}
}
function user_send_confirm_email($email,$hash) {
/*
这个函数在首次注册或者改变email地址时使用
*/
$message = "Thank You For Registering at Company.com".
"nSimply follow this link to confirm your registration: ".
"nnhttp://www.company.com/account/confirm.php?hash=$hash&email=". urlencode($email). "nnOnce you confirm, you can use the services on PHPBuilder.";
mail ($email,'Registration Confirmation',$message,'From: noreply@company.com');
}
?>