火狐设置成中文 https://weicoz.github.io/techonlogy/2018/06/25/%E7%81%AB%E7%8B%90%E8%AE%BE%E7%BD%AE%E6%88%90%E4%B8%AD%E6%96%87.html 2018-06-25

火狐设置成中文

  1. 打开Firefox浏览器,在地址栏输入 about:config 打开
  2. 点击底部的确认按钮进入
  3. 在左边第一列找到 general.useragent.locale 这一项,然后双击,把框内内容改为“zh-CN”
  4. 关闭浏览器再打开即可
安装锐速 https://weicoz.github.io/techonlogy/2018/06/25/%E5%AE%89%E8%A3%85%E9%94%90%E9%80%9F.html 2018-06-25

安装锐速

如何修改CentOS6、CentOS7内核支持安装锐速的内核

在锐速ServerSpeeder无限带宽破解版Linux一键自动安装包文章中介绍了如何使用一键包安装锐速,优化服务器网络速度。其实要想在自己的VPS安装锐速,首先内核必须要匹配锐速版本。如果内核不支持安装锐速,我们需要手动修改内核为支持安装锐速版本,不过OpenVZ虚拟技术架设的VPS是无法是无法更换内核,另外并不是所有的XEN和KVM虚拟技术架设的VPS都支持更换内核,像Linode VPS就不支持以下方法修改,需在VPS管理页面修改(Linode VPS如何在管理页面更换内核)。

一、CentOS 6内核更换教程:

CentOS 6支持安装锐速的内核:2.6.32-504.3.3.el6.x86_64

1、首先运行下面命令为自己的VPS下载安装内核。

uname -r #查看当前内核版本
rpm -ivh http://xz.wn789.com/CentOSkernel/kernel-firmware-2.6.32-504.3.3.el6.noarch.rpm
rpm -ivh http://xz.wn789.com/CentOSkernel/kernel-2.6.32-504.3.3.el6.x86_64.rpm --force
2、执行命令“rpm -qa grep kernel”,查看内核是否安装成功。如果显示你安装的内核版本,表示安装成功。
rpm -qa | grep kernel

3、重启VPS,查看内核是否修改成功。

reboot #重启VPS
uname -r #当前使用内核版本

二、CentOS 7内核更换教程

CentOS 7支持安装锐速的内核:3.10.0-327.el7.x86_64

1、首先使用下面命令下载及更换内核,

rpm -ivh http://xz.wn789.com/CentOSkernel/kernel-3.10.0-229.1.2.el7.x86_64.rpm --force
rpm -qa | grep kernel #查看内核是否安装成功

2、重启VPS,查看内核是否修改成功。

reboot #重启VPS
uname -r #当前使用内核版本

3、目前Centos 7小问题比较多,锐速针对centos 7的版版本较少。推荐在CentOS 6.中安装。


锐速破解版linux一键自动安装包是由@91yun发布的,无限带宽版。锐速只支持在XEN和KVM虚拟技术价格的VPS中安装,不支持在OpenVZ虚拟技术架构的VPS安装,推荐在KVM VPS中安装。目前此一键安装包已支持在CentOS,ubuntu和debian系统中安装,而且能自动匹配服务器内核是否支持安装,如果支持就会全自动下载安装,无需任何操作;如果内核不支持,会在安装过程中提示可选内核。

目前锐速ServerSpeeder无限带宽破解版支持的内核有:

CentOS-6.8:2.6.32-642.el7.x86_64
CentOS-7.2:3.10.0-327.el7.x86_64
CentOS:4.4.0-x86_64-linode63
Ubuntu_14.04:4.2.0-35-generic
Debian_8:3.16.0-4-amd64

一、锐速破解版说明

2017 年 5月 28日更新:

改了下锐速的安装文件,有问题的欢迎及时反馈。
已经装过的如果没有断流问题无需重装。

2017 年 3 月 17 日更新:

之前安装了很多依赖库,基本都精简了,已经不主动安装任何依赖库了。
所有提示改成了英文, putty 应该也能正常显示了
把安装包和支持库列表都放到 github ,并把二进制文件移到了洛杉矶服务器,国内下载应该也会比较快了
配置文件增加了流入加速的开启
配置文件增加了默认带宽到 G 口
手动选内核的安装已经恢复,可以查目前支持的完整内核列表

二、锐速破解版安装

1、执行上面的脚本下载命令,下载脚本到服务器。然后再执行脚本安装。

yum -y install wget
wget -N --no-check-certificate https://raw.githubusercontent.com/wn789/serverspeeder/master/serverspeeder.sh
bash serverspeeder.sh

2、安装过程很简单,如果你的VPS内核支持安装,根本无需你手动操作,直接一键完成。

3、如果你VPS内核没有找到匹配的锐速版本,会自动提示选择接近版本。

4、当然你还肯会遇到内核不支持的情况,那么需要我们先手动更改可以匹配锐速的内核。目前此破解版锐速支持的内核有:“CentOS-6.8:2.6.32-642.el7.x86_64、CentOS-7.2:3.10.0-327.el7.x86_64、CentOS:4.4.0-x86_64-linode63、Ubuntu_14.04:4.2.0-35-generic、Debian_8:3.16.0-4-amd64”。

5、锐速serverspeeder常用命令:

service serverSpeeder start #启动
service serverSpeeder stop #停止
service serverSpeeder reload #重新加载配置
service serverSpeeder restart #重启
service serverSpeeder status #状态
service serverSpeeder stats #统计
service serverSpeeder renewLic #更新许可文件
service serverSpeeder update #更新
chattr -i /serverspeeder/etc/apx* && /serverspeeder/bin/serverSpeeder.sh uninstall -f #卸载
hosts立即生效 https://weicoz.github.io/techonlogy/2018/06/25/hosts%E7%AB%8B%E5%8D%B3%E7%94%9F%E6%95%88.html 2018-06-25

hosts立即生效

Win + R / Cmd

ipconfig /flushdns

Windows 重置网络配置 https://weicoz.github.io/techonlogy/2018/06/25/Windows-%E9%87%8D%E7%BD%AE%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE.html 2018-06-25

Windows 重置网络配置

  1. Win + R / Cmd

  2. netsh winsock reset

  3. 重启电脑

WIN7 重装教程 https://weicoz.github.io/techonlogy/2018/06/25/WIN7-%E9%87%8D%E8%A3%85%E6%95%99%E7%A8%8B.html 2018-06-25

WIN7 重装教程

下载windows 7 7057 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7057)

开机按F8——修复系统——选择最后一项命令修复——在命令框输入“D:\7057\sources\setup.exe“


用U盘装win7遇到一个问题就是

“安装程序无法创建新的系统分区,也无法定位现有的系统分区”

首先下一个win7旗舰版ISO放入非系统盘符下,然后用U盘进PE直接setup安装就行了啊!如果在安装过程中选着盘符的时候提示“安装程序无法创建新的系统分区,也无法定位现有的系统分区

遇到这样的你只需要做以下几步:

  1. 进入win pe系统,格式化C 盘为NTFS 。C盘最好有15 G以上的空间。

  2. (最关键一步):从你解压的安装程序ISO的文件夹中找到boot , bootmgr 和sources这三个文件,并且复制到C盘根目录下。

    或者这样复制boot , bootmgr,在C盘新建文件夹命名为sources,复制ISO文件中sources下的boot.win拷到C盘新建的sources种就好。主要因为sources这个文件夹有2点几个G有点大。

  3. 在win pe系统中运行cmd ,输入“ c:\boot\bootsect.exe /nt60 c: ”(注意exe和/nt60、/nt60和c:之间有空格),然后回车。你会看到提示successful 字样,这就表示成功了!

  4. 重启电脑,重装

  5. 最后重装完成后运行 cmd 键入 msconfig 选择 “引导” 然后选择要删除的选项,点 “删除”,”应用”即可。

Sublime Text 3 配置 https://weicoz.github.io/techonlogy/2018/06/25/Sublime-Text-3-%E9%85%8D%E7%BD%AE.html 2018-06-25

Sublime Text 3 配置

三、配置

点击preferences-setting user,个人设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    //字体大小
    "font_size": 13.0,
    //字体类型
    "font_face": "mononoki","Consolas",
    // 设置每一行到顶部,以像素为单位的间距,效果相当于行距
    "line_padding_top": 2,
    // 设置每一行到底部,以像素为单位的间距,效果相当于行距
    "line_padding_bottom": 2,
    // html和xml下突出显示光标所在标签的两端,影响HTML、XML、CSS等
    "match_tags": true,    
    // 是否显示代码折叠按钮
    "fold_buttons": true,
    // 代码提示
    "auto_complete": true,
    // 默认编码格式
    "default_encoding": "UTF-8",
    // 左边边栏文件夹动画
    "tree_animation_enabled": true,
    //删除你想要忽略的插件
    "ignored_packages":
    [
        "Vintage",
        "YUI Compressor"
    ]
}

四、快捷键

  1. F11和Shift+F11进入全屏免打扰模式

  2. Ctrl+L:选择整行,按住继续选择下一行

  3. Ctrl+KK:从光标处删除至整行的尾部

  4. Ctrl+Shift+D:复制光标所在的整行,插入在该行之前

  5. Ctrl+J:合并行(已选择需要合并的多行时),可以理解为不换行模式,直到遇到编辑器边框后自动换行

  6. Ctrl+D:选词,(按住-继续选择下个相同的字符串)

  7. Ctrl+/:注释整行,可来回切换,Submlie Text可自动判断文件类型。选择整段,也可注释整段。

  8. Ctrl+Shift+/:注释。选择整段,也可注释整段,单行时候,不注释该行,而是添加该行的注释信息,如<!– –>

  9. Alt+. :闭合当前标签

  10. Ctrl+Shift+[:折叠代码

  11. Ctrl+Shift+]:展开代码

  12. Shift+table:向左缩进、Tab向右缩进

Steam下载其他地区游戏 https://weicoz.github.io/techonlogy/2018/06/25/Steam%E4%B8%8B%E8%BD%BD%E5%85%B6%E4%BB%96%E5%9C%B0%E5%8C%BA%E6%B8%B8%E6%88%8F.html 2018-06-25

Steam下载其他地区游戏

浏览器打开路径

1
2
//console执行
steam://run/555210

修改后方编号即可调用steam下载

Shadowsock Proxifier 设置 https://weicoz.github.io/techonlogy/2018/06/25/Shadowsock-Proxifier-%E8%AE%BE%E7%BD%AE.html 2018-06-25

Shadowsock Proxifier 设置

img

Listen1 歌单备份 https://weicoz.github.io/techonlogy/2018/06/25/Listen1-%E6%AD%8C%E5%8D%95%E5%A4%87%E4%BB%BD.html 2018-06-25

Listen1 歌单备份

2017/5/19 - listen1_backup.json

DNS汇总 https://weicoz.github.io/techonlogy/2018/06/25/DNS%E6%B1%87%E6%80%BB.html 2018-06-25

DNS汇总

