$tj=" and (unix_timestamp(time1) < unix_timestamp(NOW()))";
关注公众号,了解更多it技术(it问答网)
徐多蔚APP开发,合肥物联网项目开发,合肥网络开发,合肥项目高端定制,企业oa开发,合肥小程序开发,合肥公众号开发,合肥网络安防 – 徐多蔚 xuduowei
联系方式[微信]:徐多蔚15309695130 感恩有您的陪伴,我们用心服务每一位客户 – 徐多蔚 xuduowei
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: ‘id’,
sortName: ‘id’,
escape:false,
columns: [
/**
* 随机获取数据
* @param string $num 抽取条数
* @param string $table 表名
* @param string $where 查询条件
* @return array
*/
function tt_random_data($num,$table,$where=[])
{
$pk = Db::name($table)->getPK();//获取主键
$countcus = Db::name($table)->where($where)->field($pk)->select();//查询数据
$con = '';
$qu = '';
foreach($countcus as $v=>$val){
$con.= $val[$pk].'|';
}
$array = explode("|",$con);
$countnum = count($array)-1;
for($i = 0;$i <= $num;$i++){
$sunum = mt_rand(0,$countnum);
$qu.= $array[$sunum].',';
}
$list = Db::name($table)->where($pk,'in',$qu)->limit(0,$num)->select();
return $list;
}
亲测有效。
方法一
先任一设置一个session值,然后获取session id
session(‘g’,”);//执行一次助手函数,session啥都可以,只要执行这个函数即可。
$session_id = session_id();
方法二
在文件\think\Session 中加一个函数
public static function sid(){
if (PHP_SESSION_ACTIVE != session_status()) {
session_start();
}
return session_id();
}
$sql="select a.*,b.name from obj_users_admin a left join obj_users_admin_groups b on a.gid=b.id";
$b=$num=2; //每页显示记录数
$page=input("get.page")?input("get.page"):1; //当前页
$count = Db::execute($sql); //总条数
$a=($page-1)*$b;
$sql2=$sql." limit $a,$b";
$list = Db::query($sql2); //当前页数据
$arr=Bootstrap::make($list,$num,$page,$count,false,['path'=>Bootstrap::getCurrentPath(),'query'=>request()->param()]);
print_r($arr);
print_r($arr->render());
徐多蔚亲测无误!
tp5中LEFT分页格式:
$a=config("database.prefix")."users_admin";
$b=config("database.prefix")."users_admin_groups";
$arr=$obj->db->table("$a a")
->join("$b b", "a.gid=b.id", 'LEFT')->where($tj)->field("a.*,b.name")->order("a.updatetime desc,a.id desc")->paginate(2,false, [
'query' => Request::instance()->param(),//不丢失已存在的url参数
]);
大家可能都用过in_array来判断一个数据是否在一个数组中,一般我们的数组可能数据都比较小,对性能没什么影响,所以也就不会太在意。
但是如果数组比较大的时候,性能就会下降,运行的就会久一点,那如果针对在大数组情况下做优化呢,下面说两种方法(都是通过自定义函数来实现):
1.数组key与value翻转,通过isset判断key是否存在于数组中
/**
* in_array is too slow when array is large
*/
function inArray($item, $array) {
$flipArray = array_flip($array);
return isset($flipArray[$item]);
}
大家可能也会问为什么不用 array_key_exists 来做判断二用isset呢? 下面看下array_key_exists() 与 isset() 的对比:
isset()对于数组中为NULL的值不会返回TRUE,而array_key_exists()会。
<?php
$search_array = array('first' => null, 'second' => 4);
// returns false
isset($search_array['first']);
// returns true
array_key_exists('first', $search_array);
?>
2.用implode连接,直接用strpos判断
用implode函数+逗号连起来,直接用strpos判断。php里面字符串取位置速度非常快,尤其是在大数据量的情况下。不过需要注意的是首尾都要加”,” ,这样比较严谨。如: ,user1,user2,user3, 查找的时候,查,user1,。还有strpos要用!== false,因为第一个会返回0。示例如下:
return strpos($str,(string)$item)==false?false:true;**
* in_array is too slow when array is large
*/
function inArray($item, $array) {
$str = implode(',', $array);
return strpos($str,(string)$item)==false?false:true;
}
提示:以上2个函数均有bug!方法一数组翻转中,若原始数组值有null的,是会出问题的;方法二的只能验证字符串类型的。无法验证整形数字。总结:还是in_array($str,$arr,true) 验证方式最安全可靠。虽然性能相对底一点。
先说一下深拷贝和浅拷贝通俗理解
深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个
PHP中, = 赋值时,普通对象是深拷贝,但对对象来说,是浅拷贝。也就是说,对象的赋值是引用赋值。(对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号)
php4中,对象的 = 赋值是实现一份副本,这样存在很多问题,在不知不觉中我们可能会拷贝很多份副本。
php5中,对象的 = 赋值和传递都是引用。要想实现拷贝副本,php提供了clone函数实现。
clone完全copy了一份副本。但是clone时,我们可能不希望copy源对象的所有内容,那我们可以利用__clone来操作。
在__clone()中,我们可以进行一些操作。注意,这些操作,也就是__clone函数是作用于拷贝的副本对象上的
<?php
//普通对象赋值,深拷贝,完全值复制
$m = 1;
$n = $m;
$n = 2;
echo $m;//值复制,对新对象的改变不会对m作出改变,输出 1.深拷贝
echo PHP_EOL;
/*==================*/
//对象赋值,浅拷贝,引用赋值
class Test{
public $a=1;
}
$m = new Test();
$n = $m;//引用赋值
$m->a = 2;//修改m,n也随之改变
echo $n->a;//输出2,浅拷贝
echo PHP_EOL;
?>
由于对象的赋值时引用,要想实现值复制,php提供了clone函数来实现复制对象。
但是clone函数存在这么一个问题,克隆对象时,原对象的普通属性能值复制,但是源对象的对象属性赋值时还是引用赋值,浅拷贝。
<?php
class Test{
public $a=1;
}
class TestOne{
public $b=1;
public $obj;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this->obj = new Test();
}
}
$m = new TestOne();
$n = $m;//这是完全的浅拷贝,无论普通属性还是对象属性
$p = clone $m;
//普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$p->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//对象属性是浅拷贝,改变对象属性中的a,源对象m中的对象属性中a也改变
$p->obj->a = 3;
echo $m->obj->a;//输出3,随新对象改变
?>
要想实现对象真正的深拷贝,有下面两种方法:
写clone函数:如下
<?php
class Test{
public $a=1;
}
class TestOne{
public $b=1;
public $obj;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this->obj = new Test();
}
//方法一:重写clone函数
public function __clone(){
$this->obj = clone $this->obj;
}
}
$m = new TestOne();
$n = clone $m;
$n->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
//由于改写了clone函数,现在对象属性也实现了真正的深拷贝,对新对象的改变,不会影响源对象
$n->obj->a = 3;
echo $m->obj->a;//输出1,不随新对象改变,还是保持了原来的属性
?>
改写__clone()函数不太方便,而且你得在每个类中把这个类里面的对象属性都在__clone()中 一一 clone
第二种方法,利用序列化反序列化实现,这种方法实现对象的深拷贝简单,不需要修改类。
<?php
class Test{
public $a=1;
}
class TestOne{
public $b=1;
public $obj;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this->obj = new Test();
}
}
$m = new TestOne();
//方法二,序列化反序列化实现对象深拷贝
$n = serialize($m);
$n = unserialize($n);
$n->b = 2;
echo $m->b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$n->obj->a = 3;
echo $m->obj->a;//输出1,不随新对象改变,还是保持了原来的属性,可以看到,序列化和反序列化可以实现对象的深拷贝
?>
还有第三种方法,其实和第二种类似,json_encode之后再json_decode,实现赋值
写法一:
{foreach $xdw as $k=>$v}
{$k}
{/foreach}
写法二:
{foreach name="list" item="vo" key="k" }
{$k}|{$vo}
{/foreach}
tp5\application\common.php
public function abc(){
//echo 666;
//echo $_GET['aaa'];
$arr=$this->request->param();
var_dump($arr);
}
没有I方法了,我们用input实现。
input('get.id'); // I('get.id');
input('post.name'); // I('post.name');
提示:tp5中的input(“get.”)只能获得表单提交过来的数据,不能得到url get传值哦。
config(‘database.prefix’)insertGetId方法新增数据并返回主键值使用getLastInsID方法:
Db::name(‘user’)->insert($data);
$userId = Db::name(‘user’)->getLastInsID();
// 使用insertGetId方法
Db::name(‘user’)->insertGetId($data);
$a=config("database.prefix")."administrators";
$b=config("database.prefix")."administrators_groups";
//https://www.kancloud.cn/manual/thinkphp5/118083
$arr=$this->db->table($a)->alias('a')->join("$b b",'a.gid = b.id','left')->where($tj)->paginate(config('admin888.pagesizenum'),false, [
'query' => Request::instance()->param(),//不丢失已存在的url参数
]);
另外,我们也可以灵活使用扩展类的方式实现。
1、在根目录 extend 中创建 Mess.php类文件;
code:
<?php
class Mess{
function xdw(){
echo "xuduowei";
}
}
?>
2、在对应的引用的控制器中
use Mess;
$Mess=new Mess();
$Mess->xdw();
tp5中:
1、模型的载入;
方法一:直接在控制器中实例化:
$obj=new \app\admin\model\Index2; //提示第一个\是不能省略的。否则报错!
echo $obj->index();
方法二:use 导入,后实例化。
use \app\admin\model\Index2;
控制方法中:
$obj=new Index2;
echo $obj->index();
一、增加后台模块入口文件public/boss.php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
二、修改配置文件禁用后台模块访问application/config.php
// 禁止访问模块
'deny_module_list' => ['common','admin'],
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1
官方链接:http://www.phpcomposer.com/
简单来说,Composer 是一个新的安装包管理工具,服务于 PHP 生态系统。它实际上包含了两个部分:Composer 和 Packagist。下面我们就简单说一下他们各自的用途。
Composer 是由 Jordi Boggiano 和 Nils Aderman 创造的一个命令行工具,它的使命就是帮你为项目自动安装所依赖的开发包。Composer 中的很多理念都借鉴自 npm 和 Bundler,如果你对这两个工具有所了解的话,就会在 composer 中发现他们的身影。Composer 包含了一个依赖解析器,用来处理开发包之间复杂的依赖关系;另外,它还包含了下载器、安装器等有趣的东西。
作为一个用户,你所要做的就是在 composer.json
文件中声明当前项目所依赖的开发包,然后运行 composer.phar install
就行了。composer.json
文件定义了当前项目所依赖的开发包和 composer 的配置信息。下面是一个小型实例:
{
"require": {
"monolog/monolog": "1.2.*"
}
}
Packagist 是 Composer 的默认的开发包仓库。你可以将自己的安装包提交到 packagist,将来你在自己的 VCS (源码管理软件,比如 Github)仓库中新建了 tag 或更新了代码,packagist 都会自动构建一个新的开发包。这就是 packagist 目前的运作方式,将来 packagist 将允许直接上传开发包。