ThinkPHP模板里怎么输出变量?

回复

thinkPHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2924 次浏览 • 2017-06-03 13:39 • 来自相关话题

如何生成全局唯一ID并能大致有序?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3748 次浏览 • 2017-06-02 10:43 • 来自相关话题

PHP json_encode 转换成空对象和空数组如何指定?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5538 次浏览 • 2017-06-01 16:14 • 来自相关话题

响应式web设计之CSS3 Media Queries

前端开发zkbhj 发表了文章 • 0 个评论 • 2872 次浏览 • 2017-05-26 15:32 • 来自相关话题

开始研究响应式web设计,CSS3 Media Queries是入门。

Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表。换句话说,其允许我们在不改变内容的情况下,改变页面的布局以精确适应不同的设备。

那么,Media Queries是如何工作的?

两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件:
<link rel="stylesheet" type="text/css" href="styleA.css" media="screen and (min-width: 400px)">意思是当屏幕的宽度大于等于400px的时候,应用styleA.css

在media属性里:

screen 是媒体类型里的一种,CSS2.1定义了10种媒体类型
and 被称为关键字,其他关键字还包括 not(排除某种设备),only(限定某种设备)
(min-width: 400px) 就是媒体特性,其被放置在一对圆括号中。完整的特性参看 相关的Media features部分
<link rel="stylesheet" type="text/css" href="styleB.css" media="screen and (min-width: 600px) and (max-width: 800px)">意思是当屏幕的宽度大于600小于800时,应用styleB.css
 
另一种方式,即是直接写在<style>标签里:
@media screen and (max-width: 600px) { /*当屏幕尺寸小于600px时,应用下面的CSS样式*/
.class {
background: #ccc;
}
}写法是前面加@media,其它跟link里的media属性相同

其实基本上就是样式覆盖~,判断设备,然后引用不同的样式文件覆盖。

要注意的是由于网页会根据屏幕宽度调整布局,所以不能使用绝对宽度的布局,也不能使用具有绝对宽度的元素。这一条非常重要,否则会出现横向滚动条。
 
补充:media query中的not only all等关键字

今天在群里一群友问起 @media only screen and (min-width: 320px) 中only是什么意思,查了些资料。

not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)、

only: 用来定某种特别的媒体类型。对于支持Media Queries的移动设备来说,如果存在only关键字,移动设备的Web浏览器会忽略only关键字并直接根据后面的表达式应用样式文件。对于不支持Media Queries的设备但能够读取Media Type类型的Web浏览器,遇到only关键字时会忽略这个样式文件。

all: 所有设备,这个应该经常看到 查看全部
开始研究响应式web设计,CSS3 Media Queries是入门。

Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表。换句话说,其允许我们在不改变内容的情况下,改变页面的布局以精确适应不同的设备。

那么,Media Queries是如何工作的?

两种方式,一种是直接在link中判断设备的尺寸,然后引用不同的css文件:
<link rel="stylesheet" type="text/css" href="styleA.css" media="screen and (min-width: 400px)">
意思是当屏幕的宽度大于等于400px的时候,应用styleA.css

在media属性里:

screen 是媒体类型里的一种,CSS2.1定义了10种媒体类型
and 被称为关键字,其他关键字还包括 not(排除某种设备),only(限定某种设备)
(min-width: 400px) 就是媒体特性,其被放置在一对圆括号中。完整的特性参看 相关的Media features部分
<link rel="stylesheet" type="text/css" href="styleB.css"  media="screen and (min-width: 600px) and (max-width: 800px)">
意思是当屏幕的宽度大于600小于800时,应用styleB.css
 
另一种方式,即是直接写在<style>标签里:
@media screen and (max-width: 600px) { /*当屏幕尺寸小于600px时,应用下面的CSS样式*/
.class {
background: #ccc;
}
}
写法是前面加@media,其它跟link里的media属性相同