地区 DNS
棒子(韩国)DNS 168.126.63.1 / 168.126.63.2
港服DNS 202.238.95.24 / 202.238.95.26
谷歌DNS 8.8.8.8 / 8.8.4.4
中华电信DNS 168.95.1.1 / 168.95.192.1
阿里DNS 223.5.5.5 / 223.6.6.6
HelloDNS 123.56.46.123 / 182.254.185.148
Chrome 强制使用https协议 https://weicoz.github.io/techonlogy/2018/06/25/Chrome-%E5%BC%BA%E5%88%B6%E4%BD%BF%E7%94%A8https%E5%8D%8F%E8%AE%AE.html 2018-06-25

Chrome 强制使用https协议

chrome://net-internals/#hsts

  • add添加google.com强制使用https协议
AutoHotKey简单入门 https://weicoz.github.io/techonlogy/2018/06/25/AutoHotKey-%E7%AE%80%E5%8D%95%E5%85%A5%E9%97%A8.html 2018-06-25

AutoHotKey简单入门

AutoHotKey 真是一个好玩的工具!短短几行代码就是先了“窗口置顶”、“窗口透明”等功能,之前我还特意为此装了好几个小工具,现在都可以卸掉了。闲来无事,就把 Quick Start 翻译了一下,我没有逐字逐句地翻译,有时候我嫌原文罗嗦就用自己的话概括地描述了一下。

原文地址:http://www.autohotkey.com/docs/Tutorial.htm

创建脚本

每个脚本都是一个纯文本文件,由一些能被 AutoHotKey.exe 执行的命令组成。一个脚本可能还包含热键 和热字符串 。如果没有热键和热字符串,脚本在启动的时候就会从头依次执行到尾。

创建一个新的脚本:

  1. 下载 并安装 AutoHotkey。
  2. 右击鼠标,选择 新建 -> 文本文档 。
  3. 输入文件名并确保以 .ahk 结尾。例如:Test.ahk。
  4. 右击文件,选择 编辑脚本 。
  5. 输入以下内容:

    #space::Run www.google.com

上一行的第一个字符 “#” 代表键盘上的 Windows 键;所以 #space 表示在按住 Windows 键后再按空格键。”::” 后面的命令会在热键激活后执行,在本例中则会打开谷歌主页。继续按下面步骤操作,来执行这个脚本:

  1. 保存并关闭该文件。

  2. 双击该文件来启动它。在系统托盘里会出现一个新图标。 按下 Windows 和空格键,网页会在默认的浏览器里打开。 右击系统托盘里的绿色图标可以退出或编辑当前脚本。

注意:

  • 可以同时启动多个脚本,并且在系统托盘里都会有一个相应的图标。
  • 每个脚本都能定义多个 热键 和 热字符串 。
  • 想让某个脚本开机即启动,可以将它的快捷方式放到开始菜单的启动目录里 。

启动程序

命令 Run 可以运行程序、打开文档、网页链接或快捷键。请参看以下示例:

Run Notepad  
Run C:/My Documents/Address List.doc  
Run C:/My Documents/My Shortcut.lnk  
Run www.yahoo.com  
Run mailto:someone@somedomain.com  

可以给这些命令设置任何热键 。下面第一个例子的快捷键是 ==Win+N== ,第二个是 ==Control+Alt+C==:

#n::Run Notepad  
^!c::Run calc.exe  

上例是单行热键,因为每个热键之包含一条命令。如果命令多余一条,则热键定义必须单独放一行,其后每条命令放一行,且最后一行必须是 return 。例如:

#n::  
Run http://www.google.com  
Run Notepad.exe  
return  

如果待执行的程序或文档没有集成到系统中,则需要指定完整路径:

Run %A_ProgramFiles%/Winamp/Winamp.exe  

上例中 %A_ProgramFiles% 是内建变量 。比起直接使用诸如 C:/Program Files 这样的绝对路径,推荐使用内建变量,它使得脚本的可移植性更好,即能在其他机器上正常运行。注意:命令和变量都是大小写无关的。例如 “Run” 与 “run”、”A_ProgramFiles”与”a_programfiles”都是一样的。

用 RunWait 代替Run,脚本就会一直等在,直到刚才运行程序退出。在下例中 MsgBox 命令直到记事本被关闭后才执行:

RunWait Notepad  
MsgBox The user has finished (Notepad has been closed).  

用 Send 命令可以向当前活动窗口发送键盘击键消息。下例中定义了热键 ==Control+Alt+S== 来输入签名:

^!s::  
Send Sincerely,{Enter}John Smith  
return  

上例中{Enter}是模拟回车键,其他字符都是字面意思。下一个例子展示了其他几个特殊字符:

Send ^c!{tab}pasted:^v  

代码会依次发送 Control+C、Alt+Tab、字符串 “pasted:”和 Control+V。完整的特殊字符列表请参阅 Send 命令。

最后,按键序列还可以用于定义字符串的缩写,即热字符串 。例如,下例将 btw 定义为 by the way 的缩写,无论何时你输入 btw 后再输入空格或逗号,都会被替换成 “by the way”:

::btw::by the way  

鼠标点击 : 在发送鼠标点击事件前要先确定鼠标的位置(X, Y 坐标值)。AutoHotKey 自带的 Window Spy 可以很方便地确定鼠标的位置:

  • 启动 Window Spy 。
  • 激活你感兴趣的窗口 (Window Spy 默认置于窗口顶端)。
  • 鼠标指针移到目标位置,Window Spy 就能显示出鼠标的坐标位置(在 Windows XP 或之前的版本中,按下 Shift-Alt-Tab 来激活 Window Spy,以便复制和粘贴 “冻结” 的坐标位置)。
  • 将上面的坐标位置应用于 Click 命令。下例中鼠标在 112, 223 出单击一下左键:
  • Click 112, 223

  • 移动鼠标(未按键)用 MouseMove ;拖动鼠标(有按键) MouseClickDrag 。

操纵窗口

用 WinActivate 来激活一个窗口;用 IfWinExist 或 WinWait 判断某个窗口是否存在。以下示例演示这些命令的用法:

IfWinExist Untitled - Notepad  
{  
    WinActivate  
}  
else  
{  
    Run Notepad  
    WinWait Untitled - Notepad  
    WinActivate  
}  

例子中首先搜索标题以 “Untitled - Notepad”(忽略大小写)开头的窗口。如果找到了就激活它;否则就启动记事本程序 ,等到窗口以出现就激活它。上例中还使用了上一次找到的的窗口 避免在每个 WinActivate 后面再次指定标题。

一些常用的窗口管理命令:

  • IfWinActive :检查指定的窗口是否处于激活状态。
  • WinWaitActive :等待指定的窗口处于激活状态(通常在发送窗口激活指令——比如按下 Control-F 来弹出查找窗口——后使用)。
  • WinClose :关闭指定的窗口。
  • WinMove :移动或/且调整窗口大写。
  • WinMinimize ,WinMaximize ,WinRestore :分别是最小化、最大化和恢复指定的窗口。

输入

下例显示一个对话框,它有两个按钮(YES 和 NO):

MsgBox, 4, , Would you like to continue?  
IfMsgBox, No  
    return  
; Otherwise, the user picked yes.  
MsgBox You pressed YES.  

使用 InputBox 提示用户输入一个字符串;FileSelectFile 或 FileSelectFolder 供用户选择文件和文件夹;更高级的任务使用 Gui 命令来自定义界面。

提示:从其他例子中你可能已经注意到第一个逗号往往被忽略(除非第一个参数为空或执行 := 、 = 或当前命令是后续语句 唯一的顶部命令)。例如:

MsgBox This is ok.  
MsgBox, This is ok too (it has an explicit comma).  

变量与剪切板

变量 是脚本用于存储文本或数值的内存区域。在数学运算和比较运算里,只包含数字(可以附带可选的小数点)的变量会自动解析成数值。

除了函数 里的局部变量,所有其他变量都是全局变量。即,它们的值可在脚本的任意地方读取和修改。此外,变量在使用前无需声明,直接使用即可(初始值为空)。

下例演示如何给变量赋字符串:

MyVar1 = 123  
MyVar2 = my string  

下例演示将变量的值与字符串或数值进行比较:

if MyVar2 = my string  
{  
    MsgBox MyVar2 contains the string "my string".  
}  
if MyVar1 >= 100  
{  
    MsgBox MyVar1 contains %MyVar1%, which is a number greater than or equal to 100.  
}  

你可能注意到第二个 MsgBox 语句中 MyVar1 被两个百分号包围着。此处会显示 MyVar1 变量的值。在给变量赋值时也可以使用相同的技巧。例如:

MyVarConcatenated = %MyVar1% %MyVar2%  

上例中变量 MyVarConcatenated 的值是 “123 my string”(不含引号)。

考虑下面这个例子,它演示两个变量相互比较:

if (ItemCount > ItemLimit)  
{  
    MsgBox The value in ItemCount, which is %ItemCount%, is greater than %ItemLimit%.  
}  

注意到上例的第一行包含一对小括号。小括号表示这个 if 语句包含一个表达式 ;缺少它们则看作 “非表达式 if 语句”,于是需要用百分号将 ItemLimit 括起(这样的 if 语句限定只能使用一个比较运算符,即它们不能包含数学运算符或连词 “AND” 和 “OR” 等)。

数学 :如下例所示,使用冒号等号(:=)运算符可以将表达式 的计算结果赋值给一个变量:

NetPrice := Price * (1 - Discount/100)

完整的数学运算符请参阅表达式 一节。

剪切板 :Clipboard 是一个特殊变量,它代表 Windows 的系统剪切板。虽然如此,你还是可以像普通变量一样使用它。下例会显示当前剪切板里的内容:

MsgBox %clipboard%  

考虑下面的例子,它用一段新的文本替代剪切板里当前的内容:

clipboard = A line of text.`r`nA second line of text.`r`n  

上面的 r 和 n (第一个字符是倒引号,键盘 1 左边的那个键)分别代表回车符和换行符。这两个字符会将文本换到新的一行,效果等价于键入键盘上的 Enter 键。

下例演示将文本追加到剪切板(或其他任何变量):

clipboard = %clipboard% And here is the text to append.  

更多内容请参阅剪切板 和变量 两节。

循环

loop 可以连续地执行一段代码。下例中弹出 MsgBox 窗口三次:

Loop 3  
{  
    MsgBox This window will be displayed three times.  
}  

你也可以在 Loop 后面指定一个变量,在迭代次数不确定时这个方法很奏效:

Loop %RunCount%  
{  
    Run C:/Check Server Status.exe  
    Sleep 60000  ; Wait 60 seconds.  
}  

上例中,除非 RunCount 小于或等于 0,否则循环体至少能执行一次。

