设置服务器的MySQL允许远程访问/外网访问

进入mysql:

mysql -uroot -p

输入密码。

选择mysql数据库:

use mysql;

增加允许远程访问的用户或者允许现有用户的远程访问。
给root授予在任意主机(%)访问任意数据库的所有权限。

update user set host='%' where user='root' and host='localhost';

退出mysql:

exit

重启数据库:

[root@localhost ~]# service mysqld restart

microtime()返回当前 Unix 时间戳和微秒数

1秒(second) = 1000毫秒(millisecond) = 1000,000微秒(microsecond)

PHP函数microtime()返回当前 Unix 时间戳和微秒数。

默认返回字符串 "microsec sec" ,其中 sec 为自 Unix 纪元(0:00:00 January 1, 1970 GMT)起的秒数,microsec 为微秒部分。

microtime(get_as_float);如果 get_as_float 参数设置为 TRUE,则返回浮点数,表示自 Unix 纪元起精确到微秒的以秒为单位的当前时间。
徐多蔚 xuduowei 徐老师 合肥php老师

sql中的正则

//REGEXP 是sql中的正则。

select * from infos where tuijian REGEXP ‘[1]’;

SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,[13],”;//检索1或者3的
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,(13),”;//检索13的。

//检索,1,3或者13的。
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,[13],” or CONCAT(“,”,tuijian,”,”) REGEXP “,(13),”
SELECT * FROM infos WHERE CONCAT(“,”,tuijian,”,”) REGEXP “,(13)|[13],”

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

 

mysql数据库备份-主从分离

mysql数据库备份-主从分离

原理:主从分离 【一般都是在同一机房中进行】

实现步骤:
1、确保主服务器打开二进制日志功能;
这样,主服务器一旦有数据变化,立即产生二进制日志;

2、从服务器也需要开启二进制日志和relay日志功能。
这样可以从主服务器读取binlog并产生relaylog

3、在主服务器建立一个从服务器账号,并授予读binlog的权限。

4、指定从服务对应的主服务器,开启从服务器。

主:
binlog-format=row/statement

statement:2进制记录执行语句,如update
row: 2进制记录的是磁盘变化;
mixed: 混合的,由系统根据语句,来决定。

update table set aa=xx where id=3 ;//语句长而磁盘变化少,建议row
update table set aa=xx;//语句短,但是影响上万行,磁盘变化大,易用
statement。

若想让系统自动帮我们识别,则建议用mixed,混合的,由系统根据语句来决定。

主服务器
mysql配置文件如下;

#给服务器起一个独特的id
server-id=201

#声明2进制日志的文件为mysql-bin.xxxx
log-bin=mysql-bin

#二进制日志的格式 mixed/row/statement
binlog-format=mixed

 

查看是否能充当主服务器:
show master status;

=========================================
从服务器mysql配置如下:
#给服务器起一个独特的id
server-id=202

#声明2进制日志的文件为mysql-bin.xxxx
log-bin=mysql-bin
#建议从服务器开启二进制日志,因为从服务器主要就是起到备份的功能。
#二进制可以看成最后的数据恢复方案。

#二进制日志的格式
relay-log=mysql-relay

 

查看是否能充当从服务器:
show slave status;

主服务器操作::

mysql>use mysql;

mysql>select host,user,password from user;

核心操作:
第一步:
mysql>use mysql;

第二步:
mysql>grant replication client,replication slave on *.* to
repl@’192.168.1.%’ identified by ‘repl’;

第三步:
mysql>flush privileges;

从服务器操作::

核心操作:

第一步:
mysql>use mysql;

第二步:
mysql>

change master to
master_host=’192.168.1.107′,
master_user=’repl’,
master_password=’repl’,
master_log_file=’mysql-bin.000001′,
master_log_pos=107;

第三步:
我们执行后看可打通呢?
mysql>show slave status;

第四步 启动从服务器功能:
mysql>start slave;

 