其实基本上就是样式覆盖~,判断设备,然后引用不同的样式文件覆盖。

要注意的是由于网页会根据屏幕宽度调整布局,所以不能使用绝对宽度的布局,也不能使用具有绝对宽度的元素。这一条非常重要,否则会出现横向滚动条。
 
补充:media query中的not only all等关键字

今天在群里一群友问起 @media only screen and (min-width: 320px) 中only是什么意思,查了些资料。

not: not是用来排除掉某些特定的设备的,比如 @media not print(非打印设备)、

only: 用来定某种特别的媒体类型。对于支持Media Queries的移动设备来说,如果存在only关键字,移动设备的Web浏览器会忽略only关键字并直接根据后面的表达式应用样式文件。对于不支持Media Queries的设备但能够读取Media Type类型的Web浏览器,遇到only关键字时会忽略这个样式文件。

all: 所有设备,这个应该经常看到

域名解析中“TTL”是什么意思?

回复

专业名词zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2844 次浏览 • 2017-05-25 09:18 • 来自相关话题

MySql中实例和库的关系是什么?

回复

数据库zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3419 次浏览 • 2017-05-24 15:46 • 来自相关话题

扫码登录是怎么实现的?

回复

架构思想zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2606 次浏览 • 2017-05-24 11:32 • 来自相关话题

网站静态资源使用独立域名对网站效率的影响

前端开发zkbhj 发表了文章 • 0 个评论 • 1410 次浏览 • 2017-05-24 10:37 • 来自相关话题

在大型网站中,我们发现页面资源经常使用不同的域名进行引用,例如126邮箱的部分js、css、图片存放于//mimg.127.net/域名下,京东的部分静态图片存放在//img11.360buyimg.com域名下,那这样做究竟有什么好处呢,和性能又有什么关系呢,下面进行具体分析。
 
一、浏览器并发请求数的限制

我们进行网站页面访问时的客户端是浏览器,浏览器的很多机制对网站的访问速度有很大的影响(例如浏览器对静态资源的缓存机制),此外浏览器为提升页面显示效率,支持并发获取资源,如下是不同浏览器的版本对并发的支持:




浏览器对并发请求的数目限制是针对域名的,即针对同一域名(包括二级域名)在同一时间支持的并发请求数量的限制。如果请求数目超出限制,则会阻塞。因此,网站中对一些静态资源,使用不同的一级域名,可以提升浏览器并行请求的数目,加速界面资源的获取速度。 
二、网络请求时cookie传输

当静态资源与主服务在同一域名下(根据业务需要,主服务请求时需要传递cookie信息),每次静态资源的请求,都会发送同域名下的cookie。而对于静态资源,服务器无需对cookie进行任何处理,它们只是在毫无意义的消耗带宽。

假设网站cookie信息有1 KB、网站首页共150个资源时,用户在请求过程中需要发送150 KB的cookie信息,在512 Kbps的常见上行带宽下,需要长达3秒左右才能全部发送完毕。很多情况下cookie的path是在整个一级域名下可用的,如果你把静态资源设置成二级域名,那么它也避免不了cookie。例如如果给 http://126.com 设置了cookie,那么会感染所有子域名, 请求 http://www.126.com/logo.gif或者http://image.126.com/logo.gif 时便会带上讨厌的cookie。

所以对于静态资源使用单独的域名,并设置为无cookie,以减少请求大小,提高网页性能。
 
三、方便分流或缓存

我们知道,当面对大并发访问时,在服务端会有相应的缓存机制,例如我们会在CDN中缓存一些静态资源,以便用户可以通过就近的网络节点获取资源。例如新浪微博在加载资源时,很多就放在了阿里的CDN上:





 
此外,独立的域名也方便我们在代理服务层做动静分离,以便提升静态请求的处理速度。 
原文参考:http://blog.csdn.net/scorpio3k ... 20270 查看全部
在大型网站中,我们发现页面资源经常使用不同的域名进行引用,例如126邮箱的部分js、css、图片存放于//mimg.127.net/域名下,京东的部分静态图片存放在//img11.360buyimg.com域名下,那这样做究竟有什么好处呢,和性能又有什么关系呢,下面进行具体分析。
 