根据不同的条件,可以中途跳出循环。执行下例程序后,当用户按住 F1 键,程序就会不断地发送点击鼠标左键事件:

    $F1::  ; Make the F1 key into a hotkey (the $ symbol facilitates the "P" mode of GetKeyState below).  
    Loop  ; Since no number is specified with it, this is an infinite loop unless "break" or "return" is encountered inside.  
    {  
        if not GetKeyState("F1", "P")  ; If this statement is true, the user has physically released the F1 key.  
            break  ; Break out of the loop.  
        ; Otherwise (since the above didn't "break"), keep clicking the mouse.  
        Click  ; Click the left mouse button at the cursor's current position.  
    }  
    return  
    

上例中,当用户放开 F1 键,程序就能知道并通过 break 命令终止循环。Break 使得程序跳到循环体外。

一个替代方案是使用 “while” 循环 :

$F1::  
while GetKeyState("F1", "P")  ; While the F1 key is being held down physically.  
{  
    Click  
}  
return  

上例演示了通用的循环结构。下面的循环结构适用于一些特殊场合:

  • File-reading/writing loop :逐行获取文件内容。它可用于将基于行结构的文件转换成其他格式。还可以用于搜索特定内容。

  • Files and folders loop :逐个遍历文件和文件夹。它允许你逐个处理文件或文件夹。

  • Parsing loop :从字符串中逐个获取子串。比如将 “Red,Green,Blue” 分成三个字段。

  • Registry loop :逐个遍历注册表中的键。 操纵文件

下例中使用 FileAppend 将文本追加到文件末尾(或创建一个新文件)。注意:它使用 `n (换行符)来换行:

FileAppend, A line of text to append.`n, C:/My Documents/My Text File.txt  

使用 FileDelete 删除一个已存在的文件。例如:

FileDelete, C:/My Documents/My Text File.txt  

其他一些常用的、和文件和文件夹相关的命令:

  • FileRead :将整个文件的内容读取到变量中。
  • File-reading Loop :逐行读取文件。
  • IfExist :判断一个文件或文件夹是否存在。
  • FileSelectFile 和 FileSelectFolder :弹出一个对话框让用户选择文件或文件夹。
  • FileDelete /FileRecycle :删除/回收文件。使用 - FileRemoveDir 来删除整个文件夹。
  • FileCopy /FileMove :复制/移动文件。使用 FileCopyDir /FileMoveDir 来拷贝/移动整个文件夹。
  • Files-and-folders Loop :逐个遍历文件和文件夹。
  • FileSetAttrib 和 FileSetTime :修改文件的属性和时间戳。
  • IniRead 、IniWrite 和IniDelete :创建、访问和维护 INI 文件。
  • RegRead 、RegWrite 、RegDelete 和Registry Loop :访问 Windows 注册表。
Aria2下载器 https://weicoz.github.io/techonlogy/2018/06/25/Aria2%E4%B8%8B%E8%BD%BD%E5%99%A8.html 2018-06-25

Aria2下载器

Aria2 / Baidu Aria2插件

虽然它轻巧,但是它的设置是很繁琐的,如果想尝试一下的朋友,可以往下耐心地看。首先它的原本设计中是没有操作面板的,全部都是命令式,后来有网友开发出了网页版的控制地址 地址1:http://aria2c.com 地址2:http://ziahamza.github.io/webui-aria2/

修改配置

建议将aria2解压到非系统盘中 打开aria2.conf修改 (配置示例) PS:建议使用Notepad等专业的编辑软件,否则程序运行时容易出错。

1
2
3
4
5
6
7
8
9
10
# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置
dir=Aria2Data 
# 改成你自己存放文件的地方(你也可以不改)例如:dir=D:\Downloads\
# 从会话文件中读取下载任务
input-file=aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=aria2.session
# 改成你放Aria2的地方,例如
input-file=D:\Downloads\aria2\aria2.session
save-session=D:\Downloads\aria2\aria2.session

安装插件(IE Firefox Chrome内核) YAAW 搭配脚本 迅雷离线

  • Chrome Extension: ThunderLixianAssistant
  • UserScript: ThunderLixianExporter 百度网盘
  • Chrome Extension: BaiduExporter
  • ALL Addons: BaiduExporter (全面支持 Chrome, Firefox, Edge 和 Safari)
  • Firefox Addons:BaiduExporter
  • UserScript: BaiduPanDownloadHelper 其他脚本
  • Chrome Extension: 添加到aria2
php魔术变量及实例 https://weicoz.github.io/php/2018/06/25/php%E9%AD%94%E6%9C%AF%E5%8F%98%E9%87%8F%E5%8F%8A%E5%AE%9E%E4%BE%8B.html 2018-06-25

php魔术变量及实例

  1. __FILE__

    文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 这个变量,我用的是最多的,估计也是大家用的最多的。

web服务器都会指定一个documentroot的,但是不同的服务器,设置的documentroot有可能是不同的,在这种情况下,把一个网站从一个服务器搬家到另一个服务器,这样就有可能因为路径的不同,造成网站跑不起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
    <?php  
    /** 
    在你的公用的配置文件中,来设置你的根目录,这样就不用担心经常搬家了。 
    */  
    define('ROOT_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);  
    echo ROOT_PATH;  
    echo "<br>";  
    echo __FILE__;  
    echo "<br>";  
    echo dirname(__FILE__);  
    echo "<br>";  
    echo dirname(dirname(__FILE__));  
    ?>  
  1. __LINE__

文件中的当前行号。这个变量在调试错误的时候,还是比较有作用的,其他的时候,没什么用处,纯属个人观点。

1
2
3
    <?php  
    echo __LINE__;  //显示,__LINE__所在的行号  
    ?>  
  1. __CLASS__

类的名称,PHP5返回的结果是区分大小写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php  
class base_class {  
    function say_a() {  
        echo "'a' - said the " . __CLASS__ . "<br/>";  
    }  
    
    function say_b() {  
        echo "'b' - said the " . get_class($this) . "<br/>";  
    }  
}  

class derived_class extends base_class {  
    function say_a() {  
        parent::say_a();  
        echo "'a' - said the " . __CLASS__ . "<br/>";  
    }  
    function say_b() {  
        parent::say_b();  
        echo "'b' - said the " . get_class($this) . "<br/>";  
    }
}

$obj_b = new derived_class();  
$obj_b->say_a();  
echo "<br/>";  
$obj_b->say_b();  

/*
结果为:  
'a' - said the base_class  
'a' - said the derived_class  

'b' - said the  derived_class  
'b' - said the derived_class  
*/
?>  

有的时候,我们可以用get_class来代替__CLASS__

  1. __FUNCTION__和__METHOD__

FUNCTION:函数名称,php5中返回的结果是区分大小写的 METHOD:方法中的函数名称,php5中返回的结果是区分大小写的 二个都是取得方法的名称,有什么不同呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php  
class test {
    function a() {  
        echo __FUNCTION__;  
        echo "<br>";  
        echo __METHOD__;  
    }  
}  

function good (){  
    echo __FUNCTION__;  
    echo "<br>";  
    echo __METHOD__;  
} 

$test = new test();  
$test->a();  
echo "<br>";  
good();  
/*
返回结果:  
a  
test::a  
good  
good  
*/
?>  

相对于孤立的函数来说,二个都可以取出函数名,没什么区别,如果是class中的方法时,__FUNCTION__只能取出class的方法名,而__METHOD__不光能取出方法名,还能取出class名

  1. __DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) 如果在5.3以前的版本中想用__DIR__的话,可以这样

1
2
3
4
5
6
<?php  
    if(!defined('__DIR__')) {  
        $iPos = strrpos(__FILE__, "/");  
        define("__DIR__", substr(__FILE__, 0, $iPos) . "/");  
    }  
?>  
  1. __NAMESPACE__

当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

  1. __STATIC__

当你调用class的静态方法时,返回class名称,区分大小写。如果在继承中调用的话,不管在继承中有没有定义,都能返回继承的class名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php  
//php5.3  
class Model {  
    public static function find() {  
        echo __STATIC__;  
    }  
}  

class Product extends Model {}  
class User extends Model {}  

Product::find(); // "Product"  
User::find(); // "User"  
?>  
php隐藏NOTICE提示 https://weicoz.github.io/php/2018/06/25/php%E9%9A%90%E8%97%8FNOTICE%E6%8F%90%E7%A4%BA.html 2018-06-25

php隐藏NOTICE提示

1
2
3
<?php
error_reporting(E_ALL || ~E_NOTICE);
error_reporting(E_ERROR | E_WARNING | E_PARSE);
php随机生成字符串 https://weicoz.github.io/php/2018/06/25/php%E9%9A%8F%E6%9C%BA%E7%94%9F%E6%88%90%E5%AD%97%E7%AC%A6%E4%B8%B2.html 2018-06-25

php随机生成字符串

1
2
3
4
5
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$password = "";
for ( $i = 0; $i < 8; $i++ ){
    $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
php连接数据库 https://weicoz.github.io/php/2018/06/25/php%E8%BF%9E%E6%8E%A5%E6%95%B0%E6%8D%AE%E5%BA%93.html 2018-06-25

php连接数据库

总结常用的PHP连接MySQL数据库以及读取写入数据库的方法

为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量.

1.设置数据连接

1
2
3
4
5
<?php
$mysql_server_name='localhost'; //改成自己的mysql数据库服务器
$mysql_username='root'; //改成自己的mysql数据库用户名
$mysql_password='123456'; //改成自己的mysql数据库密码
$mysql_database='Mydb'; //改成自己的mysql数据库名

也可把以上变量放在一个文件里,可以随时让其他文件调用.

例如: 将以上内容放在:db_config.php

那么在其他需要用到数据库的页面直接调用.

调用代码:

1
2
<?php
require("db_config.php");

2.连接数据库

1
2
3
<?php
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password) or die("error connecting") ; //连接数据库
mysql_query("set names 'utf8'"); //数据库输出编码

应该与你的数据库编码保持一致.建议用UTF-8 国际标准编码.

1
2
3
4
<?php
mysql_select_db($mysql_database); //打开数据库
$sql ="select * from news "; //SQL语句
$result = mysql_query($sql,$conn); //查询

3.读取表中的内容,这里我们用while,可以根据具体情况,用for 或其他的.

1
2
3
4
5
6
<?php
while($row = mysql_fetch_array($result)){
    echo "<div style=\"height:24px; line-height:24px; font-weight:bold;\">"; //排版代码
    echo $row['Topic'] . "<br/>";
    echo "</div>"; //排版代码
}

4.php写入数据库,Mysql数据的写入

1
2
3
4
5
6
7
8
9
<?php
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password); //连接数据库
mysql_query("set names 'utf8'"); //数据库输出编码
mysql_select_db($mysql_database); //打开数据库

//插入数据
$sql = "insert into messageboard (Topic,Content,Enabled,Date) values ('$Topic','$Content','1','2011-01-12')";
mysql_query($sql);
mysql_close(); //关闭MySQL连接
php获取服务器端IP地址 https://weicoz.github.io/php/2018/06/25/php%E8%8E%B7%E5%8F%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AFIP%E5%9C%B0%E5%9D%80.html 2018-06-25

php获取服务器端IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if('/'==DIRECTORY_SEPARATOR){
	$server_ip=$_SERVER['SERVER_ADDR'];
}else{
	$server_ip=@gethostbyname($_SERVER['SERVER_NAME']);
}
echo $server_ip;


/**
 * 获取服务器端IP地址
 * @return string
 */
function get_server_ip(){
    if(isset($_SERVER)){
    	if($_SERVER['SERVER_ADDR']){
    	    $server_ip=$_SERVER['SERVER_ADDR'];
    	}else{
    		$server_ip=$_SERVER['LOCAL_ADDR'];
    	}
    }else{
    	$server_ip = getenv('SERVER_ADDR');
    }
    return $server_ip;
}

echo get_server_ip();
php类的继承,重载方法 https://weicoz.github.io/php/2018/06/25/php%E7%B1%BB%E7%9A%84%E7%BB%A7%E6%89%BF-%E9%87%8D%E8%BD%BD%E6%96%B9%E6%B3%95.html 2018-06-25

