本文章结合Codigniter框架与jquery 的ajax实现PHP POST提交到两个地址实现代码,有需要了解的朋友可进入参考。
Codigniter框架使用jquery+ajax/" target="_blank">jquery ajax代码如下:
代码如下 |
复制代码 |
<form action="<?php echo @htmlspecialchars($url['login_url']) ?>" method="post" enctype="application/x-www-form-urlencoded" name="form1" id="form1">
<p><label>工资号:</label>
<input name="Login.Token1" class="text" type="text" id="token1" />
</p>
<p><label>密 码:</label>
<input name="Login.Token2" class="text" type="password" id="token2" />
</p>
<p>
<input name="登录" type="submit" id="user_login" value="登录" />
<input type="reset" value="重置" />
</p>
<b style="color:red"><?php echo $this->session->flashdata('error'); ?></b>
</form>
<script>
$(function(){
$("#user_login").click(function(){
var username = $("#token1").val();
var salary_no = $("#token2").val();
$.ajax({
type: "POST",
data: "username="+username+"&salary_no="+salary_no,
url: "<?php echo site_url('home/ajax_check_username')?>",
dataType: "text",
cache: false,
error: function(){alert('error');},
success: function(data){
if(data == 'yes'){
location.href="<?php echo site_url('home/index')?>";
}else{
form1.submit();
}
}
});
return false;
});
});
</script>
|
ajax提交到home控制器代码:
代码如下 |
复制代码 |
#提交到本地
function ajax_check_username(){
//redirect('home/index');
$username = $this->input->post("username");
$salary_no = $this->input->post("salary_no");
if($this->user_mdl->check_ajax_user($username,$salary_no)){
$this->session->set_userdata('salary_no', $salary_no);
$this->session->set_userdata('username', $username);
echo "yes";
}else{
echo "no";
}
}
|
有很多朋友都不知道怎么把数组中元素给删除,下面我来总结各种数组删除元素方法给各位,有需要了解的朋友可进入参考。
删除数组指定元素
代码如下 |
复制代码 |
<?php
$a=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
print_r(array_slice($a,1,2));
?>
输出
Array ( [0] => Cat [1] => Horse )
|
几个函数用下来觉得array_search()比较实用
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false
代码如下 |
复制代码 |
$array = array('1', '2', '3', '4', '5');
$del_value = 3;
unset($array[array_search($del_value , $array)]);//利用unset删除这个元素
print_r($array);
输出
array('1', '2', '4', '5');
|
从数组头删除值
array_shift()函数删除并返回数组中找到的元素。其结果是,如果使用的是数值健,则所有相应的值都会下移,而使用关联键的数组不受影响。其形式为:
mixed array_shift(array array)
下面的例子删除了$fruits数组中的第一个元素apple:
代码如下 |
复制代码 |
$fruits = array("apple","banana","orange","pear");
$fruit = array_shift($fruits);
// $fruits = array("banana","orange","pear")
// $fruit = "apple";
|
从数组尾删除元素
array_pop()函数删除并返回数组的最后一个元素。其形式为:
mixed array_pop(aray target_array);
下面的例子从$states数组删除了最后的一个州:
代码如下 |
复制代码 |
$fruits = array("apple","banana","orange","pear");
$fruit = array_pop($fruits);
//$fruits = array("apple","banana","orange");
//$fruit = "pear";
|
删除数组中间的元素
代码如下 |
复制代码 |
function deleteElementFromArr($arr, $index){
if($index < count($arr)-1){
unset($arr[$index]);
reset($arr);
}
return $arr;
}
|
我封装成了一个函数,方便大家使用:
代码如下 |
复制代码 |
<?php
function array_remove(&$arr, $offset)
{
array_splice($arr, $offset, 1);
}
$arr = array('apple','banana','cat','dog');
array_remove($arr, 2);
print_r($arr);
?>
|
删除数组重复元素
代码如下 |
复制代码 |
<?php
function assoc_unique($arr, $key) {
$tmp_arr = array();
foreach($arr as $k => $v) {
if(in_array($v[$key], $tmp_arr)) {
unset($arr[$k]);
} else {
$tmp_arr[] = $v[$key];
}
}
sort($arr);
return $arr;
}
$aa = array(
array('id' => 123, 'name' => '张三'),
array('id' => 123, 'name' => '李四'),
array('id' => 124, 'name' => '王五'),
array('id' => 125, 'name' => '赵六'),
array('id' => 126, 'name' => '赵六')
);
$key = 'name';
assoc_unique(&$aa, $key);
print_r($aa);
?>
|
本文章来给大家介绍PHP ajax 统计当前在线用户数程序代码,有需要的朋友可参考。
我们要统计在一段时间内访问站点的人数,有多种解决方案,你可以使用cookie,session结合文本或者数据库来记录用户访问数。本文将使用PHP,结合Mysql以及jQuery,展示一个统计在线人数以及访客地区分布的示例。
通常,当访客访问网站时,页面记录用户的cookie信息,当cookie过期即认为用户不在线。本文中我们使用PHP记录访客IP,并在客户端记录cookie及过期时间,同时通过新浪IP地址接口,获取访客的地理位置(本例只记录省份),一并写入mysql表中,即可统计一段时间内的访客总数,也可以查看访客的地区分布。
HTML
我们在页面上放置一个显示当前在线人数的div#total以及一个用于展示访客地区分布的列表#onlinelist,默认我们在列表中放置一张与加载动画图片,后面我们用jQuery控制当鼠标滑向时展示详细列表。
代码如下 |
复制代码 |
<div class="demo">
<div id="total">当前在线:<span id="onlinenum"></span></div>
<ul id="onlinelist">
<li><img src="loader.gif"></li>
</ul>
</div>
|
CSS
我们用CSS来渲染显示效果,为了就是不让我们的示例很难看,下面的代码中,我们使用了CSS3,时代在进步啊,所以建议使用现代浏览器预览效果。
.
代码如下 |
复制代码 |
demo{width:150px; margin:20px auto; font-size:14px}
#total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff;
cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
-moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;}
#onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px;
-webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc;
-webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;}
#onlinelist li{height:20px; line-height:20px;padding:4px 6px;border-bottom:1px dotted #d9d9d9}
#onlinelist li span{float:right}
#onlinelist li:hover{background:#fff} |
Mysql
我们要准备一张数据表online,用来记录访客IP、地区及访问时间。整个示例统计过程都依赖这张表,其结构如下:
代码如下 |
复制代码 |
CREATE TABLE IF NOT EXISTS `online` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(30) NOT NULL,
`province` varchar(64) NOT NULL,
`addtime` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
PHP
online.php用来记录访客信息,包括IP地址和地区。首先检测数据表中是否有访客IP记录,如果有,则只更新访问时间,否则,获取用户省份区域,并将用户IP即省份区域插入到表中。在此,可以判断是否存在访客的cookie记录,如果不存在则向新浪IP地址库请求获取访客的区域信息,并设置cookie值和过期时间。最后,我们删除表中已经过期的记录,统计总记录数并输出,详细请看代码注释。
代码如下 |
复制代码 |
include_once('connect.php'); //连接数据库
$ip = get_client_ip(); //获取客户端IP
$time = time();
//查询表中是否有ip为当前访客IP的记录
$query = mysql_query("select id from online where ip='$ip'");
if(!mysql_num_rows($query)){//如果不存在访客IP
if($_COOKIE['geoData']){//如果存在cookie,则获取用户的区域
$province = $_COOKIE['geoData']; //区域(省份)
}else{
$api = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip";
$json = file_get_contents($api);//调用新浪IP地址库
$arr = json_decode($json,true);//解析json
$province = $arr['province'];//获取省份
setcookie('geoData',$province,$time+600); //设置cookie,设置过期时间为10分钟
}
//将访客信息插入到数据表中
mysql_query("insert into online (ip,province,addtime) values ('$ip','$province','$time')");
}else{//如果存在,则更新该用户访问时间
mysql_query("update online set addtime='$time' where ip='$ip'");
}
//删除已过期的记录
$outtime = $time-600;
mysql_query("delete from online where addtime<$outtime");
//统计总记录数,即在线用户数
list($totalOnline) = mysql_fetch_array(mysql_query("select count(*) from online"));
echo $totalOnline;//输出在线总数
mysql_close();
|
关于新浪IP地址库的调用,您也可以参阅helloweba.com文章根据IP定位用户所在城市信息的介绍。
函数get_client_ip()用来获取用户真实IP。
代码如下 |
复制代码 |
function get_client_ip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),
"unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset ($_SERVER['REMOTE_ADDR']) &&
$_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
|
geo.php用来统计各省份(区域)访客人数分布。通过查询数据库,并按省份分组排序即可,注意我们将最终的数据集以JSON的形式输出,便于前端ajax交互。
代码如下 |
复制代码 |
include_once('connect.php');//连接数据库
//查询区域统计
$sql = "select province,count(*) as total from online group by province order by total desc";
$result = mysql_query($sql);
while($row=mysql_fetch_array($result)){
$list[] = array(
'province' => $row['province'],
'total' => $row['total']
);
}
echo json_encode($list);//以json格式输出
|
jQuery
前端页面需要做的是,页面加载时展示访客总数,即使用ajax请求online.php即可。然后当鼠标滑向统计箭头时,通过ajax请求geo.php获取各区域省份的在线人数,并以下拉的方式展现效果。
代码如下 |
复制代码 |
$(function(){
$("#onlinenum").load("online.php");
$(".demo").hover(function(){
$("#onlinelist").slideDown("fast");
var str = '';
$.getJSON("geo.php",function(json){
$.each(json,function(index,array){
str = str + "<li><span>"+array['total']+"</span>"+array['province']+"</li>";
});
$("#onlinelist").html(str);
});
},function(){
$("#onlinelist").slideUp("fast");
});
});
|
完整实例
代码如下 |
复制代码 |
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>PHP+MySQL+jQuery统计当前在线用户数</title>
<link rel="stylesheet" type="text/css" href="../css/main.css" />
<style type="text/css">
.demo{width:150px; margin:20px auto; font-size:14px; position:relative}
#total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff; cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;}
#onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc; position:absolute; top:30px; width:150px}
#onlinelist li{height:20px; line-height:20px; padding:4px 6px; border-bottom:1px dotted #d9d9d9}
#onlinelist li span{float:right}
#onlinelist li:hover{background:#fff}
</style>
<script type="text/javascript" src="../js/jquery.js"></script>
<script type="text/javascript">
$(function(){
$("#onlinenum").load("online.php");
$(".demo").hover(function(){
$("#onlinelist").slideDown("fast");
var str = '';
$.getJSON("geo.php",function(json){
$.each(json,function(index,array){
str = str + "<li><span>"+array['total']+"</span>"+array['province']+"</li>";
});
$("#onlinelist").html(str);
});
},function(){
$("#onlinelist").slideUp("fast");
});
});
</script>
</head>
<body>
<div id="main">
<h2 class="top_title"><a href="blog-206.html" title="点击看教程">PHP+MySQL+jQuery统计当前在线用户数</a></h2>
<div class="demo">
<div id="total">当前在线:<span id="onlinenum"></span></div>
<ul id="onlinelist">
<li><img src="loader.gif"></li>
</ul>
</div>
<br/><br/><br/><br/><br/>
</div>
</body>
</html>
|
本文章基于php + mysql +jquery的ajax来实现无刷新文件下载次数统计,有需要的朋友可参考,下面我一步步给大家详细介绍实现过程。
本实例需要读者具备PHP、Mysql、jQuery以及html、css等相关的基本知识,在开发示例前,需要准备Mysql数据表,本文假设有一张文件下载表downloads,用来记录文件名、保存在文件服务器上的文件名以及下载次数。前提是假设下载表中已存在数据,这些数据可能来自项目中的后台上传文件时插入的,以便我们在页面中读取。downloads表结构如下:
代码如下 |
复制代码 |
CREATE TABLE IF NOT EXISTS `downloads` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`filename` varchar(50) NOT NULL,
`savename` varchar(50) NOT NULL,
`downloads` int(10) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `filename` (`filename`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
您也可以直接下载Demo,导入SQL文件,数据都有了。
HTML
我们在index.html页面body中加入如下HTML结构,其中ul.filelist用来陈列文件列表,现在它里面没有内容,我们将使用jQuery来异步读取文件列表,所以别忘了,我们还需要在html中加载jQuery库文件。
代码如下 |
复制代码 |
<div id="demo">
<ul class="filelist">
</ul>
</div>
|
CSS
为了让demo更好的展示页面效果,我们使用CSS来修饰页面,以下的代码主要设置文件列表展示效果,当然实际项目中可以根据需要设置相应的样式。
代码如下 |
复制代码 |
#demo{width:728px;margin:50px auto;padding:10px;border:1px solid #ddd;background-color:#eee;}
ul.filelist li{background:url("img/bg_gradient.gif") repeat-x center bottom #F5F5F5;
border:1px solid #ddd;border-top-color:#fff;list-style:none;position:relative;}
ul.filelist li.load{background:url("img/ajax_load.gif") no-repeat; padding-left:20px;
border:none; position:relative; left:150px; top:30px; width:200px}
ul.filelist li a{display:block;padding:8px;}
ul.filelist li a:hover .download{display:block;}
span.download{background-color:#64b126;border:1px solid #4e9416;color:white;
display:none;font-size:12px;padding:2px 4px;position:absolute;right:8px;
text-decoration:none;text-shadow:0 0 1px #315d0d;top:6px;
-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}
span.downcount{color:#999;padding:5px;position:absolute; margin-left:10px;text-decoration:none;}
|
PHP
为了更好的理解,我们分两个PHP文件,一个是filelist.php,用来读取mysql数据表中的数据,并输出为JSON格式的数据用来给前台index.html页面调用,另一个是download.php,用来响应下载动作,更新对应文件的下载次数,并且通过浏览器完成下载。其实还有一个数据库连接文件conn.php,已经打包在下载压缩包里了,点击这里下载。
filelist.php读取downloads表,并通过json_encode()将数据以JSON格式输出,这样是为下面的Ajax异步操作准备的。
代码如下 |
复制代码 |
require 'conn.php'; //连接数据库
$result = mysql_query("SELECT * FROM downloads");
if(mysql_num_rows($result)){
while($row=mysql_fetch_assoc($result)){
$data[] = array(
'id' => $row['id'],
'file' => $row['filename'],
'downloads'=> $row['downloads']
);
}
echo json_encode($data);
}
|
download.php根据url传参,查询得到对应的数据,检测要下载的文件是否存在,如果存在,则更新对应数据的下载次数+1,并且使用header()实现下载功能。值得一提的是,使用header()函数,强制下载文件,并且可以设置下载后保存到本地的文件名称。一般情况下,我们通过后台上传程序会将上传的文件重命名后保存到服务器上,常见的有以日期时间命名的文件,这样的好处之一就是避免了文件名重复和中文名称乱码的情况。而我们下载到本地的文件可以使用header("Content-Disposition: attachment; filename=" .$filename )将文件名设置为易于识别的文件名称。
代码如下 |
复制代码 |
require('conn.php');//连接数据库
$id = (int)$_GET['id'];
if(!isset($id) || $id==0) die('参数错误!');
$query = mysql_query("select * from downloads where id='$id'");
$row = mysql_fetch_array($query);
if(!$row) exit;
$filename = iconv('UTF-8','GBK',$row['filename']);//中文名称注意转换编码
$savename = $row['savename']; //实际在服务器上的保存名称
$myfile = 'file/'.$savename;
if(file_exists($myfile)){//如果文件存在
//更新下载次数
mysql_query("update downloads set downloads=downloads+1 where id='$id'");
//下载文件
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=" .$filename );
exit;
}else{
echo '文件不存在!';
}
|
jQuery
前端页面jQuery主要完成两个任务,一是通过Ajax异步读取文件列表并展示,二是响应用户点击事件,将对应的文件下载次数+1,来看代码:
代码如下 |
复制代码 |
$(function(){
$.ajax({ //异步请求
type: 'GET',
url: 'filelist.php',
dataType: 'json',
cache: false,
beforeSend: function(){
$(".filelist").html("<li class='load'>正在载入...</li>");
},
success: function(json){
if(json){
var li = '';
$.each(json,function(index,array){
li = li + '<li><a href="download.php?id='+array['id']+'">'+array['file']+
'<span class="downcount" title="下载次数">'+array['downloads']+'</span>
<span class="download">点击下载</span></a></li>';
});
$(".filelist").html(li);
}
}
});
$('ul.filelist a').live('click',function(){
var count = $('.downcount',this);
count.text( parseInt(count.text())+1); //下载次数+1
});
});
|
首先,页面载入完后,通过$.ajax()向后台filelist.php发送一个GET形式的Ajax请求,当filelist.php相应成功后,接收返回的json数据,通过$.each()遍历json数据对象,构造html字符串,并将最终得到的字符串加入到ul.filelist中,形成了demo中的文件列表。
然后,当点击文件下载时,通过live()响应动态加入的列表元素的click事件,将下载次数进行累加
上传文件或图片进行重命名是我们在php上传中会碰到的一个问题了,在重命名无非就是对你上传的文件生成一个随机的字符串了,包括有Md5,随机,或按时间日期来重命名了,下面我来给大家介绍。
如我们在上传文件页面中如下操作
代码如下 |
复制代码 |
$name=$_FILES['userfile']['name']; //将所上传的文件名称赋予name
|
然后我们要对它进行重命名
代码如下 |
复制代码 |
//文件名的自动生成
list($usec, $new_name) = explode(" ", microtime());
if(@$extension_name){//限制文件类型为jpg、gif、png、bmp
move_uploaded_file($tmp_name,$new_dir.'/'.$new_name.'.'.$extension_name);//移动到目标文件夹
echo '上传成功';
|
这样我们就把文件名以时间日期生成了一个新的文件名了
例
代码如下 |
复制代码 |
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
|
以下是我添加的将文件名重命名为系统时间的代码:
代码如下 |
复制代码 |
<?php
$date = date(ymdhis);
//echo($date);
if ((($_FILES["uppic"]["type"] == "image/gif")
|| ($_FILES["uppic"]["type"] == "image/jpeg")
|| ($_FILES["uppic"]["type"] == "image/pjpeg"))
&& ($_FILES["uppic"]["size"] < 2000000))
{
if ($_FILES["uppic"]["error"] > 0)
{
echo "Return Code: " . $_FILES["uppic"]["error"] . "<br />";
}
else
{
//echo "Upload: " . $_FILES["uppic"]["name"] . "<br />";
//echo "Type: " . $_FILES["uppic"]["type"] . "<br />";
//echo "Size: " . ($_FILES["uppic"]["size"] / 1024) . " Kb<br />";
//echo "Temp file: " . $_FILES["uppic"]["tmp_name"] . "<br />";
$uptype = explode(".", $_FILES["uppic"]["name"]);
$newname = $date.".".$uptype[1];
//echo($newname);
$_FILES["uppic"]["name"] = $newname;
if (file_exists("pics/" . $_FILES["uppic"]["name"]))
{
echo $_FILES["uppic"]["name"] . " already exists. ";
}
else
{
$_FILES["uppic"]["name"] =
move_uploaded_file($_FILES["uppic"]["tmp_name"],
"pics/" . $_FILES["uppic"]["name"]);
echo "<script>alert('上传成功!')</script>";
echo "<script>window.location.href='http://www.111cn.net';</script>";
}
}
}
else
{
echo "Invalid file";
}
?>
|
好了,就讲到这里了,大家可参考。