一、浏览器并发请求数的限制

我们进行网站页面访问时的客户端是浏览器,浏览器的很多机制对网站的访问速度有很大的影响(例如浏览器对静态资源的缓存机制),此外浏览器为提升页面显示效率,支持并发获取资源,如下是不同浏览器的版本对并发的支持:
QQ截图20170524103527.png

浏览器对并发请求的数目限制是针对域名的,即针对同一域名(包括二级域名)在同一时间支持的并发请求数量的限制。如果请求数目超出限制,则会阻塞。因此,网站中对一些静态资源,使用不同的一级域名,可以提升浏览器并行请求的数目,加速界面资源的获取速度。 
二、网络请求时cookie传输

当静态资源与主服务在同一域名下(根据业务需要,主服务请求时需要传递cookie信息),每次静态资源的请求,都会发送同域名下的cookie。而对于静态资源,服务器无需对cookie进行任何处理,它们只是在毫无意义的消耗带宽。

假设网站cookie信息有1 KB、网站首页共150个资源时,用户在请求过程中需要发送150 KB的cookie信息,在512 Kbps的常见上行带宽下,需要长达3秒左右才能全部发送完毕。很多情况下cookie的path是在整个一级域名下可用的,如果你把静态资源设置成二级域名,那么它也避免不了cookie。例如如果给 http://126.com 设置了cookie,那么会感染所有子域名, 请求 http://www.126.com/logo.gif或者http://image.126.com/logo.gif 时便会带上讨厌的cookie。

所以对于静态资源使用单独的域名,并设置为无cookie,以减少请求大小,提高网页性能。
 
三、方便分流或缓存

我们知道,当面对大并发访问时,在服务端会有相应的缓存机制,例如我们会在CDN中缓存一些静态资源,以便用户可以通过就近的网络节点获取资源。例如新浪微博在加载资源时,很多就放在了阿里的CDN上:

20161103121724978.png

 
此外,独立的域名也方便我们在代理服务层做动静分离,以便提升静态请求的处理速度。 
原文参考:http://blog.csdn.net/scorpio3k ... 20270

记录接口中常见的简单内容加密方式:恺撒加密的PHP实现

PHPzkbhj 发表了文章 • 0 个评论 • 1624 次浏览 • 2017-05-23 16:17 • 来自相关话题

问题描述:
    凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。
    凯撒密码的通用加密算法是:C=E(P)=(P+k) mod 260<k<26。
    凯撒密码的通用解密算法是:P=D(C)=(P-k) mod 260<k<26。

基本要求:
    实现凯撒密码的加密、解密算法,能够根据用户选择秘钥(移位数)和明文进行加解密。

实现提示:
    (1) 用户可以通过命令实现密钥和明文的选择;
    (2) 由于字母表中共有26个字符,因此,移位前应先将移动的位数(key)和26取模。
    (3) 尽管移位前已经将移动的位数和26取模,但是通过这种方式实现的右移和左移仍可能发生超界。因此,移位后仍要判断是否超界。
 一段Python代码:
#License:GPL v3 or higher.
#Copyright (C) 2012 Biergaizi

import sys
times=0
plain=input("Please input your plain text: ")
value=input("Please input your key(included negatives): ")
secret_list=list(plain)
secret_list_len=len(secret_list)

try:
value=int(value)
except ValueError:
print("Please input an integer.")
sys.exit()


#a的ANSI码是97, z的ANSI码是122。
#A的ANSI码是65, Z的ANSI码是90。

print("")
print("secret: ",end='')

while times < secret_list_len:
times=times+1
#ansi_raw即没有经过任何处理的原始ANSI。
ansi_raw=ord(secret_list[0+times-1])