php类的继承,重载方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
//类
class ParentClass{
    function show_message(){
        echo "\n","\n";
        echo "Hi!This comes from Parent class.";
    }
}

//类的继承
class ChildClass extends ParentClass{
    //重载ParentClass的show_message()函数
    function show_message()
    {
        echo "\n","\n";
        echo "Hi!This comes from the child class.";
    }
    //调用ParentClass的show_message()函数
    function show()
    {
        parent::show_message();
    }
}
$obj2 = new ChildClass; //ChildClass的对象
$obj2 -> show();    //这将显示父类的show_message()中定义的消息
?>
php公共方法 https://weicoz.github.io/php/2018/06/25/php%E5%85%AC%E5%85%B1%E6%96%B9%E6%B3%95.html 2018-06-25

php公共方法

common_ext.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
<?php
/**
 * 将数组数据格式化输出,
 * 韦立柠 20:28 2016/7/7
 * @param type $data    数组
 * @param type $is_die  1为执行中止服务 0不中止
 */
function print_x($data, $is_die = 1) {
    echo "<pre>";
    print_r($data);
    echo "</pre>";
    if ($is_die) {
        die();
    }
}

/**
 * isset to empty 如果数组不存在就返回空值
 * 韦立柠 20:28 2016/7/7
 * @param array $array          数组结构
 * @param string $array_key     数组里的KEY
 * @param type $default         如果数组里不存在,就返回这个值,值可以是任意类型
 * @return type                 返回数组原值或默认值,值可以是任意类型
 */
function i2e($array, $array_key, $default = '', $is_f2s=false) {
    $result = '';
    if (isset($array[$array_key])) {
        $result = $array[$array_key];
    } else {
        $result = $default;
    }
    if($is_f2s){
        $result = f2s($result);
    }
    return $result;
}

/**
 * isset to post 如果这个POST值不存在或为空就返回默认值
 * 韦立柠                20:28 2016/7/7
 * @param string $key   POST的KEY,比如:如果是$_POST['xab'],那么就是值就是字符串xab
 * @param type $default 如果POST值不存在,就返回这个默认的值。可以设置任何类型的值。
 * @param bool $default 如果为真就用f2s函数安全过滤。默认为假,不安全过滤
 * @return type         返回POST值或者默认设置的值
 */
function i2post($key, $default = '', $is_f2s=FALSE) {
    $result = '';
    if ((isset($_POST[$key])) && ($_POST[$key] !== '')) {
        $result = $_POST[$key];
    } else {
        $result = $default;
    }
    if($is_f2s){
        $result = f2s($result);
    }
    return $result;
}

/**
 * isset to get 如果这个GET值不存在或为空就返回默认值
 * 韦立柠 20:28 2016/7/7
 * @param string $key   GET的KEY值 如果是$_GET['xab'],那么就是值就是字符串xab
 * @param type $default 如果GET值不存在,就返回这个默认的值。可以设置任何类型的值。
 * @return type         返回GET值或者默认设置的值
 */
function i2get($key, $default = '', $is_f2s=FALSE) {
    $result = '';
    if ((isset($_GET[$key])) && ($_GET[$key] !== '')) {
        $result =  $_GET[$key];
    } else {
        $result =  $default;
    }
    if($is_f2s){
        $result = f2s($result);
    }
    return $result;
}

/**
 * isset to int 检测变量是否为数字或者等于0,是数字并非0就返回真,否为假。
 * 韦立柠 20:28 2016/7/7
 * @param type $val 任何值
 * @return boolean  返回是或否
 */
function i2int($val) {
    if ((!is_numeric($val)) || ($val == 0)) {
        return false;
    } else {
        return true;
    }
}

/**
 * isset to numeric 检测变量是否为数字,是否大于或小于0
 * 韦立柠 15:26 2016/7/17
 * @param type $val         任何值
 * @param boolean $is_zero  如果要检测值可能存在0就设置为ture,否则要大于0才能返回真,默认为FALSE
 * @return boolean
 */
function i2num($val, $is_zero=FALSE){
    if(!is_numeric($val)){
        return false;
    }
    if($is_zero){
        if($val<0){
            return false;
        }

    }else{
        if($val<=0){
            return false;
        }
    }
    return true;
}



/**
 * 过滤SQL字符串中的参数 $str参数 $link SQL连接
 * 韦立柠 20:28 2016/7/7
 * @param type $str     要格式化的字符串值
 * @param type $link    面向对象的mysql的link连接,可以忽略。
 * @return type         返回安全格式化的字符串
 */
function f2s($str, $link = null) {
    if ($link) {
        return mysql_real_escape_string($str, $link);
    } else {
        return mysql_real_escape_string($str);
    }
}

/**
 * 正则检测字符串是否是英文、数字、下划线
 * @param string $val   字符串
 * @return bool         真假
 */
function preg_en($val) {
    $result = false;
    if ($val) {
        //$val    = trim($val); //严格些,后面空格也不能帮他忽略
        $result = preg_match('/^[_a-zA-Z0-9]+$/', $val);
    }
    return $result;
}

/**
 * 正则检测手机号是否正确
 * @param string $val   字符串
 * @return boolean
 */
function preg_phone($val){
    if ($val) {
        return preg_match('/^1[3|4|5|7|8][0-9]\d{8}$|^(09)\d{8}$/', $val);
    }else{
        return false;
    }
}


/**
 * 查询语句,输出数组列。
 * 韦立柠 20:28 2016/7/7
 * @param type $query   SQL语句
 * @param int $is_tran  是否在事务列队中,0|否,1|是
 * @return array        返回数组列表
 */
function mysql_select($query, $is_tran = 0) {
    $result = array();  $err_tmp='';
    $obj_result = _mysql_query($query) or $err_tmp = mysql_error();
    if ($err_tmp) {
        if ($is_tran == 1) {
            _tran_rollback();
        }
        $debugInfo = debug_backtrace();
        $line = $debugInfo[0]['line'];
        die('Query:'.$query." <br/>Query failed L $line :" . $err_tmp);
    }
    while ($row = mysql_fetch_array($obj_result, MYSQL_ASSOC)) {
        $result[] = $row;
    }
    return $result;
}

/**
 * 查询语句,输出单列数组。
 * 韦立柠 20:28 2016/7/7
 * @param string $query SQL语句。注意:不必在SQL语句后面多加 LIMIT 来限制单行输出
 * @param int $is_tran  是否在事务列队中,0|否,1|是
 * @return array        返回数组结构
 */
function mysql_find($query, $is_tran = 0) {
    if (strpos(strtolower($query),"limit") == false){
        $query .= ' LIMIT 0, 1 ';
    }
    $err_tmp='';
    $result = array();
    $obj_result = _mysql_query($query) or $err_tmp = mysql_error();
    if ($err_tmp) {
        if ($is_tran == 1) {
            _tran_rollback();
        }
        die('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
    }
    $row = mysql_fetch_array($obj_result, MYSQL_ASSOC);
    if ($row !== false) {
        $result = $row;
    }
    return $result;
}

/**
 * 查询总数
 * 韦立柠 20:28 2016/7/7
 * @param string $query     SQL语句
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return int              返回,大于0或等于0
 */
function mysql_count($query, $is_tran = 0) {
    $result = 0; $err_tmp='';
    $obj_result = _mysql_query($query) or $err_tmp = mysql_error();
    if ($err_tmp) {
        if ($is_tran == 1) {
            _tran_rollback();
        }
        die('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
    }
    $row = mysql_fetch_array($obj_result, MYSQL_ASSOC);
    if ($row !== false) {
        foreach ($row as $v) {
            $result = $v;
        }
    }
    return $result;
}

/**
 * 统计查询
 * 韦立柠 17:20 2016/8/8
 * @param type $query       SQL语句
 * @param type $is_tran     是否在事务列队中,0|否,1|是
 * @return type             任何类型
 */
function mysql_stc($query, $is_tran = 0) {
    $result = 0; $err_tmp='';
    $obj_result = _mysql_query($query) or $err_tmp = mysql_error();
    if ($err_tmp) {
        if ($is_tran == 1) {
            _tran_rollback();
        }
        die('Query failed1: ' . $err_tmp);
    }
    $row = mysql_fetch_array($obj_result, MYSQL_ASSOC);
    if ($row !== false) {
        foreach ($row as $v) {
            $result = $v;
        }
    }
    return $result;
}

/**
 * 数组方式保存更新数据 ;
 * 16:02 2016/7/19
 * @param string $tabel         要更新的表名
 * @param array $set_array      数组列表。
 * @param string $where         为了防止更新上的误操作,只有放了where输入了【*】号才能更新全部数据
 * @param int $is_sql           是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran          是否在事务列队中,0|否,1|是
 * @return string               返回操作SQL语句或者影响行数
 * 将die修改成throw exception . 出错后日志系统能自动捕获并记录  zhaojing
 */
function mysql_array_save($tabel, $set_array, $where='', $is_sql=0, $is_tran=0,$db_name = ''){
    $err_tmp='';
    $array_val = array();$set_str = '';
    if($set_array){
        foreach ($set_array as $key => $val) {
            $array_val[] = "`".$key."`='".$val."'";
        }
        $set_str = implode(',', $array_val);
    }else{
        if ($is_tran == 1) {
            _tran_rollback();
        }
        throw new Exception('it\'s nothing at all with set ');
    }
    if(empty($db_name)){
        $query = "UPDATE `". $tabel . "` SET ".$set_str." ";
    }else{
        $query = "UPDATE `".$db_name."`.`" . $tabel . "` SET ".$set_str." ";
    }
    if ($where === '*') {
        //为了防止更新上的误操作,只有放了where输入了【*】号才能更新全部数据
    } else {
        if ($where) {
            $query .= "WHERE " . $where;
        } else {
            $query .= "WHERE 1=2";
        }
    }    //print_x($query);
    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return mysql_affected_rows();
    } else {
        return $query;
    }

}

/**
 * 更新,返回受影响的行数
 * 韦立柠 20:28 2016/7/7
 * @param string $tabel     要更新的表名
 * @param string $set       要更新的字段,如:balance=10, uptime='2016'
 * @param string $where     为了防止更新上的误操作,只有放了where输入了【*】号才能更新全部数据
 * @param int $is_sql       是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return string           返回操作SQL语句或者影响行数
 */
function mysql_update($tabel, $set, $where = '', $is_sql = 0, $is_tran = 0,$db_name = '') {
    $err_tmp='';
    if(empty($db_name)){
        $query = "UPDATE `" . $tabel . "` SET " . $set . " ";
    }else{
        $query = "UPDATE `".$db_name."`.`" . $tabel . "` SET " . $set . " ";
    }
    if ($where === '*') {
        //为了防止更新上的误操作,只有放了where输入了【*】号才能更新全部数据
    } else {
        if ($where) {
            $query .= "WHERE " . $where;
        } else {
            $query .= "WHERE 1=2";
        }
    }
    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return mysql_affected_rows();
    } else {
        return $query;
    }
}

/**
 * 更新,全SQL语言方式
 * 韦立柠 20:28 2016/7/7
 * @param string $query     SQL语句
 * @param int $is_sql       是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return string           返回操作SQL语句或者影响行数
 */