徐多蔚 xuduowei 徐老师 合肥php老师

mysql二进制日志的开启及使用

怎么开启?

MySQL\my.ini
中,在mysqld结构中加入:log_bin=mysqlxdw
提示:mysqlxdw是文件名,可自己任意定义。
[mysqld]
port=3306
basedir=”E:/phpStudy/MySQL/”
datadir=”E:/phpStudy/MySQL/data/”
character-set-server=utf8
default-storage-engine=MyISAM

log_bin=mysqlxdw

 

是否启用了日志

mysql>show variables like 'log_bin';

 

怎样知道当前的日志
mysql> show master status;

mysql> show binlog events;

SHOW BINLOG EVENTS IN ‘mysqlxdw.000002’;

项目调试,二进制查看

show binlog events;#显示二进制日志
PURGE MASTER LOGS TO 'mysqlxdw.000001'; #清除主日志
flush logs;#刷新日志
reset master;#复位主日志

show binlog events;
PURGE MASTER LOGS TO 'mysqlxdw.000001';
flush logs;
reset master;

 

 

徐多蔚  徐老师 xuduowei  合肥php老师

最简单的方法得到数组的最大值和最小值

<?php
//最简单的方法得到数组的最大值和最小值。
$a=array('1','3','55','99');
echo max($a);
echo min($a);
//对数据进行大小排序
$b=Array(1,3,7,65,9,4,6);
function cc($v1,$v2){
if($v1>$v2){
return 1;
}else{
return 0;
}
}
usort($b,'cc');
print_r($b);
?>

 

===================================================
xuduowei  徐多蔚  合肥php老师

获取文件名的3种方法

1、
$arr_f=explode(“/”,$_SERVER[‘SCRIPT_FILENAME’]);
echo $arr_f[count($arr_f)-1];

2、$arr= pathinfo($_SERVER[‘SCRIPT_FILENAME’]);
//print_r($arr[‘basename’]);

3、basename($_SERVER[‘SCRIPT_FILENAME’]);

以上3中,对应的操作文件均可以是:E:/phpStudy/www/tc/php1/admin888/user_edit.php 格式
提示:1可以有磁盘url,也可以无,但是2,3必须是完整的文件路径【带有磁盘url的】

整理:徐多蔚 合肥php老师

MySql模糊查询like通配符使用

MySql的like语句中的通配符:百分号、下划线和escape

 

%:表示任意个或多个字符。可匹配任意类型和长度的字符。

Sql代码

select * from user where username like '%huxiao';   
select * from user where username like 'huxiao%';   
select * from user where username like '%huxiao%';   

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

SELECT * FROMuserWHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’

若使用

SELECT * FROMuserWHERE u_name LIKE ‘%三%猫%’

虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)

Sql代码

select * from user where username like '_';   
select * from user where username like 'huxia_';   
select * from user where username like 'h_xiao';   

 

escape: 如果我就真的要查%或者_,怎么办呢?使用escape,转义字符后面的%或_就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用

Sql代码

select username from gg_user where username like '%xiao/_%' escape '/';    
select username from gg_user where username like '%xiao/%%' escape '/';

MySQL之CONCAT()的用法

mysql CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一,下面就将为您详细介绍mysql CONCAT()函数,供您参考

mysql CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)

mysql> SELECT CONCAT(’My’, ‘S’, ‘QL’);

-> ‘MySQL’

mysql> SELECT CONCAT(’My’, NULL, ‘QL’);

-> NULL

mysql> SELECT CONCAT(14.3);

-> ‘14.3′

 

mysql CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。   第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

mysql> SELECT CONCAT_WS(’,’,’First name’,’Second name’,’Last Name’);

-> ‘First name,Second name,Last Name’

mysql> SELECT CONCAT_WS(’,’,’First name’,NULL,’Last Name’);

-> ‘First name,Last Name’

mysql CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。