#ansi是经过移位加密的ANSI。
ansi=ansi_raw+int(value)

#word是用户输入的原始字符。
word=(secret_list[0+times-1])

#如果ansi_raw小于65或大于90,而且还不是小写字母,那么则说明它根本就不是字母。不加密,直接输出原始内容。
if (ansi_raw < 65 or ansi_raw > 90) and word.islower() == False :
print(word,end='')

#如果ansi_raw小于97或大于122,而且还不是大写字母,那么则说明它根本不是字母。不加密,直接输出原始内容。
elif (ansi_raw < 97 or ansi_raw > 122) and word.isupper() == False:
print(word,end='')

#否则,它就是字母。
else:
#如果它是大写字母,而且ANSI码大于90,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。
while word.isupper() == True and ansi > 90:
ansi = -26 + ansi

#如果它是大写字母,而且ANSI码小于65,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。
while word.isupper() == True and ansi < 65:
ansi = 26 + ansi

#如果它是小写字母,而且ANSI码大于122,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。
while word.isupper() == False and ansi > 122:
ansi = -26 + ansi

#如果它是小写字母,而且ANSI码小于97,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。
while word.isupper() == False and ansi < 97:
ansi = 26 + ansi

#将处理过的ANSI转换为字符,来输出密文。
print(chr(ansi),end='')

print("")
思路:
①加密的整体思路是不是字母的数字不进行加密,若是小写字母,对字母移位(ASCII + 秘钥)后若ASCII码小于97或大于122则表示字母越界,只需要加26或减26直到移位后的在小写字母的范围内即可;同理大写字母也是相同的过程;
②解密的整体思路只需将移位后的的字母还原(ASCII - 秘钥),其他步骤和加密一样。

有了思路接下来写PHP代码:
<?php
class Caesar{

private $simple;//明文
private $secretKey;//秘钥
private $ciphertext;//密文
private $opResult;//加密或解密后的结果
private $operatorType;//操作类型;0代表加密1:代表解密

/**
* __construct 构造函数初始化类属性
* @param String $input 输入字符内容
* @param integer $secretKey 秘钥
* @param integer $operatorType 操作类型;0代表加密1:代表解密
*/
public function __construct($input,$secretKey = 1,$operatorType = 0){

$this->operatorType = intval($operatorType);
if($this->operatorType == 0){
$this->simple = $input;
$this->ciphertext = "";
}elseif ($this->operatorType == 1) {
$this->ciphertext = $input;
$this->simple = "";
}else{
echo "please input right operatorType";
exit();
}
$this->opResult = "";
$this->secretKey = intval($secretKey);
}


/**
* crypto 解密或加密函数
* @return String 加解密后的结果
*/
public function crypto(){

//获取加密解密后的字符串
$charArray = ($this->operatorType==0) ? str_split ($this->simple) : str_split ($this->ciphertext);

//遍历整个字符数组进行加密解密操作
foreach ($charArray as $key => $value) {
$asciiOriginal = ord($value);//字符的ASCII值
$asciiTransfrom =($this->operatorType==0) ? $asciiOriginal+$this->secretKey : $asciiOriginal-$this->secretKey;//加解密后的ASCII的值

//值得注意的是||的优先级比&&的优先级低,若不加括号会造成问题;
//若不是大写字母并且$asciiOriginal的值小于65或大于90则不加密
if ( ($asciiOriginal<65 || $asciiOriginal > 90 ) && ($this->isLowerCase($value)==false)) {
$this->opResult .= $value;

//若不是大写字母并且$asciiOriginal的值小于97或大于122则不加密
}elseif ( ($asciiOriginal<97 || $asciiOriginal > 122) &&($this->isCapital($value)==false)) {
$this->opResult .= $value;
}else{

//循环处理越界的问题
while ($asciiTransfrom<65&&$this->isCapital($value)) {
$asciiTransfrom += 26;
}

while ($asciiTransfrom>90&&$this->isCapital($value)) {
$asciiTransfrom -= 26;
}

while ($asciiTransfrom<97&&$this->isLowerCase($value)) {
$asciiTransfrom += 26;
}

while ($asciiTransfrom>122&&$this->isLowerCase($value)) {
$asciiTransfrom -= 26;
}
}
$this->opResult .= chr($asciiTransfrom);
}
return $this->opResult;
}

/**
* isLowerCase 判断是否为小写字母
* @param char $char 传入的字符
* @return boolean 返回boolean类型
*/
private function isLowerCase($char){
if(preg_match("/^[a-z]+$/", $char)){
return true;
}else{
return false;
}
}

/**
* isCapital 判断是否为小写字母
* @param char $char 传入的字符
* @return boolean 返回boolean类型
*/
private function isCapital($char){
if(preg_match("/^[A-Z]+$/", $char)){
return true;
}else{
return false;
}
}

}