function mysql_update_sql($query, $is_sql = 0, $is_tran = 0) {
    $err_tmp='';
    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
			_file_put_contents('log/'.date('Y-m-d').'_update_log.txt',"------事务出错query:".$query."---------------------\r\n",FILE_APPEND);
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return mysql_affected_rows();
    } else {
        return $query;
    }
}

/**
 * 批量添加数据
 * 韦立柠 20:28 2016/7/7
 * @param type $tabel       数据表名
 * @param type $array_into  数组列表。
 * @param int $is_sql       是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return string           返回操作SQL语句或者影响行数
 */
function mysql_into_all($tabel, $array_into, $is_sql = 0, $is_tran = 0,$db_name = '') {
    $err_tmp='';
    $array_key = array();
    $str_key = '';
    $array_val = array();
    $str_val = '';
    if (count($array_into) > 0) {
        foreach ($array_into[0] as $key => $val) {
            $array_key[] = '`' . $key . '`';
        }
        $str_key = implode(',', $array_key);
        foreach ($array_into as $val) {
            $array_v = array();
            foreach ($val as $v) {
                $array_v[] = "'" . $v . "'";
            }
            $str_val = implode(",", $array_v);
            $str_val = '(' . $str_val . ')';
            $array_val[] = $str_val;
        }
        $str_val = implode(',', $array_val);
    }
    if(empty($db_name)){
        $query = 'INSERT INTO `' . $tabel . '` (' . $str_key . ') VALUES ' . $str_val; //print_x($query);
    }else{
            $query = 'INSERT INTO `' . $db_name . '`.`' . $tabel . '` (' . $str_key . ') VALUES ' . $str_val; //print_x($query);
    }

    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return mysql_affected_rows();
    } else {
        return $query;
    }
}

/**
 * 单条数据添加
 * 韦立柠 20:28 2016/7/7
 * @param type $tabel       数据表名
 * @param type $array_into  数组结构
 * @param type $is_sql      是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return string           返回操作SQL语句或者影响行数
 */
function mysql_into($tabel, $array_into, $is_sql = 0, $is_tran = 0,$db_name = '') {
    $err_tmp='';
    $array_key = array();
    $str_key = '';
    $array_val = array();
    $str_val = '';
    if ($array_into) {
        foreach ($array_into as $key => $val) {
            $array_key[] = '`' . $key . '`';
        }
        $str_key = implode(',', $array_key);

        foreach ($array_into as $v) {
            $array_val[] = "'" . $v . "'";
        }
        $str_val = implode(',', $array_val);
    }
    if(empty($db_name)){
        $query = 'INSERT INTO `' . $tabel . '` (' . $str_key . ') VALUES (' . $str_val . ')';
    }else{
        $query = 'INSERT INTO `'.$db_name.'`.`' . $tabel . '` (' . $str_key . ') VALUES (' . $str_val . ')';
    }

    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
            //die('Query failed1: ' . $err_tmp.'|'.$query);
        }
        return mysql_insert_id();
    } else {
        return $query;
    }
}

/**
 * 添加,并返回新增ID,全SQL语言方式
 * 韦立柠 20:28 2016/7/7
 * @param string $query     SQL语句
 * @param int $is_sql       是否输出SQL语句。 1,输出SQL语句而不操作数据表 | 0,输出操作数据表后影响的行数
 * @param int $is_tran      是否在事务列队中,0|否,1|是
 * @return type             返回操作SQL语句或者新增的ID
 */
function mysql_into_sql($query, $is_sql = 0, $is_tran = 0) {
    $err_tmp='';
    if ($is_sql == 0) {
        _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
            if ($is_tran == 1) {
                _tran_rollback();
            }
            throw new Exception('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return mysql_insert_id();
    } else {
        return $query;
    }
}

/**
 * 时间字符串转日期字符串
 * 韦立柠 14:29 2016/7/27
 * @param string $val   时间字符串
 * @return string
 */
function time2data($val){
    $result = '';
    if($val!='0000-00-00 00:00:00'){
        $tmp = explode(' ',$val);
        $result = $tmp[0];
    }
    return $result;
}



/**
 * list in select 检测是否等于$val值是否相等,如果等于就返回$selected值,默认为selected
 * 15:01 2016/8/3 韦立柠
 * @param type $val_0       对比字符0
 * @param type $val_1       对比字符1
 * @param type $selected    检测后输出的字符,默认为selected
 * @return string           检测后输出的字符
 */
function l_s($val_0, $val_1, $selected = 'selected') {
    if ($val_0 == $val_1) {
        return $selected;
    } else {
        return '';
    }
}


/**
 * arr in select 检测$arr是否包含$val值,如果是就返回$selected值,默认为selected
 * 15:01 2016/8/3 韦立柠
 * @param type $val         数组值
 * @param type $arr         数组
 * @param type $selected    检测后输出的字符,默认为selected
 * @return string           检测后输出的字符
 */
function arr_s($val, $arr, $selected = 'selected') {
    if (in_array($val, $arr)) {
        return $selected;
    } else {
        return '';
    }
}



/**
 * 事务开始
 * 韦立柠 20:38 2016/7/11
 */
function _tran_start(){
    _mysql_query('set autocommit=0') or die('Query failed4: ' . mysql_error());
    _mysql_query('SET session TRANSACTION ISOLATION LEVEL SERIALIZABLE') or die('Query failed4: ' . mysql_error());
    _mysql_query('start transaction;');
}

/**
 * 事务提交
 * 韦立柠 20:38 2016/7/11
 */
function _tran_commit(){
    _mysql_query("COMMIT");
    _mysql_query('set autocommit=1') or die('Query failed4: ' . mysql_error());
}

/**
 * 事务回滚
 * 韦立柠 20:38 2016/7/11
 */
function _tran_rollback(){
    _mysql_query("ROLLBACK");
    _mysql_query('set autocommit=1') or die('Query failed4: ' . mysql_error());
}


//获取地址,返回类型$type  0:详细地址  1:城市名
function getAddress($lat,$lng,$type=0){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,'http://apis.map.qq.com/ws/geocoder/v1/?location='.$lat.','.$lng.'&key=KVLBZ-LJUKF-LGQJZ-J2IGO-FGNF5-XCBJH&coord_type=5');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_HTTPPROXYTUNNEL,1);
    $data = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($data,1);
    // return $data['result']['address_component']['street_number'];
    if($type==0){
        return $data['result']['address'];
    }else{
        return $data['result']['ad_info']['city'];
    }

}

//根据客户端IP获取地址
function GetAddress_IP(){
    $ip = "";
    if ($_SERVER["HTTP_X_FORWARDED_FOR"]){
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }elseif ($_SERVER["HTTP_CLIENT_IP"]){
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    }elseif ($_SERVER["REMOTE_ADDR"]){
        $ip = $_SERVER["REMOTE_ADDR"];
    }elseif (getenv("HTTP_X_FORWARDED_FOR")){
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    }elseif (getenv("HTTP_CLIENT_IP")){
        $ip = getenv("HTTP_CLIENT_IP");
    }elseif (getenv("REMOTE_ADDR")){
        $ip = getenv("REMOTE_ADDR");
    }

    if(strpos($ip,",")>0){
        $ip = explode(',', $ip);
        $ip = $ip[0];
    }

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,'http://apis.map.qq.com/ws/location/v1/ip?ip='.$ip.'&key=KVLBZ-LJUKF-LGQJZ-J2IGO-FGNF5-XCBJH');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_HTTPPROXYTUNNEL,1);
    $data = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($data,1);
    //var_dump($data);
    $res = array();
    $res['city'] = $data['result']['ad_info']['city'];
    $res['lng']  = $data['result']['location']['lng'];
    $res['lat']  = $data['result']['location']['lat'];

    return $res;
}

function mysql_select_sql($query, $is_sql = 0, $is_tran = 0) {
    $err_tmp='';
    if ($is_sql == 0) {
        $result = _mysql_query($query) or $err_tmp = mysql_error();
        if ($err_tmp) {
			_file_put_contents('log/'.date('Y-m-d').'_select_log.txt',"------事务出错query:".$query."---------------------\r\n",FILE_APPEND);
            if ($is_tran == 1) {
                _tran_rollback();
            }
            die('Query : '.$query.' <br/>Query failed1: ' . $err_tmp);
        }
        return $result;
    } else {
        return $query;
    }
}
php事务回滚 https://weicoz.github.io/php/2018/06/25/php%E4%BA%8B%E5%8A%A1%E5%9B%9E%E6%BB%9A.html 2018-06-25

php事务回滚

1
2
3
4
5
6
7
8
9
<?  //示例
try {
    //开启事务 start transaction
    
    //提交事务 commit
} catch (\Exception $e) { //错误消息 $e->getMessage()
    //回滚事务 rollback

}

TP5写法

1
2
3
4
5
6
7
8
9
10
11
<?php
try {
    Db ::startTrans();
    //SQL语句
    Db::commit();
    return json_encode($result);
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
    return json_encode($result);
}

原生PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
try {
    mysql_query('start transaction');
    //SQL语句
    mysql_query('commit');
    return json_encode($result);
} catch (\Exception $e) {
    // 回滚事务
    $log_ops ->log_insert("验货操作异常 ".var_export($e->getMessage(),true));
    mysql_query('rollback');
    $result["errcode"] = -1;
    $result["errmsg"] = "数据错误";
    return json_encode($result);
}

PHP抛异常

1
throw new Exception(Value must be 1 or below); 
phpstorm 设置 https://weicoz.github.io/php/2018/06/25/phpstorm-%E8%AE%BE%E7%BD%AE.html 2018-06-25

phpstorm 设置

Phpstrom Setting 配置文件

PhpStorm_2017.3_zh_utf-8 汉化补丁

*把压缩包里的"resources_zh_CN.jar"拷贝到PhpStorm安装目录下的lib目录,重启即可!*

汉化注意:

如果打开后显示乱码,请先删除resources_cn.jar,然后打开phpstorm,在菜单上依次选择 File -> Settings -> Appearance&Behavior -> Appearance -> 选中Override default fonts by(not recommended) Name: Microsoft YaHei (选择任意中文字体) 然后将resources_cn.jar 复制到 .\lib 目录,重新打开phpstorm 2017就能正常显示中文了

Phpstorm 代码字体 mononoki

vmoptions 增加内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
phpstorm64.exe.vmoptions 		//增加内存
# custom PhpStorm VM options
-Xms512m
-Xmx2048m
-XX:ReservedCodeCacheSize=240m
-XX:MaxPermSize=1024m
-XX:+UseCompressedOops
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-javaagent:C:\Program Files (x86)\JetBrains\PhpStorm 2016.2\lib\JetbrainsCrack-2.5.6.jar
-Dawt.usesystemAAFontSettings=lcd
-Dawt.java2d.opengl=true
php5 反射 https://weicoz.github.io/php/2018/06/25/php5-%E5%8F%8D%E5%B0%84.html 2018-06-25

php5 反射

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。

- 反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。 反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

//建立 Person这个类的反射类  
$class = new ReflectionClass('Person');
//相当于实例化Person 类 $args为数组扩充多个参数加载
$instance  = $class->newInstanceArgs($args);
php mb_substr 截取字符串 https://weicoz.github.io/php/2018/06/25/php-mb_substr-%E6%88%AA%E5%8F%96%E5%AD%97%E7%AC%A6%E4%B8%B2.html 2018-06-25

