月度归档:2018年04月

ISO-8859-1编码

ISO-8859-1这个编码经常可以看到,但不是很了解,后来度娘了一下发现原来它还有一个名字叫Latin-1 or Latin1。Mysql数据库默认就是这个编码,它是单字节的编码,向下兼容ASCII码。也就是它包含了ASCII码所有的编码。因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。
度娘里有具体的参照表,这里就不浪费空间去贴出来了。

0

使用real_escape_string转义不合法字符

<?php
$mysqli = new mysqli("localhost", "root", "xxxx", "testdb");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE city");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", $mysqli->sqlstate);
}

$city = $mysqli->real_escape_string($city);

/* this query with escaped $city will work */
if ($mysqli->query("INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", $mysqli->affected_rows);
}

$mysqli->close();
?>
0

关于register_globals

register_globals这是一个php的配置项,在早前的版本如php5.2,默认是打开的,如果你的服务器上使用的版本是比较旧的,切记应该将值设置为off。当该配置项的值为on的时候,会允许php自动创建全局变量。如表单POST等,用户输入的值可能会突破你的鉴权等。幸运的是在新的版本上默认是关闭的,更新的版本上php.ini里面已经删除了这个配置项。

0

VIM常规操作

vim 环境的变更

命令描述
:set nu显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu与 set nu 相反,为取消行号!

删除、复制与贴上

命令描述
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del]), X 为向前删除一个字符(相当于 [backspace])
nxn 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd删除游标所在的那一整列(常用)
nddn 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列
yy复制游标所在的那一行(常用)
v,V类似于鼠标选择,y复制选中的字符,p粘贴,V行选择

常用命令

命令描述
多行注释使用v+向下键选中多行,: ,输入normal i//
G移动到这个档案的最后一行(常用)
nGn 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G 啊! n | n 为数字。光标向下移动 n 行(常用)
0或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处
$或功能键[End] 移动到这一行的最后面字符处(常用)
[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up] 按键 -p,
Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后,那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。
J将光标所在列与下一列的数据结合成同一列
c重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u复原前一个动作。(常用)
[Ctrl]+r重做上一个动作。(常用) * 这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! * . 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了!
1+

Thinkphp5模型时间戳和软删除

use traits\model\SoftDelete;

    //开启自动写入创建时间与更新时间
    protected $autoWriteTimestamp = true;
    //定义时间戳字段名 int default 0
    protected $createTime = 'created_at';
    protected $updateTime = 'update_at';
    use SoftDelete;
    protected $deleteTime = 'delete_time';//默认值为NULL的字段


User::destroy(1);//删除第一条数据
dump(User::get(1));//NULL
User::withTrashed(true)->get(1);//此时可以获取数据
User::onlyTrashed()->select();//获取垃圾箱中的所有数据
User::destroy(1,true);//真实删除
$userModel = User::get(1);
$userModel->delete(true);//同上
1+

Thinkphp5模型修改器

通过模型修改器自动修改对应字段,可以配合自动完成特性,自动修改数据库字段,特别适合更新时间戳

protected $auto=['time'];//新增及修改时更新
protected $insert=['created_at'];//新增时更新
protected $update=['updated_at'];//修改时更新
//model
public function setPasswordAttr($val){
    return md5($val);
}

public function setTimeAttr(){
    return time();
}

public function setTimeAttr(){
    return time();
}

public function setTimeAttr(){
    return time();
}
1+

Thinkphp5模型获取器

在Model中添加如下类型的代码,在获取到模型相关字段时,将会被改变:

public function getNameAttr($val){
    return $val."abc";
}

在controller中使用

$userModel = User::get(1);
$res = $userModel->name;
$data = $userModel->toArray();
$orgdata = $userModel->getData();//获取原始数据
1+

Thinkphp5模型

  • 实例化模型

    $data = User::get(1)->toArray();


    $model = model(“User”);


    $model = new User; $data = $model::get(1)->toArray();


    $model = \Think\Loader::model(“User”);

  • 闭包函数

    $data = User::get(function($query){ $query -> where(“id”,10); })->toArray();

  • 单条记录

    $data = User::where(“id”,10)->field(“username,password”)->find();

  • 多条记录

    //$models = User::all(“1,2,3”); $models = User::all(function($query){ $query->where(‘id’,’in’,[1,2,3])->field(“username,password”); });


    $models = User::where(‘id’,’>’,5)->field(“username,email”)->select();


    foreach($models as $model){ dump($model->toArray()); }

  • 单个字段

    $username = User::where(‘id’,10)->value(‘username’);

  • 列值

    $arr = User::column(“email”,”username”);//username = > email

  • 添加数据

    //post数据 $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ]);


    $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ],true);//过滤数据库中不存在的字段


    $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ],[‘username’,’email’]);//只更新配置的字段


    dump($res->id);//自增主键id dump($res);

    $userModel = new User; $userModel->username = ‘damon’; $userModel->password = ‘pwd’; $userModel->email=’yank0362@qq.com’; $res = $userModel->save();


    $userModel->allowField(true)->save([ “usename”=>”damon”, “password”=>”pwd”, “email”=>”email” ]);//过滤数据表中不存在字段


    $userModel->allowField([“username”])->save([ “usename”=>”damon”, “password”=>”pwd”, “email”=>”email” ]);//过滤数据表中不存在字段

    dump($userModel->id); //使用saveAll(二维数组),插入多条记录

  • 更新数据

    User::update([
    “id”=>1,
    “name”=>”damon”,
    “email”=>”yank0362@qq.com”
    ]);//根据传入的主键ID自动更新数据,无法知道影响行数,不常用,可以有第2参数,第2参数可以是闭包函数

    $res = User::where(“id”,”<“,5)->update([“username”=>”damon”,”email”=>”aa@q.com”]);
    //返回更新影响行数

    $userModel = User::get(1);
    $userModel->username=”damon”;
    $userModel->email=”aa@qq.com”;
    $res = $userModel->save();//返回影响行数

    $userModel = new User;
    $userModel->save([“email”=>”yank0362@qq.com”],[“id”=>5]);

  • 删除数据

    User::destroy(1);
    User::destroy([“id”=>2]);
    User::destroy(function($query){
    $query->where(“id”,”<“,5);
    });

    $userModel=User::get(5);
    $userModel->delete();

0