$string = $_SERVER['argv'][1];
if (!$string) {
echo "please input parameter";
}
$test = new Caesar($string,1,1);
echo $test->crypto();
?>
  查看全部
问题描述:
    凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。
    凯撒密码的通用加密算法是:C=E(P)=(P+k) mod 260<k<26。
    凯撒密码的通用解密算法是:P=D(C)=(P-k) mod 260<k<26。

基本要求:
    实现凯撒密码的加密、解密算法,能够根据用户选择秘钥(移位数)和明文进行加解密。

实现提示:
    (1) 用户可以通过命令实现密钥和明文的选择;
    (2) 由于字母表中共有26个字符,因此,移位前应先将移动的位数(key)和26取模。
    (3) 尽管移位前已经将移动的位数和26取模,但是通过这种方式实现的右移和左移仍可能发生超界。因此,移位后仍要判断是否超界。
 一段Python代码:
#License:GPL v3 or higher.
#Copyright (C) 2012 Biergaizi

import sys
times=0
plain=input("Please input your plain text: ")
value=input("Please input your key(included negatives): ")
secret_list=list(plain)
secret_list_len=len(secret_list)

try:
value=int(value)
except ValueError:
print("Please input an integer.")
sys.exit()


#a的ANSI码是97, z的ANSI码是122。
#A的ANSI码是65, Z的ANSI码是90。

print("")
print("secret: ",end='')

while times < secret_list_len:
times=times+1
#ansi_raw即没有经过任何处理的原始ANSI。
ansi_raw=ord(secret_list[0+times-1])

#ansi是经过移位加密的ANSI。
ansi=ansi_raw+int(value)

#word是用户输入的原始字符。
word=(secret_list[0+times-1])

#如果ansi_raw小于65或大于90,而且还不是小写字母,那么则说明它根本就不是字母。不加密,直接输出原始内容。
if (ansi_raw < 65 or ansi_raw > 90) and word.islower() == False :
print(word,end='')

#如果ansi_raw小于97或大于122,而且还不是大写字母,那么则说明它根本不是字母。不加密,直接输出原始内容。
elif (ansi_raw < 97 or ansi_raw > 122) and word.isupper() == False:
print(word,end='')

#否则,它就是字母。
else:
#如果它是大写字母,而且ANSI码大于90,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。
while word.isupper() == True and ansi > 90:
ansi = -26 + ansi

#如果它是大写字母,而且ANSI码小于65,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。
while word.isupper() == True and ansi < 65:
ansi = 26 + ansi

#如果它是小写字母,而且ANSI码大于122,则说明向后出界。那么通过这个公式回到开头,直到不出界为止。
while word.isupper() == False and ansi > 122:
ansi = -26 + ansi

#如果它是小写字母,而且ANSI码小于97,则说明向前出界。那么通过这个公式回到结尾,直到不出界为止。
while word.isupper() == False and ansi < 97:
ansi = 26 + ansi