php mb_substr 截取字符串

1
2
3
4
<?php 
$str='脚本之家:http://www.jb51.net'; 
echo mb_substr($str,0,4,'utf-8');//截取头5个字,假定此代码所在php文件的编码为utf-8 
?> 
__construct()和__initialize()的差别 https://weicoz.github.io/php/2018/06/25/__construct()%E5%92%8C__initialize()%E7%9A%84%E5%B7%AE%E5%88%AB.html 2018-06-25

__construct()和__initialize()的差别

ThinkPHP中的 __initialize() 和类的构造函数 __construct()

  1. __initialize()不是php类中的函数,php类的构造函数只有 __construct().
  2. 类的初始化:子类如果有自己的构造函数( __construct() ),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化。
  3. 当子类和父类都有 __construct() 函数的时候,如果要在初始化子类的时候同时调用父类的__constrcut(),则可以在子类中使用 parent::__construct() . 如果我们写两个类,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
    class Action{
        public function __construct()
        {
            echo 'hello Action';
        }
    }
    class IndexAction extends Action{
        public function __construct()
        {
            echo 'hello IndexAction';
        }
    }
    $test = new IndexAction;
    //output --- hello IndexAction

很明显初始化子类IndexAction的时候会调用自己的构造器,所以输出是’hello IndexAction’。 但是将子类修改为

1
2
3
4
5
6
7
<?
    class IndexAction extends Action{
        public function __initialize()
        {
            echo 'hello IndexAction';
        }
    }

那么输出的是’hello Action’。因为子类IndexAction没有自己的构造器。 如果我想在初始化子类的时候,同时调用父类的构造器呢?

1
2
3
4
5
6
7
8
<?
    class IndexAction extends Action{
        public function __construct()
        {
            parent::__construct();
            echo 'hello IndexAction';
        }
    }

这样就可以将两句话同时输出。 当然还有一种办法就是在父类中调用子类的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
    class Action{
        public function __construct()
        {
            if(method_exists($this,'hello'))
            {
                $this -> hello();
            }
            echo 'hello Action';
        }
    }
    class IndexAction extends Action{
        public function hello()
        {
            echo 'hello IndexAction';
        }
    }

这样也可以将两句话同时输出。

而,这里子类中的方法hello()就类似于ThinkPHP中 __initialize()

所以,ThinkPHP中的__initialize()的出现只是方便程序员在写子类的时候避免频繁的使用parent::__construct(),同时正确的调用框架内父类的构造器,所以,我们在ThnikPHP中初始化子类的时候要用 __initialize() ,而不用 __construct() ,当然你也可以通过修改框架将 __initialize() 函数修改为你喜欢的函数名。

Redis 操作 https://weicoz.github.io/php/2018/06/25/Redis-%E6%93%8D%E4%BD%9C.html 2018-06-25

Redis 操作

redis的操作很多的,以前看到一个比较全的博客,但是现在找不到了。查个东西搜半天,下面整理一下php处理redis的例子,个人觉得常用一些例子。下面的例子都是基于php-redis这个扩展的。

  • connect

    描述: 实例连接到一个Redis.

参数: host: string,port: int

返回值: BOOL 成功返回:==TRUE==;失败返回:==FALSE==

1
2
3
4
5
<?php  
$redis = new redis();  
$result = $redis->connect('127.0.0.1', 6379);  
var_dump($result); //结果:bool(true)  
?>  
  • set

    描述: 设置key和value的值

参数: Key Value

返回值: BOOL 成功返回:==TRUE==;失败返回:FALSE

1
2
3
4
5
6
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$result = $redis->set('test',"11111111111");  
var_dump($result);    //结果:bool(true)  
?>  
  • get

    描述: 获取有关指定键的值

参数: key

返回值: string或BOOL 如果键不存在,则返回 ==FALSE==。否则,返回指定键对应的value值。

1
2
3
4
5
6
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$result = $redis->get('test');  
var_dump($result);   //结果:string(11) "11111111111"  
?> 
  • delete

    描述: 删除指定的键

参数: 一个键,或不确定数目的参数,每一个关键的数组:key1 key2 key3 … keyN

返回值: 删除的项数

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test',"1111111111111");  
echo $redis->get('test');   //结果:1111111111111  
$redis->delete('test');  
var_dump($redis->get('test'));  //结果:bool(false)  
?>  
  • setnx

    描述: 如果在数据库中不存在该键,设置关键值参数

参数: key value

返回值: BOOL 成功返回:TRUE;失败返回:FALSE

1
2
3
4
5
6
7
8
9
10
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test',"1111111111111");  
$redis->setnx('test',"22222222");  
echo $redis->get('test');  //结果:1111111111111  
$redis->delete('test');  
$redis->setnx('test',"22222222");  
echo $redis->get('test');  //结果:22222222  
?>  
  • exists

    描述: 验证指定的键是否存在 参数key

返回值: Bool 成功返回:TRUE;失败返回:FALSE

1
2
3
4
5
6
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test',"1111111111111");  
var_dump($redis->exists('test'));  //结果:bool(true)  
?>  
  • incr

    描述: 数字递增存储键值键

参数: key value:将被添加到键的值

返回值: INT the new value

1
2
3
4
5
6
7
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test',"123");  
var_dump($redis->incr("test"));  //结果:int(124)  
var_dump($redis->incr("test"));  //结果:int(125)  
?>
  • decr

    描述: 数字递减存储键值。

参数: key value:将被添加到键的值

返回值: INT the new value

1
2
3
4
5
6
7
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test',"123");  
var_dump($redis->decr("test"));  //结果:int(122)  
var_dump($redis->decr("test"));  //结果:int(121)  
?>
  • getMultiple

    描述: 取得所有指定键的值。如果一个或多个键不存在,该数组中该键的值为假 参数: 其中包含键值的列表数组 返回值: 返回包含所有键的值的数组

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->set('test1',"1");  
$redis->set('test2',"2");  
$result = $redis->getMultiple(array('test1','test2'));  
print_r($result);   //结果:Array ( [0] => 1 [1] => 2 )  
?>
  • lpush

    描述:由列表头部添加字符串值。如果不存在该键则创建该列表。如果该键存在,而且不是一个列表,返回FALSE。 参数: key,value 返回值:成功返回数组长度,失败false

1
2
3
4
5
6
7
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
var_dump($redis->lpush("test","111"));   //结果:int(1)  
var_dump($redis->lpush("test","222"));   //结果:int(2)  
?>
  • rpush

    描述: 由列表尾部添加字符串值。如果不存在该键则创建该列表。如果该键存在,而且不是一个列表,返回FALSE。 参数: key,value 返回值: 成功返回数组长度,失败false

1
2
3
4
5
6
7
8
9
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
var_dump($redis->lpush("test","111"));   //结果:int(1)  
var_dump($redis->lpush("test","222"));   //结果:int(2)  
var_dump($redis->rpush("test","333"));   //结果:int(3)  
var_dump($redis->rpush("test","444"));   //结果:int(4)  
?>
  • lpop

    描述: 返回和移除列表的第一个元素

参数: key

返回值: 成功返回第一个元素的值 ,失败返回false

1
2
3
4
5
6
7
8
9
10
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush("test","111");  
$redis->lpush("test","222");  
$redis->rpush("test","333");  
$redis->rpush("test","444");  
var_dump($redis->lpop("test"));  //结果:string(3) "222"  
?>
  • lsize,llen

    描述: 返回的列表的长度。如果列表不存在或为空,该命令返回0。如果该键不是列表,该命令返回FALSE。

参数: Key

返回值: 成功返回数组长度,失败false

1
2
3
4
5
6
7
8
9
10
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush("test","111");  
$redis->lpush("test","222");  
$redis->rpush("test","333");  
$redis->rpush("test","444");  
var_dump($redis->lsize("test"));  //结果:int(4)  
?>

14,lget 描述:返回指定键存储在列表中指定的元素。 0第一个元素,1第二个… -1最后一个元素,-2的倒数第二…错误的索引或键不指向列表则返回FALSE。 参数:key index 返回值:成功返回指定元素的值,失败false 范例:

1
2
3
4
5
6
7
8
9
10
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush("test","111");  
$redis->lpush("test","222");  
$redis->rpush("test","333");  
$redis->rpush("test","444");  
var_dump($redis->lget("test",3));  //结果:string(3) "444"  
?>

15,lset 描述:为列表指定的索引赋新的值,若不存在该索引返回false. 参数:key index value 返回值:成功返回true,失败false 范例:

1
2
3
4
5
6
7
8
9
10
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush("test","111");  
$redis->lpush("test","222");  
var_dump($redis->lget("test",1));  //结果:string(3) "111"  
var_dump($redis->lset("test",1,"333"));  //结果:bool(true)  
var_dump($redis->lget("test",1));  //结果:string(3) "333"  
?>

16,lgetrange 描述: 返回在该区域中的指定键列表中开始到结束存储的指定元素,lGetRange(key, start, end)。0第一个元素,1第二个元素… -1最后一个元素,-2的倒数第二… 参数:key start end 返回值:成功返回查找的值,失败false 范例:

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush("test","111");  
$redis->lpush("test","222");  
print_r($redis->lgetrange("test",0,-1));  //结果:Array ( [0] => 222 [1] => 111 )  
?>

17,lremove 描述:从列表中从头部开始移除count个匹配的值。如果count为零,所有匹配的元素都被删除。如果count是负数,内容从尾部开始删除。 参数:key count value 返回值:成功返回删除的个数,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->lpush('test','a');  
$redis->lpush('test','b');  
$redis->lpush('test','c');  
$redis->rpush('test','a');  
print_r($redis->lgetrange('test', 0, -1)); //结果:Array ( [0] => c [1] => b [2] => a [3] => a )  
var_dump($redis->lremove('test','a',2));   //结果:int(2)  
print_r($redis->lgetrange('test', 0, -1)); //结果:Array ( [0] => c [1] => b )  
?>

18,sadd 描述:为一个Key添加一个值。如果这个值已经在这个Key中,则返回FALSE。 参数:key value 返回值:成功返回true,失败false 范例:

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
var_dump($redis->sadd('test','111'));   //结果:bool(true)  
var_dump($redis->sadd('test','333'));   //结果:bool(true)  
print_r($redis->sort('test')); //结果:Array ( [0] => 111 [1] => 333 )  
?>

19,sremove 描述:删除Key中指定的value值 参数:key member 返回值:true or false 范例:

1
2
3
4
5
6
7
8
9
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd('test','111');  
$redis->sadd('test','333');  
$redis->sremove('test','111');  
print_r($redis->sort('test'));    //结果:Array ( [0] => 333 )  
?>

20,smove 描述:将Key1中的value移动到Key2中 参数:srcKey dstKey member 返回值:true or false 范例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->delete('test1');  
$redis->sadd('test','111');  
$redis->sadd('test','333');  
$redis->sadd('test1','222');  
$redis->sadd('test1','444');  
$redis->smove('test',"test1",'111');  
print_r($redis->sort('test1'));    //结果:Array ( [0] => 111 [1] => 222 [2] => 444 )  
?>

