源生php 实现下拉加载 ajax 下拉加载

 

page.php


<?php
$conn=@mysql_connect("127.0.0.1","root","lzgabc123") or die("数据链接出错");
mysql_select_db("ghgl",$conn);
mysql_query("set names 'utf8'");
?>


 <script>
 function daojishi(id) {
 var t = Math.floor($("#" + id).attr('rel'));
 t--;
 var d = Math.floor(t / 60 / 60 / 24);
 var h = Math.floor(t / 60 / 60 % 24);
 var m = Math.floor(t / 60 % 60);
 var s = Math.floor(t % 60);
 if (d < 10) {
 d = '0' + d;
 }
 if (h < 10) {
 h = '0' + h;
 }
 if (m < 10) {
 m = '0' + m;
 }
 if (s < 10) {
 s = '0' + s;
 }
 $("#" + id).attr('rel', t);
 $("#" + id).html(d + ':' + h + ':' + m + ':' + s);
 }
</script>
<?php
require "conn.php";
$maxnum = 20; //每页记录条数
$sql_count = "SELECT COUNT(*) AS count FROM xy_cust";
$result=mysql_query($sql_count);
if($result)
{
 $row1 = mysql_fetch_assoc($result);
 $totalRows1 = $row1['count']; //数据集总条数
 $totalpages = ceil($totalRows1/$maxnum);//分页总数

 if(!isset($_GET['page']) || !intval($_GET['page']) || $_GET['page'] > $totalpages) $page = 1; //对3种出错进行处理 
 //在url参数page不存在时,page不为10进制数时,page大于可分页数时,默认为1 
 else $page = $_GET['page']; 
 $startnum = ($page - 1)*$maxnum; //从数据集第$startnum条开始读取记录,这里的数据集是从0开始的 
 $query = "SELECT * FROM xy_cust LIMIT $startnum,$maxnum";//选择出符合要求的数据 从$startnum条数据开始,选出$maxnum行 
 $result = mysql_query($query) or die(mysql_error()); 
 
 while ($row = mysql_fetch_array($result)) {
$xm=$row['xingming'];
$title=$row['title'];

$content=<<< content
<p style='height:66px;font-size:50px;'>{$xm}{$title}</p>
content;
echo $content;
 }
}


?>


 

index.html 访问页面

 <!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script src="jquery.min.js"></script>
 <script>
 var niulock = 1;
 var niunum = 1;
 function loaddata(page, obj, sc) {
 var link = page.replace('0000', niunum);
 
 // showLoader('正在加载中....');

 $.get(link, function (data) {
 if (data != 0) {
 obj.append(data);
 }
 niulock = 0;
 // hideLoader();
 }, 'html');
 if (sc === true) {
 $(window).scroll(function () {
 var wh = $(window).scrollTop();
 var xh = $(document).height() - $(window).height() - 70;
 if (!niulock && wh >= xh ) {
 niulock = 1;
 niunum++;
 var link = page.replace('0000', niunum);
 // showLoader('正在加载中....');
 var timeout = setTimeout(function(){
 niulock = 0;
 // hideLoader();
 },5000);
 $.get(link, function (data) {
 if (data != 0) {
 if(timeout){ //清除定时器
 clearTimeout(timeout);
 timeout = null;
 }
 obj.append(data);
 }
 niulock = 0;
 // hideLoader();
 }, 'html');
 }
 });
 }
 }
 </script>
 <script>
 $(document).ready(function () {
 loaddata('page.php?page=0000',$("#content"), true);
 });
 </script>
</head>
<body>
<div id="content">
 
</div> 
</body>
</html>

html5表单pattern属性配合正则验证电话和手机号码

http://blog.it985.com/7644.html

正则表达式(包括手机号码,3-4位区号,7-8位直播号码,1-4位分机号)