#将处理过的ANSI转换为字符,来输出密文。
print(chr(ansi),end='')

print("")

思路:
①加密的整体思路是不是字母的数字不进行加密,若是小写字母,对字母移位(ASCII + 秘钥)后若ASCII码小于97或大于122则表示字母越界,只需要加26或减26直到移位后的在小写字母的范围内即可;同理大写字母也是相同的过程;
②解密的整体思路只需将移位后的的字母还原(ASCII - 秘钥),其他步骤和加密一样。

有了思路接下来写PHP代码:
<?php
class Caesar{

private $simple;//明文
private $secretKey;//秘钥
private $ciphertext;//密文
private $opResult;//加密或解密后的结果
private $operatorType;//操作类型;0代表加密1:代表解密

/**
* __construct 构造函数初始化类属性
* @param String $input 输入字符内容
* @param integer $secretKey 秘钥
* @param integer $operatorType 操作类型;0代表加密1:代表解密
*/
public function __construct($input,$secretKey = 1,$operatorType = 0){

$this->operatorType = intval($operatorType);
if($this->operatorType == 0){
$this->simple = $input;
$this->ciphertext = "";
}elseif ($this->operatorType == 1) {
$this->ciphertext = $input;
$this->simple = "";
}else{
echo "please input right operatorType";
exit();
}
$this->opResult = "";
$this->secretKey = intval($secretKey);
}


/**
* crypto 解密或加密函数
* @return String 加解密后的结果
*/
public function crypto(){

//获取加密解密后的字符串
$charArray = ($this->operatorType==0) ? str_split ($this->simple) : str_split ($this->ciphertext);

//遍历整个字符数组进行加密解密操作
foreach ($charArray as $key => $value) {
$asciiOriginal = ord($value);//字符的ASCII值
$asciiTransfrom =($this->operatorType==0) ? $asciiOriginal+$this->secretKey : $asciiOriginal-$this->secretKey;//加解密后的ASCII的值

//值得注意的是||的优先级比&&的优先级低,若不加括号会造成问题;
//若不是大写字母并且$asciiOriginal的值小于65或大于90则不加密
if ( ($asciiOriginal<65 || $asciiOriginal > 90 ) && ($this->isLowerCase($value)==false)) {
$this->opResult .= $value;

//若不是大写字母并且$asciiOriginal的值小于97或大于122则不加密
}elseif ( ($asciiOriginal<97 || $asciiOriginal > 122) &&($this->isCapital($value)==false)) {
$this->opResult .= $value;
}else{

//循环处理越界的问题
while ($asciiTransfrom<65&&$this->isCapital($value)) {
$asciiTransfrom += 26;
}

while ($asciiTransfrom>90&&$this->isCapital($value)) {
$asciiTransfrom -= 26;
}

while ($asciiTransfrom<97&&$this->isLowerCase($value)) {
$asciiTransfrom += 26;
}

while ($asciiTransfrom>122&&$this->isLowerCase($value)) {
$asciiTransfrom -= 26;
}
}
$this->opResult .= chr($asciiTransfrom);
}
return $this->opResult;
}

/**
* isLowerCase 判断是否为小写字母
* @param char $char 传入的字符
* @return boolean 返回boolean类型
*/
private function isLowerCase($char){
if(preg_match("/^[a-z]+$/", $char)){
return true;
}else{
return false;
}
}

/**
* isCapital 判断是否为小写字母
* @param char $char 传入的字符
* @return boolean 返回boolean类型
*/
private function isCapital($char){
if(preg_match("/^[A-Z]+$/", $char)){
return true;
}else{
return false;
}
}

}

$string = $_SERVER['argv'][1];
if (!$string) {
echo "please input parameter";
}
$test = new Caesar($string,1,1);
echo $test->crypto();
?>

 

PHP如何获取MySQL数据库中的所有表?

回复

PHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4211 次浏览 • 2017-05-22 12:04 • 来自相关话题