21,scontains 描述:检查集合中是否存在指定的值。 参数:key value 返回值:true or false 范例:

1
2
3
4
5
6
7
8
9
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd('test','111');  
$redis->sadd('test','112');  
$redis->sadd('test','113');  
var_dump($redis->scontains('test', '111')); //结果:bool(true)  
?>

22,ssize 描述:返回集合中存储值的数量 参数:key 返回值:成功返回数组个数,失败0 范例:

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd('test','111');  
$redis->sadd('test','112');  
echo $redis->ssize('test');   //结果:2  
?>

23,spop 描述:随机移除并返回key中的一个值 参数:key 返回值:成功返回删除的值,失败false 范例:

1
2
3
4
5
6
7
8
9
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
var_dump($redis->spop("test"));  //结果:string(3) "333"  
?>

24,sinter 描述:返回一个所有指定键的交集。如果只指定一个键,那么这个命令生成这个集合的成员。如果不存在某个键,则返回FALSE。 参数:key1, key2, keyN 返回值:成功返回数组交集,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
var_dump($redis->sinter("test","test1"));  //结果:array(1) { [0]=> string(3) "111" }  
?>

25,sinterstore 描述:执行sInter命令并把结果储存到新建的变量中。 参数: Key: dstkey, the key to store the diff into. Keys: key1, key2… keyN. key1..keyN are intersected as in sInter. 返回值:成功返回,交集的个数,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
var_dump($redis->sinterstore('new',"test","test1"));  //结果:int(1)  
var_dump($redis->smembers('new'));  //结果:array(1) { [0]=> string(3) "111" }  
?>

26,sunion 描述: 返回一个所有指定键的并集 参数: Keys: key1, key2, … , keyN 返回值:成功返回合并后的集,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
print_r($redis->sunion("test","test1"));  //结果:Array ( [0] => 111 [1] => 222 [2] => 333 [3] => 444 )  
?>

27,sunionstore 描述:执行sunion命令并把结果储存到新建的变量中。 参数: Key: dstkey, the key to store the diff into. Keys: key1, key2… keyN. key1..keyN are intersected as in sInter. 返回值:成功返回,交集的个数,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
var_dump($redis->sinterstore('new',"test","test1"));  //结果:int(4)  
print_r($redis->smembers('new'));  //结果:Array ( [0] => 111 [1] => 222 [2] => 333 [3] => 444 )  
?>

28,sdiff 描述:返回第一个集合中存在并在其他所有集合中不存在的结果 参数:Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis. 返回值:成功返回数组,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
print_r($redis->sdiff("test","test1"));  //结果:Array ( [0] => 222 [1] => 333 )  
?>
  • sdiffstore

    描述:执行sdiff命令并把结果储存到新建的变量中。 参数: Key: dstkey, the key to store the diff into. Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis 返回值:成功返回数字,失败false 范例:

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
$redis->sadd("test","333");  
$redis->sadd("test1","111");  
$redis->sadd("test1","444");  
var_dump($redis->sdiffstore('new',"test","test1"));  //结果:int(2)  
print_r($redis->smembers('new'));  //结果:Array ( [0] => 222 [1] => 333 )  
?>
  • smembers, sgetmembers

    描述: 返回集合的内容 参数:Key: key 返回值:An array of elements, the contents of the set. 范例: 复制代码 代码如下:

1
2
3
4
5
6
7
8
<?php  
$redis = new redis();  
$redis->connect('127.0.0.1', 6379);  
$redis->delete('test');  
$redis->sadd("test","111");  
$redis->sadd("test","222");  
print_r($redis->smembers('test'));  //结果:Array ( [0] => 111 [1] => 222 )  
?>

php-redis当中,有很多不同名字,但是功能一样的函数,例如:lrem和lremove,这里就不例举了。

QQ交谈 独立按钮 https://weicoz.github.io/html+css/2018/06/25/QQ%E4%BA%A4%E8%B0%88-%E7%8B%AC%E7%AB%8B%E6%8C%89%E9%92%AE.html 2018-06-25

QQ交谈 独立按钮

1
2
3
4
<a href="http://wpa.qq.com/msgrd?v=3&uin=1247281152&site=qq&menu=yes">
    <img border="0" src="http://wpa.qq.com/pa?p=2:1247281152:52" alt="点击这里给我发消息" title="点击这里给我发消息"/>
</a>
<a class="black" href="tencent://message/?uin=1247281152&Site=在线客服&V=1&Menu=yes"></a>
HTML TIPS NOTE https://weicoz.github.io/html+css/2018/06/25/HTML-TIPS-NOTE.html 2018-06-25

HTML TIPS NOTE

  • HTML 空格

1
&nbsp;

  • 提高优先级 !important

1
.css{color:#fff !important}

  • CSS文字过长自动省略号

1
2
3
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;

  • CSS a标签无效

1
a{pointer-events:none;}

  • IE上运行firebug

<!script type="text/javascript" src="https://getfirebug.com/firebug-lite-debug.js"></script!>

  • IE7 display:inline-block

  • 第一种:专门为IE7写Hack
1
2
3
display:inline-block;
*display:inline;
*zoom:1;

特别是 ZOOM:1 这个必须的

  • 第二种:
1
2
.selector { display: inline-block }
.selector { *display: inline }

  • Chrome Hack

1
2
3
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .iProduct_img .iimg img{width: auto;}
}

控制台中引入jquery https://weicoz.github.io/js/2018/06/07/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E5%BC%95%E5%85%A5jquery.html 2018-06-07

控制台中引入jquery

1
2
3
4
var importJs=document.createElement('script')   //在页面新建一个script标签
importJs.setAttribute("type","text/JavaScript") //给script标签增加type属性
importJs.setAttribute("src", 'http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js')   //给script标签增加src属 性, url地址为cdn公共库里的
document.getElementsByTagName("head")[0].appendChild(importJs)    //把importJs标签添加在页面
js正则表达式使用方法 https://weicoz.github.io/js/2018/06/07/js%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95.html 2018-06-07

js正则表达式使用方法

1
2
3
4
5
6
function numrge(obj){
    var reg = new RegExp("^[0-9]*$");
    if(!reg.test(obj.value)){
        alert("请输入数字!");
    }
}
js实现页面跳转的几种方式 https://weicoz.github.io/js/2018/06/07/js%E5%AE%9E%E7%8E%B0%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F.html 2018-06-07

js实现页面跳转的几种方式

  1. window.location.href
1
window.location.href="jb51.jsp?backurl="+window.location.href;
  1. window.history.back
1
window.history.back(-1); //返回上一页
  1. window.navigate
1
window.navigate("jb51.jsp"); 
  1. self.location
1
self.location='jb51.htm'; 
  1. top.location
1
top.location='jb51.jsp'; 
js tip note https://weicoz.github.io/js/2018/06/07/js-tip-note.html 2018-06-07

js tip note

  • setTimeout 注意事项

1
setTimeout("history.go(-1)",3000); //注意必须在执行的方法内加引号,否则会马上执行

  • substr 截取字符串

1
2
3
4
5
6
var str="Hello world!";
document.write(str.substr(3,7)); //lo world!

var str="Hello world!";
document.write(str.substr(3));   //lo worl
//substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

  • replace 替换实例

1
2
var str="Visit Microsoft!"
document.write(str.replace(/Microsoft/, "W3School"))

  • select 通过内容选择 option

1
$("#jie option:contains('" + jie + "')").prop("selected", true);

  • JQ监测页面是否到底部 滚动加载 下拉

1
2
3
4
5
$(window).scroll(function () {
    if ($(document).scrollTop() + $(window).height() >= $(document).height()) {
        alert("哦哦,到底了.");
    }
});

  • 网页无法复制屏蔽右键

1
<body oncontextmenu=self.event.returnValue=false onselectstart="return false">

  • 网页无法复制屏蔽右键

1
<body oncontextmenu=self.event.returnValue=false onselectstart="return false">

jquery获取url函数 https://weicoz.github.io/js/2018/06/07/jquery%E8%8E%B7%E5%8F%96url%E5%87%BD%E6%95%B0.html 2018-06-07

jquery获取url函数

设置或获取对象指定的文件名或路径。

window.location.pathname

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.pathname); //输出:/topic/index

设置或获取整个 URL 为字符串。

window.location.href

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.href); //输出:http://localhost:8086/topic/index?topicId=361

设置或获取与 URL 关联的端口号码。

window.location.port

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.port); //输出:8086

设置或获取 URL 的协议部分。

window.location.protocol

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.protocol); 则输出:http:

设置或获取 href 属性中在井号“#”后面的分段。

window.location.hash

设置或获取 location 或 URL 的 hostname 和 port 号码。

window.location.host

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.host); //输出:http:localhost:8086

设置或获取 href 属性中跟在问号后面的部分。

window.location.search

例:http://localhost:8086/topic/index?topicId=361

1
alert(window.location.search); //输出:?topicId=361

window.location

属性 描述
hash 设置或获取 href 属性中在井号“#”后面的分段。
host 设置或获取 location 或 URL 的 hostname 和 port 号码。
hostname 设置或获取 location 或 URL 的主机名称部分。
href 设置或获取整个 URL 为字符串。
pathname 设置或获取对象指定的文件名或路径。
port 设置或获取与 URL 关联的端口号码。
protocol 设置或获取 URL 的协议部分。
search 设置或获取 href 属性中跟在问号后面的部分。

附上一个关于PHP中服务器变量获取query字符串的各个参数方法:

http://blog.unvs.cn/archives/php-server-url-string.html

jquery模拟form表单post提交 https://weicoz.github.io/js/2018/06/07/jquery%E6%A8%A1%E6%8B%9Fform%E8%A1%A8%E5%8D%95post%E6%8F%90%E4%BA%A4.html 2018-06-07

jquery模拟form表单post提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * jquery模拟form表单post提交
 * Created by Steven Guo on 2016/3/22.
 */
define(function(require , exports , module) {

    var myPost = function(url,args){
        var body = $(document.body),
            form = $("<form method='post'></form>"),
            input;
        form.attr({"action":url});
        $.each(args,function(key,value){
            input = $("<input type='hidden'>");
            input.attr({"name":key});
            input.val(value);
            form.append(input);
        });

        form.appendTo(document.body);
        form.submit();
        document.body.removeChild(form[0]);
    }

    module.exports.myPost = myPost;
});
jquery根据name属性查找元素 https://weicoz.github.io/js/2018/06/07/jquery%E6%A0%B9%E6%8D%AEname%E5%B1%9E%E6%80%A7%E6%9F%A5%E6%89%BE%E5%85%83%E7%B4%A0.html 2018-06-07

jquery根据name属性查找元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//选择所有含有id属性的div元素
$("div[id]");

//选择所有的name属性等于'newsletter'的input元素
$("input[name='newsletter']");

//选择所有的name属性不等于'newsletter'的input元素
$("input[name!='newsletter']"); 

//选择所有的name属性以'news'开头的input元素
$("input[name^='news']");

//选择所有的name属性以'news'结尾的input元素 
$("input[name$='news']");

//选择所有的name属性包含'news'的input元素
$("input[name*='man']");