((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

正则解析

“^\d+$”  //非负整数(正整数 + 0)
“^[0-9]*[1-9][0-9]*$”  //正整数
“^((-\d+)|(0+))$”  //非正整数(负整数 + 0)
“^-[0-9]*[1-9][0-9]*$”  //负整数
“^-?\d+$”    //整数
“^\d+(\.\d+)?$”  //非负浮点数(正浮点数 + 0)
“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数
“^((-\d+(\.\d+)?)|(0+(\.0+)?))$”  //非正浮点数(负浮点数 + 0)
“^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点

“^(-?\d+)(\.\d+)?$”  //浮点数
“^[A-Za-z]+$”  //由26个英文字母组成的字符串
“^[A-Z]+$”  //由26个英文字母的大写组成的字符串
“^[a-z]+$”  //由26个英文字母的小写组成的字符串
“^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串
“^\w+$”  //由数字、26个英文字母或者下划线组成的字符串
“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”    //email地址
“^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”  //url
/^13\d{9}$/gi手机号正则表达式

 

案例

<input id=”private_phone” name=”private_phone” pattern=”(\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$” required=”required” type=”text” />

jQuery如何将$替换成¥

jQuery 名称冲突
jQuery 使用 $ 符号作为 jQuery 的简介方式。

某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号。

jQuery 使用名为 noConflict() 的方法来解决该问题。

var ¥=jQuery.noConflict(),帮助您使用自己的名称(比如 ¥)来代替 $ 符号。

 

jQuery中需要用到$符号,如果其他js库(例如大名鼎鼎的prototype)也定义了$符号,那么就会造成冲突,会影响到js代码的正常执行。jqeury提供了一些方案来避免这个问题,让我们来看看这几个方案有什么区别

方案1:
引入noConflict(),将$替换为其他符号

复制代码 代码如下:
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(“#btn1”).click(function(){
alert(“Text: ” + $j(“#test”).text());
});
});

缺点:引入了这段代码后,不仅是当前的js文件,该html引用的所有js中,如果有用到jquery中的$,都得用$j来代替之前的$

方案2:
ready函数是jquery的入口函数,可以
将$(document).ready(function(){
替换成
jQuery( document ).ready(function( $){}
缺点:只对ready嵌套内的代码有效,对嵌套外的代码是无效的。如果你所有的逻辑,都在写ready函数中,那没问题。但我们一般都会在ready函数之外写一些子函数,然后ready函数再去调用这些函数。这个方案对这些函数是无效的,因此这套方案有局限性。

方案3(推荐,特别是开发js插件时):

给js内容包上一个函数

复制代码 代码如下:
jQuery(function($){
//你的js代码放在这里(例如第二个方案提到的ready函数和子函数)
//如果是js文件,其实就是在文件头部和尾部各加一行代码
}

或者

复制代码 代码如下:
(function($) {
//你的js代码
})(jQuery);

这个方法,没有上面两个方案的缺点,只会影响到被包在jQuery(function($){}中的代码。
不会影响到其他js代码,这一点很重要。试想一下,假如你写了一个js公共组件,该组件需要用到jquery,为了提高鲁棒性,需考虑$符号冲突问题。如果使用方案1,那么别人在使用时,还得遵守你的约定,把自己js代码中的$改成$,而如果使用方案3,既能避免$冲突对该组件的影响,又无需要求使用公共组件的人修改自己的代码。

前端Web开发资源整理

作者:林梓
链接:https://zhuanlan.zhihu.com/p/23344447
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

记得大学做小组项目开发的时候,一个小组项目获得了老师的表扬,说页面美,有想点击的欲望,而我们其他大部分都不注重前端的页面展示和布局,都还振振有词的说只要功能实现了就OK了,页面美不美无所谓,现在想想当时好傻啊。

后来,有小伙伴自己做了个小游戏,类似扫雷这种,都觉得简单好玩,老师还提名表扬呢,那时没深究是怎么开发的,现在想想就是纯前端的简单小游戏啊。

工作后,发现前端才是王道啊,先不说大家说的什么“整个互联网都缺前端啊”这种话题,就说要抓取用户眼球,让用户有点击的欲望,这都是前端工作啊,毕竟用户才不关心“你咋实现这个功能的”,只要看着舒服就行。

其实,说这么多,我只想说,如果你想学前端,现在还来得及。我平时会留意各种资源,因此,这里整理一番,可能更适合有一定基础的前端学习者看~

说明:关于前端学习网站,太多了,什么官方文档啦、各种在线学习网站啦,只要你想学前端,那么一搜就全出来了,因此啊,我就不整理介绍了;

我主要整理3个部分:

  • 1)想开发项目,哪里找教程?
  • 2)关于前端的有趣网站;
  • 3)分享一些合集资源;

一、前端项目哪里找?

前端的入门教程网上很多,只要你搜索呼啦啦就出来了,因此啊,就不整理了。主要整理一下,哪里可以找到前端项目,就是有源代码的,可以拿来学习或者拿来用的。

  • 没有详细的教程,但可以找到项目并查看源代码和效果图:

1、CodePen

网站里有很多很酷的特效,而且看到它们的源代码,也可以看到效果图。

其实类似的网站有很多,就不一一介绍了:

2、 CodePlayer

网站里有各种项目效果,选择自己想学的,同样可以看到源代码和效果图,和codepen不同的是你可以看到作者是怎样把代码打出来的。

3、html5tricks

网站里有很多前端实现的功能,可以在线查看效果,也可以下载源码的。

  • 有详细的教程,而且步骤详细,教你一步步开发出项目:

4、phodal/ideabook

一个练手项目集,有很多实战项目,有步骤、效果图,同样可以看到源代码啊。

5、实验楼-WEB

网站里有很多前端项目教程,可以跟着教程一步步在环境中实现,并查看效果图,同样可以下载源代码,非常适合项目实战学习。

二、前端有趣的网站:

1、JS1k

大名鼎鼎的js1K,1K字节以内的Javascript代码,实现一个酷炫的动画、特效、小游戏之类的。官网从2010年开始征集参赛作品,现在已经办了7年了,还在办。

2、Can I use

CAN I USE,相信每个前端同学都不陌生,查询浏览器兼容性的利器。

3、JSHint

一个在线JS检测工具,可以检测JavaScript代码中的错误和潜在问题。

4、aaencode

将JS代码转换成常用的网络表情,例如“(゚Θ゚)”。转换的代码并不复杂,可以在源代码里看到。

类似的还有:

一个在线混淆工具,通过先进的算法,来混淆你的JavaScript代码,使其不可读。该工具还可以减小文件的大小,以便快速加载。

5、Best CSS Button Generator

网站主要提供各种按钮的CSS代码,你可以从预设的按钮中选择并使用模板用于自己的设计,还可以查看源代码,非常适合学习。

还有一个类似的:

网站是一个完整的代码生成器,可以自定义输入域或CSS3按钮,同样可以查看源代码,适合学习。

6、CSS属性指引

一份清单,按字母表顺序列出了每个CSS属性。

7、frontendrescue

里面分享了网络上关于前端的各种资源、大牛等信息,总之很多资源就对了。

三、一些整理的合集资源:

资源太多了,我就把平时mark的一些合集资源整理出来吧;

一些整理好的合集资源:

PHP实现执行定时任务的几种思路详解

转:https://segmentfault.com/a/1190000002955509

PHP本身是没有定时功能的,PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害。本文,我们就来深入的解析几种常见的php定时任务的思路。

Linux服务器上使用CronTab定时执行php

我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。

首先,进入命令行模式。作为服务器的linux一般都默认进入命令行模式的,当然,我们管理服务器也一般通过putty等工具远程连接到服务器,为了方便,我们用root用户登录。在命令行中键入:

crontab -e

之后就会打开一个文件,并且是非编辑状态,则是vi的编辑界面,通过敲键盘上的i,进入编辑模式,就可以编辑内容。这个文件中的每一行就是一个定时任务,我们新建一行,就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。我们现在来举个例子,增加一行,内容如下:

00 * * * * lynx -dump https://www.yourdomain.com/script.php

这是什么意思呢?实际上上面这一行由两部分组成,前面一部分是时间,后面一部分是操作内容。例如上面这个,

00 * * * *

就是指当当前时间的分钟数为00时,执行该定时任务。时间部分由5个时间参数组成,分别是:

分 时 日 月 周

第1列表示分钟1~59 每分钟用或者 */1表示,/n表示每n分钟,例如*/8就是每8分钟的意思,下面也是类推
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)

整个句子的后面部分就是操作的具体内容。

lynx -dump https://www.yourdomain.com/script.php

意思就是说通过lynx访问这个url。我们在使用中主要用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去执行本地php文件是最佳选择,例如:

00 */2 * * * /usr/local/bin/php /home/www/script.php

这条语句就可以在每2小时的0分钟,通过linux内部php环境执行script.php,注意,这里可不是通过url访问,通过服务器环境来执行哦,而是直接执行,因为绕过了服务器环境,所以效率当然要高很多。

好了,已经添加了几条需要的定时任务了吧。点击键盘上的Esc键,输入“:wq”回车,这样就保存了设置的定时任务,屏幕上也能看到提示创建了新的定时任务。接下来就是好好写你的script.php了。

关于CronTab的更多用法这里就不介绍了,如果你想更灵活的使用这个定时任务功能,应该自己再去深入学习一下crontab。

Windows服务器上使用bat定时执行php

windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,执行这个bat文件,就相当于依次执行里面的命令(当然,还可以通过逻辑来实现编程),所以,我们可以利用bat命令文件在windows服务器上面实现PHP定时任务。实际上在windows上定时任务,和linux上道理是一样的,只不过方法和途径不同。好了下面开始。

首先,在一个你觉得比较适当的位置创建一个cron.bat文件,然后用文本编辑器打开它(记事本都可以),在里面写上这样的内容:

D:\php\php.exe -q D:\website\test.php

这句话的意思就是,使用php.exe去执行test.php这个php文件,和上面的contab一样,绕过了服务器环境,执行效率也比较高。写好之后,点击保存,关闭编辑器。

接下来就是设置定时任务来运行cron.bat。依次打开:“开始–>控制面板–>任务计划–>添加任务计划”,在打开的界面中设置定时任务的时间、密码,通过选择,把cron.bat挂载进去。确定,这样一个定时任务就建立好了,在这个定时任务上右键,运行,这个定时任务就开始执行了,到点时,就会运行cron.bat处理,cron.bat再去执行php。

非自有服务器(虚拟主机)上实现php定时任务

如果站长没有自己的服务器,而是租用虚拟主机,就无法进入服务器系统进行上述操作。这个时候应该如何进行php定时任务呢?其实方法又有多个。

使用ignore_user_abort(true)和sleep死循环

在一个php文档的开头直接来一句:

ignore_user_abort(true);

这时,通过url访问这个php的时候,即使用户把浏览器关掉(断开连接),php也会在服务器上继续执行。利用这个特性,我们可以实现非常牛的功能,也就是通过它来实现定时任务的激活,激活之后就随便它自己怎么办了,实际上就有点类似于后台任务。

而sleep(n)则是指当程序执行到这里时,暂时不往下执行,而是休息n秒钟。如果你访问这个php,就会发现页面起码要加载n秒钟。实际上,这种长时间等待的行为是比较消耗资源的,不能大量使用。

那么定时任务到底怎么实现呢?使用下面的代码即可实现:

<?php

ignore_user_abort(true);
set_time_limit(0);
date_default_timezone_set('PRC'); // 切换到中国的时间

$run_time = strtotime('+1 day'); // 定时任务第一次执行的时间是明天的这个时候
$interval = 3600*12; // 每12个小时执行一次

if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目录下存放一个cron-run文件,如果这个文件不存在,说明已经在执行过程中了,该任务就不能再激活,执行第二次,否则这个文件被多次访问的话,服务器就要崩溃掉了

do {
  if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch这个文件,就停止执行,这是一个开关的作用
  $gmt_time = microtime(true); // 当前的运行时间,精确到0.0001秒
  $loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次执行任务,$loop就是要等多久才执行的时间间隔
  $loop = $loop > 0 ? $loop : 0;
  if(!$loop) break; // 如果循环的间隔为零,则停止
  sleep($loop); 
  // ...
  // 执行某些代码
  // ...
  @unlink(dirname(__FILE__).'/cron-run'); // 这里就是通过删除cron-run来告诉程序,这个定时任务已经在执行过程中,不能再执行一个新的同样的任务
  $loop = $interval;
} while(true);

通过执行上面这段php代码,即可实现定时任务,直到你删除cron-switch文件,这个任务才会停止。

但是有一个问题,也就是如果用户直接访问这个php,实际上没有任何作用,页面也会停在这个地方,一直处于加载状态,有没有一种办法可以消除这种影响呢?fsockopen帮我们解决了这个问题。

fsockopen可以实现在请求访问某个文件时,不必获得返回结果就继续往下执行程序,这是和curl通常用法不一样的地方,我们在使用curl访问网页时,一定要等curl加载完网页后,才会执行curl后面的代码,虽然实际上curl也可以实现“非阻塞式”的请求,但是比fsockopen复杂的多,所以我们优先选择fsockopen,fsockopen可以在规定的时间内,比如1秒钟以内,完成对访问路径发出请求,完成之后就不管这个路径是否返回内容了,它的任务就到这里结束,可以继续往下执行程序了。利用这个特性,我们在正常的程序流中加入fsockopen,对上面我们创建的这个定时任务php的地址发出请求,即可让定时任务在后台执行。如果上面这个php的url地址是www.yourdomain.com/script.php,那么我们在编程中,可以这样:

// ...
// 正常的php执行程序
// ..

// 远程请求(不获取内容)函数,下面可以反复使用
function _sock($url) {
  $host = parse_url($url,PHP_URL_HOST);
  $port = parse_url($url,PHP_URL_PORT);
  $port = $port ? $port : 80;
  $scheme = parse_url($url,PHP_URL_SCHEME);
  $path = parse_url($url,PHP_URL_PATH);
  $query = parse_url($url,PHP_URL_QUERY);
  if($query) $path .= '?'.$query;
  if($scheme == 'https') {
    $host = 'ssl://'.$host;
  }

  $fp = fsockopen($host,$port,$error_code,$error_msg,1);
  if(!$fp) {
    return array('error_code' => $error_code,'error_msg' => $error_msg);
  }
  else {
    stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式
    stream_set_timeout($fp,1);//设置超时
    $header = "GET $path HTTP/1.1\r\n";
    $header.="Host: $host\r\n";
    $header.="Connection: close\r\n\r\n";//长连接关闭
    fwrite($fp, $header);
    usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功
    fclose($fp);
    return array('error_code' => 0);
  }
}

_sock('www.yourdomain.com/script.php');

// ...
// 继续执行其他动作
// ..

把这段代码加入到某个定时任务提交结果程序中,在设置好时间后,提交,然后执行上面这个代码,就可以激活该定时任务,而且对于提交的这个用户而言,没有任何页面上的堵塞感。

借用用户的访问行为来执行某些延迟任务

但是上面使用sleep来实现定时任务,是效率很低的一种方案。我们希望不要使用这种方式来执行,这样的话就可以解决效率问题。我们借用用户访问行为来执行任务。用户对网站的访问其实是一个非常丰富的行为资源,包括搜索引擎蜘蛛对网站的访问,都可以算作这个类型。在用户访问网站时,内部加一个动作,去检查任务列表中是否存在没有被执行的任务,如果存在,就将这个任务执行。对于用户而言,利用上面所说的fsockopen,根本感觉不到自己的访问竟然还做出了这样的贡献。但是这种访问的缺点就是访问很不规律,比如你希望在凌晨2点执行某项任务,但是这个时间段非常倒霉,没有用户或任何行为到达你的网站,直到早上6点才有一个新访问。这就导致你原本打算2点执行的任务,到6点才被执行。

这里涉及到一个定时任务列表,也就是说你需要有一个列表来记录所有任务的时间、执行什么内容。一般来说,很多系统会采用数据库来记录这些任务列表,比如wordpress就是这样做的。我则利用文件读写特性,提供了托管在github上的开源项目php-cron,你可以去看看。总之,如果你想要管理多个定时任务,靠上面的单个php是无法合理布局的,必须想办法构建一个schedules列表。由于这里面的逻辑比较复杂,就不再详细阐述,我们仅停留在思路层面上。

借用第三方定时任务跳板

很好玩的是,一些服务商提供了各种类型的定时任务,例如阿里云的ACE提供了单独的定时任务,你可以填写自己应用下的某个uri。百度云BCE提供了服务器监测功能,每天会按照一定的时间规律访问应用下的固定uri。类似的第三方平台上还有很多定时任务可以用。你完全可以用这些第三方定时任务作为跳板,为你的网站定时任务服务。比如说,你可以在阿里云ACE上建立一个每天凌晨2点的定时任务,执行的uri是/cron.php。然后你创建一个cron.php,里面则采用fsockopen去访问你真正要执行某些任务的网站的url,例如上面的www.yourdomain.com/script.php,而且在cron.php中还可以访问多个url。然后把cron.php上传到你的ACE上面去,让ACE的定时任务去访问/cron.php,然后让cron.php去远程请求目标网站的定时任务脚本。

循环利用include包含文件(待验证)

php面向过程的特性使得其程序是从上往下执行的,利用这个特性,在我们使用include某个文件时,就会执行被引入的文件,知道include的文件内程序执行完之后,再往下执行。如果我们创建一个循环,再利用sleep,不断的include某个文件,使循环执行某段程序,则可以达到定时执行的目的。我们再进一步,并不是利用while(true)来实现循环,而是利用被include文件本身再include自身来实现循环,比如我们创建一个do.php,它的内容如下:

if(...) exit(); // 通过某个开关来关闭执行

// ... 
// 执行某些程序
// ...

sleep($loop); // 这个$loop在include('do.php');之前赋值

include(dirname(__FILE__).'/do.php');

其实通过这种方法执行和while的思路也像。而且同样用到sleep,效率低。

PHP定时任务是一个非常有意思的东西,虽然说实话,用系统的php.exe去直接执行php文件的效率更高,但是对于很多普通站长而言,虚拟主机是无法做到直接php执行原生程序的。本文仅提供一些解决的思路,我也仅仅是在学习中,有很多问题或表述都不正确,希望你指出来;你可以通过本文的思路,开发出自己的一种解决方案,希望你能将方案发布,并与我一起探讨。

php 格式化时间 秒前 分钟前 小时前 天前


/**
* 格式化中奖时间
* @param unknown_type $lottery_time
*/
public static function format_lottery_time($lottery_time){

$time_span = NOW_TIME - $lottery_time;
if($time_span>3600*24*365)
{
//一年以前

$time_span_lang = to_date($lottery_time,"Y-m-d");
}
elseif($time_span>3600*24*30)
{
//一月

$time_span_lang = to_date($lottery_time,"Y-m-d");
}
elseif($time_span>3600*24)
{
//一天
$time_span_lang = round($time_span/(3600*24))."天前";
//$time_span_lang = to_date($time,"Y-m-d");
}
elseif($time_span>3600)
{
//一小时
$time_span_lang = round($time_span/(3600))."小时前";
}
elseif($time_span>60)
{
//一分
$time_span_lang = round($time_span/(60))."分钟前";
}
else
{
//一秒
$time_span_lang = $time_span."秒前";
}
return $time_span_lang;
}

thinkphp ajax 下拉加载

function loaddata(page, obj, sc) {
    var link = page.replace('0000', niunum);
    showLoader('正在加载中....');

    $.get(link, function (data) {
        if (data != 0) {
            obj.append(data);
        }
        niulock = 0;
        hideLoader();
    }, 'html');
    if (sc === true) {
        $(window).scroll(function () {
			var wh = $(window).scrollTop();
			var xh = $(document).height() - $(window).height() - 70;
            if (!niulock && wh >= xh ) {
                niulock = 1;
                niunum++;
                var link = page.replace('0000', niunum);
                showLoader('正在加载中....');
				var timeout = setTimeout(function(){
					niulock = 0;
					hideLoader();
				},5000);
                $.get(link, function (data) {
                    if (data != 0) {
						if(timeout){ //清除定时器
							clearTimeout(timeout);
							timeout = null;
						}
                        obj.append(data);
                    }
                    niulock = 0;
                    hideLoader();
                }, 'html');
            }
        });
    }
}
<script>
$(document).ready(function () {
loaddata(‘/mobile/tuan/loaddata/t/1479548691/p/0000.html’, $(“#tuan-list”), true);
});
</script>

public function loaddata()
{
$Tuan = D('Tuan');
import('ORG.Util.Page');
// 导入分页类
$map = array('audit' => 1, 'closed' => 0, 'city_id' => $this->city_id, 'end_date' => array('EGT', TODAY));
if ($keyword = $this->_param('keyword', 'htmlspecialchars')) {
$map['title'] = array('LIKE', '%' . $keyword . '%');
}
$cat = (int) $this->_param('cat');
if ($cat) {
$catids = D('Tuancate')->getChildren($cat);
if (!empty($catids)) {
$map['cate_id'] = array('IN', $catids);
} else {
$map['cate_id'] = $cat;
}
}
$area = (int) $this->_param('area');
if ($area) {
$map['area_id'] = $area;
}
$order = $this->_param('order', 'htmlspecialchars');
$lat = addslashes(cookie('lat'));
$lng = addslashes(cookie('lng'));
if (empty($lat) || empty($lng)) {
$lat = $this->city['lat'];
$lng = $this->city['lng'];
}
$orderby = '';
switch ($order) {
case 3:
//$orderby = " (ABS(lng - '{$lng}') + ABS(lat - '{$lat}') ) asc ";
$orderby = array('create_time' => 'desc');
break;
case 2:
$orderby = array('orderby' => 'asc', 'tuan_id' => 'desc');
break;
default:
$orderby = array('sold_num' => 'desc');
break;
}
$count = $Tuan->where($map)->count();
// 查询满足要求的总记录数
$Page = new Page($count, 10);
// 实例化分页类 传入总记录数和每页显示的记录数
$show = $Page->show();
// 分页显示输出
$var = C('VAR_PAGE') ? C('VAR_PAGE') : 'p';
$p = $_GET[$var];
if ($Page->totalPages < $p) {
die('0');
}
$list = $Tuan->where($map)->order($orderby)->limit($Page->firstRow . ',' . $Page->listRows)->select();
foreach ($list as $k => $val) {
if ($val['shop_id']) {
$shop_ids[$val['shop_id']] = $val['shop_id'];
}
$val['end_time'] = strtotime($val['end_date']) - NOW_TIME + 86400;
$list[$k] = $val;
}
if ($shop_ids) {
$shops = D('Shop')->itemsByIds($shop_ids);
$ids = array();
foreach ($shops as $k => $val) {
$shops[$k]['d'] = getDistance($lat, $lng, $val['lat'], $val['lng']);
$d = getDistanceNone($lat, $lng, $val['lat'], $val['lng']);
$ids[$d][] = $k;
}
ksort($ids);
$showshops = array();
foreach ($ids as $arr1) {
foreach ($arr1 as $val) {
$showshops[$val] = $shops[$val];
}
}
$this->assign('shops', $showshops);
}
$this->assign('list', $list);
// 赋值数据集
$this->assign('page', $show);
// 赋值分页输出
$this->display();
}

 

<script>
function daojishi(id) {
var t = Math.floor($(“#” + id).attr(‘rel’));
t–;
var d = Math.floor(t / 60 / 60 / 24);
var h = Math.floor(t / 60 / 60 % 24);
var m = Math.floor(t / 60 % 60);
var s = Math.floor(t % 60);
if (d < 10) {
d = ‘0’ + d;
}
if (h < 10) {
h = ‘0’ + h;
}
if (m < 10) {
m = ‘0’ + m;
}
if (s < 10) {
s = ‘0’ + s;
}
$(“#” + id).attr(‘rel’, t);
$(“#” + id).html(d + ‘:’ + h + ‘:’ + m + ‘:’ + s);
}
</script>
<foreach name=”shops” item=”var”>
<div class=”tuan-shop”>
<div class=”shop-con”>
<div class=”shop-name”><a title=”<{$var.shop_name}>” href=”<{:U(‘shop/detail’,array(‘shop_id’=>$var[‘shop_id’]))}>”><{$var.shop_name}></a></div>
<div class=”shop-tags”>
<!–暂时可以不用开始–>
<if condition=”$var[‘is_renzheng’] eq 1″> <span class=”z”>证</span> </if>
<gt name=”var.card_date” value=”$today”><span class=”k”>卡</span></gt>
<gt name=”var.wei_date” value=”$today”> <span class=”w”>微</span></gt>
<if condition=”$var[‘is_ding’] eq 1″> <span class=”d”>订</span></if>
<gt name=”var.yuyue_date” value=”$today”><span class=”d”>订</span></gt>
<!–暂时可以不用结束–>
<div class=”shop-local”><span class=”mui-icon mui-icon-location”></span><{$var.d}></div>
</div>
</div>

<div class=”main-tuan”>
<ul>
<foreach name=”list” item=”item”>
<eq name=”item.shop_id” value=”$var[‘shop_id’]”>

<php>
if($item[‘bg_date’] <= $today && $item[‘end_date’] > $today){

$tt = strtotime($item[‘end_date’])-time();
$item[‘djs_time’] = $tt;
$item[‘djs_str’] = ‘距结束’;

}elseif($item[‘bg_date’] >$today){
$tt = strtotime($item[‘bg_date’])-time();
$item[‘djs_time’] = $tt;
$item[‘djs_str’] = ‘距开始’;

}
</php>
<script type=”text/javascript” language=”javascript”>
setInterval(function () {
daojishi(“daojishi_<{$item.tuan_id}>”);
}, 1000);
</script>

<li>
<a class=”line” href=”<{:U(‘tuan/detail’,array(‘tuan_id’=>$item[‘tuan_id’]))}>” >
<div class=”container”>
<img class=”x4″ src=”__ROOT__/attachs/<{$item.photo}>” />
<div class=”des x8″>
<h5><{$item.title}></h5>
<p class=”intro”>
<em class=”clock_ico”></em>
<{$item[‘djs_str’]}>
<span id=”daojishi_<{$item.tuan_id}>” rel=”<{$item[‘djs_time’]}>” >00:00:00:00</span>
</p>
<p class=”info”>
<span>¥ <em><{:round($item[‘tuan_price’]/100,2)}></em></span> <del>¥ <{:round($item[‘price’]/100,2)}></del>

<span class=”text-little float-right badge bg-yellow margin-small-top padding-right”>已售<{$item.sold_num}></span>
</p>
</div>
</div>
</a>
</li>
</eq>
</foreach>
</ul>
</div>
</div>
</foreach>

关于thinkphp框架头部公共文件的调用问题 ‘LAYOUT_ON’=>true, ‘LAYOUT_NAME’=>’layout’,

ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能。

有三种布局模板的支持方式:

第一种方式:全局配置方式

这种方式仅需在项目配置文件中添加相关的布局模板配置,就可以简单实现模板布局功能,比较适用于全站使用相同布局的情况,需要配置开启LAYOUT_ON 参数(默认不开启),并且设置布局入口文件名LAYOUT_NAME(默认为layout)。

  1. 'LAYOUT_ON'=>true,
  2. 'LAYOUT_NAME'=>'layout',

开启LAYOUT_ON后,我们的模板渲染流程就有所变化,例如:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. $this->display('add');
  6. }
  7. }

在不开启LAYOUT_ON布局模板之前,会直接渲染 Application/Home/View/User/add.html 模板文件,开启之后,首先会渲染Application/Home/View/layout.html 模板,布局模板的写法和其他模板的写法类似,本身也可以支持所有的模板标签以及包含文件,区别在于有一个特定的输出替换变量{__CONTENT__},例如,下面是一个典型的layout.html模板的写法:

  1. <include file="Public:header" />
  2. {__CONTENT__}
  3. <include file="Public:footer" />

读取layout模板之后,会再解析User/add.html 模板文件,并把解析后的内容替换到layout布局模板文件的{CONTENT} 特定字符串。

当然可以通过设置来改变这个特定的替换字符串,例如:

  1. 'TMPL_LAYOUT_ITEM' => '{__REPLACE__}'

一个布局模板同时只能有一个特定替换字符串。

采用这种布局方式的情况下,一旦User/add.html 模板文件或者layout.html布局模板文件发生修改,都会导致模板重新编译。

如果需要指定其他位置的布局模板,可以使用:

  1. 'LAYOUT_NAME'=>'Layout/layoutname',

就表示采用Application/Home/View/Layout/layoutname.html作为布局模板。

如果某些页面不需要使用布局模板功能,可以在模板文件开头加上 {__NOLAYOUT__} 字符串。

如果上面的User/add.html 模板文件里面包含有{__NOLAYOUT__},则即使当前开启布局模板,也不会进行布局模板解析。

第二种方式:模板标签方式

这种布局模板不需要在配置文件中设置任何参数,也不需要开启LAYOUT_ON,直接在模板文件中指定布局模板即可,相关的布局模板调整也在模板中进行。

以前面的输出模板为例,这种方式的入口还是在User/add.html 模板,但是我们可以修改下add模板文件的内容,在头部增加下面的布局标签(记得首先关闭前面的LAYOUT_ON设置,否则可能出现布局循环):

  1. <layout name="layout" />

表示当前模板文件需要使用layout.html 布局模板文件,而布局模板文件的写法和上面第一种方式是一样的。当渲染User/add.html 模板文件的时候,如果读取到layout标签,则会把当前模板的解析内容替换到layout布局模板的{CONTENT} 特定字符串。

一个模板文件中只能使用一个布局模板,如果模板文件中没有使用任何layout标签则表示当前模板不使用任何布局。

如果需要使用其他的布局模板,可以改变layout的name属性,例如:

  1. <layout name="newlayout" />

还可以在layout标签里面指定要替换的特定字符串:

  1. <layout name="Layout/newlayout" replace="{__REPLACE__}" />

由于所有include标签引入的文件都支持layout标签,所以,我们可以借助layout标签和include标签相结合的方式实现布局模板的嵌套。例如,上面的例子

  1. <include file="Public:header" />
  2. <div id="main" class="main" >
  3. {__CONTENT__}
  4. </div>
  5. <include file="Public:footer" />

在引入的header和footer模板文件中也可以添加layout标签,例如header模板文件的开头添加如下标签:

  1. <layout name="menu" />

这样就实现了在头部模板中引用了menu布局模板。

也可以采用两种布局方式的结合,可以实现更加复杂的模板布局以及嵌套功能。

第三种方式:使用layout控制模板布局

使用内置的layout方法可以更灵活的在程序中控制模板输出的布局功能,尤其适用于局部需要布局或者关闭布局的情况,这种方式也不需要在配置文件中开启LAYOUT_ON。例如:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout(true);
  6. $this->display('add');
  7. }
  8. }

表示当前的模板输出启用了布局模板,并且采用默认的layout布局模板。

如果当前输出需要使用不同的布局模板,可以动态的指定布局模板名称,例如:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout('Layout/newlayout');
  6. $this->display('add');
  7. }
  8. }

或者使用layout方法动态关闭当前模板的布局功能(这种用法可以配合第一种布局方式,例如全局配置已经开启了布局,可以在某个页面单独关闭):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. Class UserController extends Controller{
  4. Public function add() {
  5. layout(false); // 临时关闭当前模板的布局功能
  6. $this->display('add');
  7. }
  8. }

三种模板布局方式中,第一种和第三种是在程序中配置实现模板布局,第二种方式则是单纯通过模板标签在模板中使用布局。具体选择什么方式,需要根据项目的实际情况来了。

include标签

使用include标签在当前模板中包含公共模板,例如常见的header和footer等公共模板,include标签最常用的属性是file,但是支持不同的用法,其用法基本和我们常用的模板渲染方法display方法差不多。例如:
包含Public目录下面的header模板

1
<include file="Public:header" />

包含当前模板目录下面的menu模板

1
<include file="menu" />

表示包含blue模板主题下面的User/read模板文件,include标签所支持的模板深度只能到操作层次,也就是说ThinkPHP默认的模板结构采用的是:主题/模块/操作.模板后缀,使用上述用法包含模板的时候,file属性不需要指定模板后缀,如果你的模板结构不是标准结构,可以采用包含完整模板文件的方式:

1
<include file="./Tpl/default/header.html" />

include标签可以一定程度上简化重复的模板书写,和便于同步修改,不足就是如果公共模板文件发生更改,但是当前的主模板文件没有更改,则不会自动更新模板缓存,除非你设置了模板缓存有效期,那么在缓存过期后会自动更新模板缓存。

防火墙代码 日志文件 360log.txt $Safexss = new Safexss();


/*
防火墙代码
日志文件 360log.txt
*/
$Safexss = new Safexss(); //SQL注入检查

if (!get_magic_quotes_gpc()){ //XXS防护
//$_GET && $_GET = Safexss::deepAddslashes($_GET);
// $_POST && $_POST = Safexss::deepAddslashes($_POST);
//$_COOKIE && $_COOKIE = Safexss::deepAddslashes($_COOKIE);
//$_REQUEST && $_REQUEST = Safexss::deepAddslashes($_REQUEST);
}
class Safexss{

public $getfilter="'|\b(alert|confirm|prompt)\b|<[^>]*?>|^\\+\/v(8|9)|\\b(and|or)\\b.+?(>|<|=|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

//public $postfilter="^\\+\/v(8|9)|\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|<\\s*img\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
public $postfilter="^\\+\/v(8|9)|\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

public $cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
function __construct(){
foreach($_GET as $key=>$value){
$this->StopAttack($key,$value,$this->getfilter);
}

foreach($_POST as $key=>$value){
$this->StopAttack($key,$value,$this->postfilter);
}

foreach($_COOKIE as $key=>$value){
$this->StopAttack($key,$value,$this->cookiefilter);
}
}

function customError($errno, $errstr, $errfile, $errline){
echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />";
die();
}

function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){
if(is_array($StrFiltValue)){
$StrFiltValue=implode($StrFiltValue);
}
if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
$this->slog("<br><br>操作IP: ".$_SERVER["REMOTE_ADDR"]."<br>操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交参数: ".$StrFiltKey."<br>提交数据: ".$StrFiltValue);
header("Location:/");
exit();
}
}

function slog($logs){
$toppath="./360log.txt";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs."\r\n");
fclose($Ts);
}

public static function deepAddslashes($value){
if(empty($value)){
return $value;
}else{
return is_array($value) ? array_map('Safexss::deepAddslashes', $value) : addslashes($value);
}
}
}