thinkphp5随机抽取数据的方法

/**
 * 随机获取数据
 * @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;
}

亲测有效。


关注公众号,了解更多it技术(it问答网

tp5查询后保持分页条件

在这里记录一下Tp5保持分页状态的两种方法:

一:

Db::name('data') -> where($where)  -> paginate(5,false,['query' => request()->param()]);

二:

$params = $this -> request -> param();
 $users = Db::name('data')->where($where)->paginate(15);
 
// 在 render 前,使用appends方法保持分页条件
$users->appends($params);
 
$this->assign('page', $users->render());//单独提取分页出来

 


关注公众号,了解更多it技术(it问答网

thinkphp5 中 db::query 原生查询如何实现分页?

	$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参数
            ]);

 


关注公众号,了解更多it技术(it问答网

tp5快速上手笔记-徐多蔚,合肥php老师

tp5:
项目开发中,tp5线上手册路径:
https://www.kancloud.cn/manual/thinkphp5/118003
文件夹命名是小写
控制器文件名:驼峰法【首字母大写规则】
命名更精简:如Index.php
单独口文件,默认是index模块,index控制器中的index方法。
tp5中默认只支持pathinfo url路径;入口文件在站点根目录的public/index.php
tp5/public/index.php/模块名/控制器名/方法名
tp5/public/index.php/index/index/index
如何渲染视图?
开启debug模式方便我们调试。 app项目文件夹下的config.php
‘app_debug’              => true,
1、继承核心控制器类;【导入核心类】
use think\Controller;
2、使用return函数;
3、使用$this->fetch(参数)渲染视图。
参数若省略:默认找的视图路径是模块下的view文件夹中的和控制器同名的文件夹中的文件【和方法同名的文件】
视图中默认的扩展名.html
打开配置项搜索: // 模板后缀
 ‘view_suffix’  => ‘html’,
若我们希望修改默认的渲染视图路径,我们可以把参数修改。
如:/a   含义就是view文件夹下的a.html
/a/a  含义就是view文件下的a文件夹中的a.html
tp5视图中,数组的循环推荐2种写法。
写法一:
{foreach $xdw as $k=>$v}
{$k}
{/foreach}
 
写法二:
{foreach name="list" item="vo" key="k" }
   {$k}|{$vo}
{/foreach}

 

公共视图文件的包含:
{include file=”head” /}
如何创建自己的方法,又如何访问?
tp5中用户自定义函数存放:
tp5\application\common.php
 
public function abc(){
//echo 666;
//echo $_GET['aaa'];
$arr=$this->request->param();
var_dump($arr);
}

 

访问的路径写法,默认只支持pathinfo模式
index.php/模块名/控制器名/方法名
若在访问的时候,需要进行传值。传值写法格式如下:
格式一:
index.php/模块名/控制器名/方法名/?aaa=1&bbb=2
格式二:
index.php/模块名/控制器名/方法名/aaa/1/bbb/2
我们可以使用tp5中内置的取值函数获取传递过来的参数。
$this->request->param();
tp5中$_GET[] 不太好用。提示:若是上方格式二传值,则get不到值。
提示:
tp5中,没有U方法了,我们用url实现。
没有I方法了,我们用input实现。
input('get.id'); // I('get.id');
input('post.name'); // I('post.name');

提示:tp5中的input(“get.”)只能获得表单提交过来的数据,不能得到url get传值哦。

tp5中用url代替了U方法。
{:url(‘模块名/控制器名/方法名’)}
tp5中数据库的操作【增、删、改、查】
1、配置数据库的参数;
项目文件夹[application]/database.php 文件中。
2、在控制器中先把Db类文件导入到页面命名空间中。如 :
use think\Db;
3、执行增、删、改、查
查询操作:
$data=Db::name(‘user’)->find();
print_r($data);
$data=Db::name(‘users’)->where(‘id=88’)->select();
$data=Db::name(‘users’)->query($sql);//提示$sql是自己定义的
提示:在自定义sql定义中,有可能涉及到表前缀,如何获得配置文件中的表前缀呢?    config(‘database.prefix’)
    删除:
$data=Db::name(‘users’)->where(‘id=88’)->delete();//删除,返回影响的实际记录数。
   tp5增加:
$data=Db::name(‘users’)->insert($data);//插入记录,insert ;//$data是实际影响的记录数。
   更新:
//更新用update
$data=Db::name(‘users’)->where(‘id’, 86)->update($data);//$data是实际影响的记录数。

tp5获取插入的数据的自增id

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参数
            ]);

 

tp5中 $this->success 跳转时间默认是3S【注:tp3中成功默认时间是1s】
tp3修改时间格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),10);
tp5修改格式:
$this->success(“登录ok”,url(“Admin/Index/succ”),”,10);
tp5中,session的使用。不能使用默认的$_SESSION来定义和取值了,我们需要使用框架中内置的session类来处理。
使用之前记得先导入。
use think\Session;
设置session Session::set(“username”,$name);
获得session值 Session::get(“username”);
tp5中的视图魔术常量 __ROOT__  代替了tp3.2.3中 __PUBLIC__
TP5使用验证码的方法:
方案一:tp5框架内置的验证码
1、{:captcha_src()} 这个是验证码的路径;在视图可直接引用即可。
2、控制器验证:
if(!captcha_check($yzm)){
$this->error(“验证码错误”,url(‘index/index’));
}
方案二:自定义类文件方法
如何自定义类文件。
核心文件夹:www\tp5.171219\thinkphp\library\think
提示:
1、类文件内容中的命名空间不能省略:
namespace think;
2、类名和对应的文件名必须保持一致。
文件名:Yzm.php
class Yzm{
}
控制器中如何使用用户自定义的类?
1、导入  use think\Yzm;
2、$obj=new Yzm();
   $obj->CreateImg();
3、验证码中值的传递,使用session传值。
Session::set(“code”,$cm);
Session::get(“code”);
提示:验证码类文件中可以直接使用Session::set(“code”,$cm);原因是我们在控制器那里已经导入了Session类。
另外,我们也可以灵活使用扩展类的方式实现。

1、在根目录 extend 中创建 Mess.php类文件;
code:

<?php
class Mess{

	function xdw(){
		echo "xuduowei";
	}
}
?>

2、在对应的引用的控制器中
use Mess;
$Mess=new Mess();
$Mess->xdw();

 

=============================================
一:模拟线上站点,创建虚拟域名;
a: 【baidu.com】
phpstudy->其他选项菜单->站点域名管理->
站点管理->设置好后->新增->保存设置并生成配置文件
b:确保服务重新启动;
c:修改host
C:\Windows\System32\drivers\etc\hosts
确保去掉只读属性;
使用编辑器打开。
按照如下格式写入配置信息:
127.0.0.1       baidu.com
提示:若线下开发的搬到线上运营,有可能会出现样式丢失问题【路径惹的祸】。
\tp5\application\config.php
更前曾经的模板替换字符串:如
 ‘view_replace_str’       => [ ‘__ROOT__’ => ‘http://www.xuduowei.com/’,],
防跳墙的构架:
class Index extends Common{
}
Common:
<?php
namespace app\admin\controller;
use think\Controller;
class Common extends Controller
{
    public function _initialize(){
echo 666;
}
}
=======================
tp5中获得当前模块,控制器,方法的写法和tp3是不一样的。
1、导入 use think\Request;
2、方法中实例化 $request= Request::instance();
3、使用实例化对象中的方法。
echo $request->module();//这个是模块的;
echo $request->controller();//控制器名的。
echo $request->action();//得到方法的。
tp5中的分页:
1、不需要我们传递总记录数;
$arr=$obj->where($tj)->paginate(2);
2、搜索分页
use think\Request;
$arr=$obj->where($tj)->paginate(2,false, [
                ‘query’ => Request::instance()->param(),//不丢失已存在的url参数
            ]);
用户删除传值[get方式]:
<a class=”button border-red” href=”javascript:void(0)” onclick=”return del(‘<?php echo url(‘admin/Users/del?id=’.$rs[‘id’]);?>’)”><span class=”icon-trash-o”></span> 删除</a>
url(‘admin/Users/del?id=’.$rs[‘id’]) 这个是ok的。
url(‘admin/Users/del/id/’.$rs[‘id’]) 这个是不对的。
其他扩展:调用其他模块或者控制器的方法:
    action(‘admin/Common/auto’);//注意这个不推荐在后台模块开发中使用,因为后台模块开发涉及到权限问题,这个action是控制器层面的,所以在控制器相互调用中有可能无权限操作。这个应用场景更多的再前端模块使用。

tp5中:
1、模型的载入;

方法一:直接在控制器中实例化:
$obj=new \app\admin\model\Index2; //提示第一个\是不能省略的。否则报错!
echo $obj->index();

方法二:use 导入,后实例化。

use \app\admin\model\Index2;
控制方法中:

$obj=new Index2;
echo $obj->index();

===============================
tp5高级:

TP5隐藏后台方法【目的是希望后台模块不在url中暴露模块名,这样更安全;第一步是定义单入口模式,绑定对应模块;第二步就是即使暴露出来了,也禁止访问。】

一、增加后台模块入口文件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'],

thinkphp修改数据表时怎么实现字段自加1-PHP框架开发

$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

 


关注公众号,了解更多it技术(it问答网