//可以使用多个属性进行联合选择,该选择器是得到所有的含有id属性并且那么属性以man结尾的元素
$("input[id][name$='man']");
ajax模板范例 https://weicoz.github.io/js/2018/06/07/ajax%E6%A8%A1%E6%9D%BF%E8%8C%83%E4%BE%8B.html 2018-06-07

ajax模板范例

1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
   url: 'props_ajax.php?customer_id=<?php echo $customer_id_en;?>',
   data:{name:name,relation_type_id:relation_type_id,keyid:keyid},
   dataType: 'json',
   type: 'post',
   success:function(data){
       if(data.status == 1){
           $("#frm_pro").submit();
       }else{
           alert('提示信息:该分类下有相同的属性名!');
       }
   }
});
Sample Post 页面格式 https://weicoz.github.io/template/techonlogy/2017/11/30/Sample-Post-%E9%A1%B5%E9%9D%A2%E6%A0%BC%E5%BC%8F.html 2017-11-30

Below is just about everything you’ll need to style in the theme. Check the source code to see the many embedded elements within paragraphs.

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6

Body text

Lorem ipsum dolor sit amet, test link adipiscing elit. This is strong. Nullam dignissim convallis est. Quisque aliquam.

Smithsonian Image

This is emphasized. Donec faucibus. Nunc iaculis suscipit dui. 53 = 125. Water is H2O. Nam sit amet sem. Aliquam libero nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. The New York Times (That’s a citation). Underline. Maecenas ornare tortor. Donec sed tellus eget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus.

HTML and CSS are our tools. Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus. Praesent mattis, massa quis luctus fermentum, turpis mi volutpat justo, eu volutpat enim diam eget metus.

Blockquotes

Lorem ipsum dolor sit amet, test link adipiscing elit. Nullam dignissim convallis est. Quisque aliquam.

List Types

Ordered Lists

  1. Item one
    1. sub item one
    2. sub item two
    3. sub item three
  2. Item two

Unordered Lists

  • Item one
  • Item two
  • Item three

Tables

Header1 Header2 Header3
cell1 cell2 cell3
cell4 cell5 cell6
cell1 cell2 cell3
cell4 cell5 cell6
Foot1 Foot2 Foot3

Code Snippets

Syntax highlighting via Rouge

#container {
  float: left;
  margin: 0 -240px 0 0;
  width: 100%;
}

Non Pygments code example

<div id="awesome">
    <p>This is great isn't it?</p>
</div>

Buttons

Make any link standout more when applying the .btn class.

<a href="#" class="btn btn-success">Success Button</a>
1
<?php echo "高亮代码"; ?>   //高亮代码
Primary Button
Success Button
Warning Button
Danger Button
Info Button
Gmail别名 https://weicoz.github.io/techonlogy/2017/11/30/Gmail%E5%88%AB%E5%90%8D.html 2017-11-30

Gmail别名

用户名 abcdef@gmail.com 可以有一下几种变形

  1. abc.def@gmail.com

    用户名之间加“点”符号。Gmail的用户名是不区分“.”符号的,abcdef,a.bcdef,abc.def和abcd.ef其实都是同一个用户名。

  2. abcdef+hi@gmail.com

    用户名后面加“加号”。+hi,+my,+baidu……,“+”号后面可以是任意字符的。

  3. abcdef@googlemail.com

    把后缀变为googlemail.com

  4. abc.def+hi@googlemail.com

    以上3钟方法的结合。

在设置–帐户和导入–添加您拥有的其他电子邮件地址,添加了别名地址后,去收件箱收确认邮件就可以了。设置好了后,就可以用这些别名发信了。

sql操作 https://weicoz.github.io/sql/2017/11/08/sql%E6%93%8D%E4%BD%9C.html 2017-11-08

sql操作

INSERT INTO

1
2
3
INSERT INTO Websites (name, url, country)
VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
--将插入一个新行,但是只在 "name"、"url" 和 "country" 列插入数据(id 字段会自动更新):

Update

1
2
3
4
UPDATE Websites
SET alexa='5000', country='USA'
WHERE name='菜鸟教程';
--把 "菜鸟教程" 的 alexa 排名更新为 5000,country 改为 USA

SQL通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用。 SQL 通配符用于搜索表中的数据。 在 SQL 中,可使用一下通配符:

通配符 描述
% 替代 0 个或多个字符
- 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist] 或 [!charlist] 不在字符列中的任何单一字符
使用 SQL % 通配符
1
2
3
SELECT * FROM Websites
WHERE url LIKE 'https%';
--选取 url 以字母 "https" 开始的所有网站
使用 SQL _ 通配符
1
2
3
4
5
6
7
SELECT * FROM Websites
WHERE name LIKE '_oogle';
--选取 name 以一个任意字符开始,然后是 "oogle" 的所有客户

SELECT * FROM Websites
WHERE name LIKE 'G_o_le';
--选取 name 以 "G" 开始,然后是一个任意字符,然后是 "o",然后是一个任意字符,然后是 "le" 的所有网站
使用 SQL [charlist] 通配符

MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式

1
2
3
4
5
6
7
8
9
10
11
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
--SQL 语句选取 name 以 "G"、"F" 或 "s" 开始的所有网站

SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';
--选取 name 以 A 到 H 字母开头的网站

SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';
--选取 name 不以 A 到 H 字母开头的网站

SQL IN 操作符

1
2
3
SELECT * FROM Websites
WHERE name IN ('Google','菜鸟教程');
--选取 name 为 "Google" 或 "菜鸟教程" 的所有网站

SQL 别名

列的别名实例

1
2
3
SELECT name AS n, country AS c
FROM Websites;
--指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。提示:如果列名称包含空格,要求使用双引号或方括号

SQL INNER JOIN 关键字

SQL INNER JOIN 语法

1
2
3
4
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
实例
1
2
3
4
5
6
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;
--将返回所有网站的访问记录

SQL LEFT JOIN 关键字

SQL LEFT JOIN 语法

1
2
3
4
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
实例
1
2
3
4
5
6
7
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
--将返回所有网站及他们的访问量(如果有的话)。
--实例中我们把 Websites 作为左表,access_log 作为右表

SQL GROUP BY 语句

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

SQL GROUP BY 语法
1
2
3
4
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

SQL DISTINCT 用法

SQL DISTINCT 示例

1
2
3
4
SELECT DISTINCT name, url
FROM Websites
WHERE id='10'
--可以防止id = 10,且 name 相同的数据出现
php注释要求 https://weicoz.github.io/php/2017/11/08/php%E6%B3%A8%E9%87%8A%E8%A6%81%E6%B1%82.html 2017-11-08

PHPDoc 注释要求

PHPDoc 是一个 PHP 版的 Javadoc。它是一种注释 PHP 代码的正式标准。它支持通过类似 phpDocumentor 这样的外部文档生成器生成 API 文档,也可以帮助一些,例如Zend Studio, NetBeans, ActiveState Komodo Edit and IDE 和 Aptana Studio 之类的 集成开发环境 理解变量类型和弱类型语言中的其他歧义并提供改进的代码完成,类型提示和除错功能。

PHPDoc 可同时支持面向对象和面向过程的代码。以上摘自维基百科

简单来说PHPDOC可以用来自动生成API文档。主流的IDE都会识别它,并在你coding中给予你相应的智能提示。使用PHPDOC有以下好处

  1. 让你的代码更加规zhuang范bi,更易于理解

  2. 让你的IDE更懂你的代码,更加智能的提示和自动完成

  3. 如需API手册,可使用phpDocumentor来自动生成

@api

表示这是一个提供给第三方使用的API接口

@author

作者

格式 @author [名称] [<邮箱>]

例如 @author mokeyjay i@mokeyjay.com

版权声明。很多网站底部都有 格式 @copyright [描述]

例如 @copyright 1949-2016 China

@deprecated

不建议使用的、已过期的、将被删除的

格式 @deprecated [<版本号>] [<描述>]

例如 @deprecated 1.0.0 新版本将不再包含此函数 如果它是被其他方法所取代了,建议添加@see标记

@example

例子、示例、用例。也可表示方法返回值的例子

格式 @example [位置] [<起始行号> [<行数>] ] [<描述>]

例如 @example demo.php 10 3 使用示例

@filesource

没看懂,如果你们看懂了请告诉我。

@global

全局变量

格式 @global [类型][名称] @global [类型][描述] 我怀疑这里是源文档打错了,大概应该是

格式 @global [类型][名称][描述] 类型@global string name 用户名

@ignore

忽略

格式 @ignore [<描述>]

例如你在if和else的语句块中定义分别同一个变量但值不同时,可以通过此标记让phpDocumentor忽略其中一个,以免生成重复的文档。

例如

1
2
3
4
5
6
7
8
9
10
11
if ($ostest) {
     /**
      * This define will either be 'Unix' or 'Windows'
      */
     define("OS","Unix");
 } else {
     /**
      * @ignore
      */
     define("OS","Windows");
 }

@internal

仅限内部使用的

格式 @internal [描述]

例如 @internal 仅限内部测试使用

@license

协议,很常见的

格式 @license [] [名称]

例如 @license GPL

链接,可用于辅助说明、引用文档等

格式 @link [url] [<描述>]

例如 @link http://g.cn 不懂滚去问谷歌,别来烦我

@method

方法。这是用在类注释里的标记。特别适合一些动态加载的类,IDE无法自动提示出来,这时就可以通过写@method标记来告诉IDE我这类里有哪些方法

格式 @method [返回值类型] 名称 [<描述>]

例如 @method string google(string $question) 向谷歌提问,返回答案内容

@package

包。但php没有包,所以就用来表示命名空间

例如 @package yii\base\db

@param

参数,用于函数和方法注释里的标记

格式 @param [Type] [name] []

例如 @param string title 文章标题

@property

类属性,与@method类似,可以告诉IDE我这类里有哪些属性

格式 @property [Type] [name] []

例如 @property int id 用户id

@property-read

只读的属性。例如__get魔术方法能够取到的属性

格式 @property-read [Type] [name] []

例如 @property-read int id 用户id

@property-write

只可写的属性。例如__set魔术方法能够设置的属性

格式 @property-write [Type] [name] []

例如 @property-write string name 用户名

@return

返回值

格式 @return [类型] [<描述>]]

例如 @return array 结果数组

@see

参考,类似@link,可与@deprecated联动

格式 @see [url或完整方法名] [<描述>]

例如 @see \yii\base\db::tableName() 旧方法table_name已弃用,请使用此方法替代

@since

从xx版本开始。例如从1.0之后添加了xx功能、删除了xx参数等

格式 @since [1.0.0] [<描述>]

例如 @since 1.0.2 添加了$b参数

@source

没看懂

@throws

可能会抛出的错误类型

格式 @throws [类型] [<描述>]

例如 @throws LifeException

@todo

待办。提示自己或他人还需要做些什么

格式 @todo [描述]

例如 @todo 这个类还没做异常处理

@uses

使用

格式 @uses [完整方法名] [<描述>]

例如 @uses \yii\base\db::$count 使用此属性计数

@var

变量

格式 @var [类型] [变量名] [<描述>]

例如 @var int id 用户id

@version

版本号

格式 @version [<载体>] [<描述>]

例如 @version 1.0.1 2016-07-03更新

或者 @version GIT:1f3197d01 来自GIT分支1f3197d01

以上内容部分摘抄于网络,如有侵权请联系