MySql导出表结构为word文档

主要介绍下使用DBExportDoc V1.0 For MySQL配合mysql-connector-odbc-5.1.8-win32导出mysql表结构:

DBExportDoc V1.0 For MySQL(MySQL数据库表结构导出器)【DBExportDoc V1.0 For MySQL
是一套用来完成将MySQL数据库中的表结构导出成Word文档,并输出标准的打印报表格式的软件。
软件采用Word中VBA开发完成,软件使用Word中的菜单操作,与Word完全集成。
因为软件完全利用OFFICE宏来控制报表输出,所以用户在使用软件时请开启Word中的宏功能(注意软件其实就是一个word文档DBExportDoc V1.0 For MySQL.doc)

MySQL Connector/ODBC【下载

MySQL Connector/ODBC 有时也可以叫做 MyODBC,用户可以用ODBC (Open Database Connectivity,开放数据库互联)数据库连接Mysql的服务器。比如说,用户可以使用Windows或者Unix平台中的应用程序,如微软的 Access,Excel和Borland 的Delphi去连接数据库服务器。
MySQL Connector/ODBC可以与现今大多数的数据库一起使用,尤其是MYSQL的4.1,5.0,5.1,6.0版本。

安装完成MySQL Connector/ODBC后,在本机的控制面板->管理工具->数据源 (ODBC)里面配置与本机Mysql数据库连接的连接名。

 

1 2 3

 

配置完成数据源,打开DBExportDoc V1.0 For MySQL.doc,即所述软件,打开后按一下流程

 

 

4 5 6 7

 

确定后,连接到数据库选择自己需要导出的数据库,如下8

导出实例:

QQ截图20141217113224

 

JS实现PHP base64encode加密

JS实现PHP base64encode的JS加密,PHP使用base64decode的解密即可

JS加密 JS实现base64encode加密

function base64encode(str){

var out,i,len,base64EncodeChars=”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
var c1,c2,c3;
len=str.length;
i=0;
out=””;
while(i<len){ c1=str.charCodeAt(i++)&0xff; if(i==len){ out+=base64EncodeChars.charAt(c1>>2);
out+=base64EncodeChars.charAt((c1&0x3)<<4); out+=”==”; break; } c2=str.charCodeAt(i++); if(i==len){ out+=base64EncodeChars.charAt(c1>>2);
out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=base64EncodeChars.charAt((c2&0xF)<<2); out+=”=”; break; } c3=str.charCodeAt(i++); out+=base64EncodeChars.charAt(c1>>2);
out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));
out+=base64EncodeChars.charAt(c3&0x3F);
}

return out;
}

magento DUPLICATE ENTRY ” FOR KEY ‘UNQ_SALES_FLAT_ORDER_INCREMENT_ID’

问题可能出现在修改完订单编号后,提交订单到支付平台取消返回后继续提交,会出现类似

 

magento DUPLICATE ENTRY ” FOR KEY ‘UNQ_SALES_FLAT_ORDER_INCREMENT_ID’

解决办法

/app/code/core/Mage/Sales/Model/Resource/Quote.php

 

public function isOrderIncrementIdUsed($orderIncrementId)Line number 146

$bind = array (‘:increment_id’ => (int) $orderIncrementId);

Replace it with below line

$bind      = array(‘:increment_id’ => $orderIncrementId);

 

希望有帮助!!!

 

本机无法访问VMware虚拟机中的CentOS的web站点

使用VMware虚拟机,安装了nginx服务,虚拟机主机可以访问web服务,主机可以ping通虚拟机IP,但是无法访问web服务,
具体情况如下
1。主机能ping通虚拟机
2。虚拟机也能ping通主机(虚拟机如果ping不通主机,可以看下是否主机防火墙已经关闭了)
3。虚拟机能访问自己的web
4。主机无法访问虚拟己的web

检查是不是服务器的80端口被防火墙堵了,可以通过命令:telnet server_ip 80 来测试。

解决方法如下:

whereis iptables查看路径

# whereis iptables
iptables: /usr/sbin/iptables /usr/share/man/man8/iptables.8.gz

然后运行
/usr/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT

数据库mysql可以使用:

/usr/sbin/iptables -I INPUT -p tcp –dport 3360 -j ACCEPT

试下是不是可以连接了,具体防火墙相关命令如下:

重启防火墙:/etc/init.d/iptables restart
查看CentOS防火墙信息:/etc/init.d/iptables status
关闭CentOS防火墙服务:/etc/init.d/iptables stop
永久关闭防火墙:chkconfig –level 35 iptables off

PHP开发过程中常用的一些处理方法整理

PHP开发过程中常用的一些处理方法整理
返回经addslashes处理过的字符串或数组
返回经stripslashes处理过的字符串或数组
过滤ASCII码从0-28的控制字符
格式化文本域内容
将文本格式成适合js输出的字符串
转义 javascript 代码标记
获取当前页面完整URL地址
字符截取 支持UTF8/GBK
获取请求ip
程序执行时间
产生随机字符串
将字符串转换为数组
将数组转换为字符串
转换字节数为其他单位
安全过滤函数

 

/**
* 返回经addslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_addslashes($string){
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}

/**
* 返回经stripslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_stripslashes($string) {
if(!is_array($string)) return stripslashes($string);
foreach($string as $key => $val) $string[$key] = new_stripslashes($val);
return $string;
}

/**
* 返回经addslashe处理过的字符串或数组
* @param $obj 需要处理的字符串或数组
* @return mixed
*/
function new_html_special_chars($string) {
if(!is_array($string)) return htmlspecialchars($string);
foreach($string as $key => $val) $string[$key] = new_html_special_chars($val);
return $string;
}
/**
* 安全过滤函数
*
* @param $string
* @return string
*/
function safe_replace($string) {
$string = str_replace(‘%20’,”,$string);
$string = str_replace(‘%27’,”,$string);
$string = str_replace(‘%2527’,”,$string);
$string = str_replace(‘*’,”,$string);
$string = str_replace(‘”‘,’&quot;’,$string);
$string = str_replace(“‘”,”,$string);
$string = str_replace(‘”‘,”,$string);
$string = str_replace(‘;’,”,$string);
$string = str_replace(‘<‘,’&lt;’,$string);
$string = str_replace(‘>’,’&gt;’,$string);
$string = str_replace(“{“,”,$string);
$string = str_replace(‘}’,”,$string);
$string = str_replace(‘\\’,”,$string);
return $string;
}

/**
* 过滤ASCII码从0-28的控制字符
* @return String
*/
function trim_unsafe_control_chars($str) {
$rule = ‘/[‘ . chr ( 1 ) . ‘-‘ . chr ( 8 ) . chr ( 11 ) . ‘-‘ . chr ( 12 ) . chr ( 14 ) . ‘-‘ . chr ( 31 ) . ‘]*/’;
return str_replace ( chr ( 0 ), ”, preg_replace ( $rule, ”, $str ) );
}

/**
* 格式化文本域内容
*
* @param $string 文本域内容
* @return string
*/
function trim_textarea($string) {
$string = nl2br ( str_replace ( ‘ ‘, ‘&nbsp;’, $string ) );
return $string;
}

/**
* 将文本格式成适合js输出的字符串
* @param string $string 需要处理的字符串
* @param intval $isjs 是否执行字符串格式化,默认为执行
* @return string 处理后的字符串
*/
function format_js($string, $isjs = 1) {
$string = addslashes(str_replace(array(“\r”, “\n”, “\t”), array(”, ”, ”), $string));
return $isjs ? ‘document.write(“‘.$string.'”);’ : $string;
}

/**
* 转义 javascript 代码标记
*
* @param $str
* @return mixed
*/
function trim_script($str) {
if(is_array($str)){
foreach ($str as $key => $val){
$str[$key] = trim_script($val);
}
}else{
$str = preg_replace ( ‘/\<([\/]?)script([^\>]*?)\>/si’, ‘&lt;\\1script\\2&gt;’, $str );
$str = preg_replace ( ‘/\<([\/]?)iframe([^\>]*?)\>/si’, ‘&lt;\\1iframe\\2&gt;’, $str );
$str = preg_replace ( ‘/\<([\/]?)frame([^\>]*?)\>/si’, ‘&lt;\\1frame\\2&gt;’, $str );
$str = preg_replace ( ‘/]]\>/si’, ‘]] >’, $str );
}
return $str;
}
/**
* 获取当前页面完整URL地址
*/
function get_url() {
$sys_protocal = isset($_SERVER[‘SERVER_PORT’]) && $_SERVER[‘SERVER_PORT’] == ‘443’ ? ‘https://’ : ‘http://’;
$php_self = $_SERVER[‘PHP_SELF’] ? safe_replace($_SERVER[‘PHP_SELF’]) : safe_replace($_SERVER[‘SCRIPT_NAME’]);
$path_info = isset($_SERVER[‘PATH_INFO’]) ? safe_replace($_SERVER[‘PATH_INFO’]) : ”;
$relate_url = isset($_SERVER[‘REQUEST_URI’]) ? safe_replace($_SERVER[‘REQUEST_URI’]) : $php_self.(isset($_SERVER[‘QUERY_STRING’]) ? ‘?’.safe_replace($_SERVER[‘QUERY_STRING’]) : $path_info);
return $sys_protocal.(isset($_SERVER[‘HTTP_HOST’]) ? $_SERVER[‘HTTP_HOST’] : ”).$relate_url;
}
/**
* 字符截取 支持UTF8/GBK
* @param $string
* @param $length
* @param $dot
*/
function str_cut($string, $length, $dot = ‘…’) {
$strlen = strlen($string);
if($strlen <= $length) return $string;
$string = str_replace(array(‘ ‘,’&nbsp;’, ‘&amp;’, ‘&quot;’, ‘&#039;’, ‘&ldquo;’, ‘&rdquo;’, ‘&mdash;’, ‘&lt;’, ‘&gt;’, ‘&middot;’, ‘&hellip;’), array(‘∵’,’ ‘, ‘&’, ‘”‘, “‘”, ‘“’, ‘”’, ‘—’, ‘<‘, ‘>’, ‘·’, ‘…’), $string);
$strcut = ”;
if(strtolower(CHARSET) == ‘utf-8’) {
$length = intval($length-strlen($dot)-$length/3);
$n = $tn = $noc = 0;
while($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif(224 <= $t && $t <= 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if($noc >= $length) {
break;
}
}
if($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
$strcut = str_replace(array(‘∵’, ‘&’, ‘”‘, “‘”, ‘“’, ‘”’, ‘—’, ‘<‘, ‘>’, ‘·’, ‘…’), array(‘ ‘, ‘&amp;’, ‘&quot;’, ‘&#039;’, ‘&ldquo;’, ‘&rdquo;’, ‘&mdash;’, ‘&lt;’, ‘&gt;’, ‘&middot;’, ‘&hellip;’), $strcut);
} else {
$dotlen = strlen($dot);
$maxi = $length – $dotlen – 1;
$current_str = ”;
$search_arr = array(‘&’,’ ‘, ‘”‘, “‘”, ‘“’, ‘”’, ‘—’, ‘<‘, ‘>’, ‘·’, ‘…’,’∵’);
$replace_arr = array(‘&amp;’,’&nbsp;’, ‘&quot;’, ‘&#039;’, ‘&ldquo;’, ‘&rdquo;’, ‘&mdash;’, ‘&lt;’, ‘&gt;’, ‘&middot;’, ‘&hellip;’,’ ‘);
$search_flip = array_flip($search_arr);
for ($i = 0; $i < $maxi; $i++) {
$current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
if (in_array($current_str, $search_arr)) {
$key = $search_flip[$current_str];
$current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);
}
$strcut .= $current_str;
}
}
return $strcut.$dot;
}

/**
* 获取请求ip
*
* @return ip地址
*/
function ip() {
if(getenv(‘HTTP_CLIENT_IP’) && strcasecmp(getenv(‘HTTP_CLIENT_IP’), ‘unknown’)) {
$ip = getenv(‘HTTP_CLIENT_IP’);
} elseif(getenv(‘HTTP_MYCLIENTIP’) && strcasecmp(getenv(‘HTTP_MYCLIENTIP’), ‘unknown’)) {
$ip = getenv(‘HTTP_MYCLIENTIP’);
} elseif(getenv(‘HTTP_X_FORWARDED_FOR’) && strcasecmp(getenv(‘HTTP_X_FORWARDED_FOR’), ‘unknown’)) {
$ip = getenv(‘HTTP_X_FORWARDED_FOR’);
} elseif(getenv(‘REMOTE_ADDR’) && strcasecmp(getenv(‘REMOTE_ADDR’), ‘unknown’)) {
$ip = getenv(‘REMOTE_ADDR’);
} elseif(isset($_SERVER[‘REMOTE_ADDR’]) && $_SERVER[‘REMOTE_ADDR’] && strcasecmp($_SERVER[‘REMOTE_ADDR’], ‘unknown’)) {
$ip = $_SERVER[‘REMOTE_ADDR’];
}
return preg_match ( ‘/[\d\.]{7,15}/’, $ip, $matches ) ? $matches [0] : ”;
}

function get_cost_time() {
$microtime = microtime ( TRUE );
return $microtime – SYS_START_TIME;
}
/**
* 程序执行时间
*
* @return    int    单位ms
*/
function execute_time() {
$stime = explode ( ‘ ‘, SYS_START_TIME );
$etime = explode ( ‘ ‘, microtime () );
return number_format ( ($etime [1] + $etime [0] – $stime [1] – $stime [0]), 6 );
}

/**
* 产生随机字符串
*
* @param    int        $length  输出长度
* @param    string     $chars   可选的 ,默认为 0123456789
* @return   string     字符串
*/
function random($length, $chars = ‘0123456789’) {
$hash = ”;
$max = strlen($chars) – 1;
for($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}

/**
* 将字符串转换为数组
*
* @param    string    $data    字符串
* @return    array    返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
if(empty($data)) return array();
if(is_array($data) || is_object($data)) return $data;
eval(“\$array = $data;”);
return $array;
}
/**
* 将数组转换为字符串
*
* @param    array    $data        数组
* @param    bool    $isformdata    如果为0,则不使用new_stripslashes处理,可选参数,默认为1
* @return    string    返回字符串,如果,data为空,则返回空
*/
function array2string($data, $isformdata = 1) {
if($data == ”) return ”;
if($isformdata) $data = new_stripslashes($data);
return addslashes(var_export($data, TRUE));
}

/**
* 转换字节数为其他单位
*
*
* @param    string    $filesize    字节大小
* @return    string    返回大小
*/
function sizecount($filesize) {
if ($filesize >= 1073741824) {
$filesize = round($filesize / 1073741824 * 100) / 100 .’ GB’;
} elseif ($filesize >= 1048576) {
$filesize = round($filesize / 1048576 * 100) / 100 .’ MB’;
} elseif($filesize >= 1024) {
$filesize = round($filesize / 1024 * 100) / 100 . ‘ KB’;
} else {
$filesize = $filesize.’ Bytes’;
}
return $filesize;
}

PHP使用JSON

PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

一、json_encode()

该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:

$arr = array (‘a’=>1,’b’=>2,’c’=>3,’d’=>4,’e’=>5);

echo json_encode($arr);

结果为

{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}

再看一个对象转换的例子:

$obj->body           = ‘another post’;

$obj->id             = 21;

$obj->approved       = true;

$obj->favorite_count = 1;

$obj->status         = NULL;

echo json_encode($obj);

结果为

{
“body”:”another post”,

“id”:21,

“approved”:true,

“favorite_count”:1,

“status”:null
}

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

二、索引数组和关联数组

PHP支持两种数组,一种是只保存”值”(value)的索引数组(indexed array),另一种是保存”名值对”(name/value)的关联数组(associative array)。

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

比如,现在有一个索引数组

$arr = Array(‘one’, ‘two’, ‘three’);

echo json_encode($arr);

结果为:

[“one”,”two”,”three”]

如果将它改为关联数组:

$arr = Array(‘1’=>’one’, ‘2’=>’two’, ‘3’=>’three’);

echo json_encode($arr);

结果就变了:

{“1″:”one”,”2″:”two”,”3″:”three”}

注意,数据格式从”[]”(数组)变成了”{}”(对象)。

如果你需要将”索引数组”强制转化成”对象”,可以这样写

json_encode( (object)$arr );

或者

json_encode ( $arr, JSON_FORCE_OBJECT );

三、类(class)的转换

下面是一个PHP的类:

class Foo {

const     ERROR_CODE = ‘404’;

public    $public_ex = ‘this is public’;

private   $private_ex = ‘this is private!’;

protected $protected_ex = ‘this should be protected’;

public function getErrorCode() {

return self::ERROR_CODE;

}

}

现在,对这个类的实例进行json转换:

$foo = new Foo;

$foo_json = json_encode($foo);

echo $foo_json;

输出结果是

{“public_ex”:”this is public”}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

四、json_decode()

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

$json = ‘{“foo”: 12345}’;

$obj = json_decode($json);

print $obj->{‘foo’}; // 12345

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:

$json = ‘{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}’;

var_dump(json_decode($json));

结果就是生成一个PHP对象:

object(stdClass)#1 (5) {

[“a”] => int(1)
[“b”] => int(2)
[“c”] => int(3)
[“d”] => int(4)
[“e”] => int(5)

}

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:

$json = ‘{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}’;

var_dump(json_decode($json,true));

结果就生成了一个关联数组:

array(5) {

[“a”] => int(1)
[“b”] => int(2)
[“c”] => int(3)
[“d”] => int(4)
[“e”] => int(5)

}

五、json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?

$bad_json = “{ ‘bar’: ‘baz’ }”;

$bad_json = ‘{ bar: “baz” }’;

$bad_json = ‘{ “bar”: “baz”, }’;

对这三个字符串执行json_decode()都将返回null,并且报错。

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的”名”(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。

var_dump(json_decode(“Hello World”)); //null

随机生成序列码

使用24个字母加10个数字随机生成指定个数的不同的10位序列码,可以作为红包序列码、cdkey之类,所需字符可以自定义大写小写字母

$get_num=50;
$a=’abcdefghijklmnopqrstuvwxyz0123456789′;

$arr=str_split($a);
$new_arr=array();

for($i=0;$i<$get_num;$i++)

{

$random_str=get_num($arr);
//判断是否重复
if(in_array($random_str,$new_arr))
{
$i=$i-1;

}
else
{
$new_arr[$i]=$random_str;

}

}

print_r($new_arr);

function get_num($arr)
{
$str=”;
$count=count($arr);

for($k=0;$k<10;$k++)

{
$num=rand(0,$count-1);
$str.=$arr[$num];

}

return $str;
}

PHP删除文件夹及文件

PHP删除文件夹及文件:

删除指定路径的目录以及目录下所有子目录和文件。

function del_file($filename)

{

//判断目录是否存在 if(file_exists($filename)) { $dh= opendir($filename);

while($file=readdir($dh)) {

if($file !=’.’ && $file !=’..’) {

if(is_dir($filename.’/’.$file)) {

del_file($filename.’/’.$file);

} else { @unlink($filename.’/’.$file); echo $filename.’/’.$file.’ has been deleted! ‘; } }

} closedir($dh); @rmdir($filename); echo $filename.’ has been deleted! ‘;

} else { echo ‘File is not exists’; }

}

分享13款PHP开发框架

创建应用程序是一个复杂且耗时的过程,如果开发者能利用好框架,那么就可以在一个统一的结构基础上通过重用通用组件和模块来快速地做好项目。省掉创建通用组件的时间和人力,软件开发者可以把更多的时间投入到具体的项目上去,这样开发者就能专注于开发高质量的代码。

现在,我们就来介绍13个最佳PHP框架来帮助开发者建立互操作或灵活的应用。

1. Laravel

这是一款简洁、“优雅”的PHP开发框架,可谓是为WEB艺术家创造的。它可以让开发者从面条一样杂乱的代码中得到解脱,轻松构建一个完美的网络应 用程序,且使得每行代码都简洁、富于表达力。Laravel自带了强大的Eloquent ORM和迁移工具,能够完美地与MySQL、Postgres、SQL Server 和 SQLite协同工作。Laravel从开始就将测试作为重点功能,提供灵活的IoC容器、集成PHPUnit的测试工具。更方便的是Laravel适应 所有级别的开发工作。

2. CodeIgniter

CodeIgniter是一个基于MVC模式、小巧但功能强大的PHP框架,作为一个简单而“优雅”的工具包,它可以为PHP程序员建立功能完善的 Web应用程序。如果你是一名使用共享主机,且为客户所要求的期限而烦恼的开发人员,如果你已经厌倦了那些傻大笨粗的框架,那么CodeIgniter就 是你所需要的。CodeIgniter几乎0配置、不需坚守限制性编码规则、不需使用命令行,并广泛兼容标准主机上的各种PHP版本和配置,有着清晰、完 善的文档。

3. CakePHP

CakePHP是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该项目主要目标是提供一个可以让各种层次的PHP开发人员快速地开发出健壮的Web应用,而 又不失灵活性。

CakePHP框架提供了强大的基础来创建应用。CakePHP框架基于MVC模式,这使得开发者轻松地定制和扩展应用。该框架还提供了一个基本的组织结构,从文件名到数据库表名,使整个应用保持一致性和逻辑性。

4. Symfony

Symfony是一款基于MVC架构的PHP框架,能加速开发者创建与维护Web应用程序。Symfony致力于减少重复代码的编写,以加速Web 应用的开发和维护。它给予了开发者强大的功能:从文件结构到外部目录,几乎所有的东西都可以自定义。Symfony使用了大量的设计模式,比如MVC模 式,它分离了业务逻辑层和表示层,降低了耦合性,使程序更易于维护。

5. Zend Framework 2

Zend Framework 2是用PHP 5来开发web程序和服务的开源框架,用100%面向对象编码实现。其组件结构独一无二,每个组件几乎不依靠其他组件,这样的松耦合结构可以让开发者独立 使用组件。它还提供了强壮而高效的MVC实现,易于使用的数据库摘要和实现HTML表单解析、校验和过滤的表单组件,这样开发者可以通过这些易用的、面向 对象的接口联合所有这些操作。

6. Phalcon

Phalcon是一个开源、全堆栈、用C语言写而成的php5框架,专为高性能设计。不需要开发者去专门学习、使用C语言的功能,因为这是一个PHP框架,只不过用C语言写成而已。同时Phalcon是松耦合的,开发者可以根据需要使用其他组件。

7. Yii

Yii是一个基于组件、用于开发大型Web应用的高性能PHP框架。Yii提供了Web 2.0应用开发所需要的几乎一切功能,是最有效率的PHP框架之一。Yii有着强大的组件、丰富的类库、成熟的模式、方便的gii、各式的widget, 大大提高了开发者的工作效率。

8. Aura

Aura有着干净的代码、全解耦库及真正独立的包。它提供高质量测试、符合标准的库包,可用任何代码库。

9. Fat-Free

Fat-Free是全栈式Php 5.3微型框架,自带auth、验证码、图表、feed、smtp等一系列功能。此外,它还有着高性能的URL路由、缓存引擎、内置代码高亮等功能,也支持多种语言的应用。

10. PHP-MVC

这是一款基于MVC模式的极其精简的框架,仅使用本地的PHP代码,所以开发者不用再重新学习该框架,极易容易上手。

11. Kohana

这是一款“优雅”的HMVC PHP5的框架,用于构建Web应用程序的组件,它提供了一套丰富类库。它包含许多常见的如翻译工具、数据库访问、代码分析等组件,开发者可以快速地构建应用程序。这是一个严格建立在PHP5类和对象基础上的面向对象的框架。

12. FuelPHP

FuelPHP是一款简单、灵活的PHP 5.3的Web框架,它建立和测试在MVC架构思想下,并且融合了许多已经存在开发框架的概念。

13. Slim

Slim是一款微型的PHP 5框架,可以帮助开发者快速编写简单功能强大的RESTful风格的web应用程序 和APIs。

以上就是13款PHP开发框架,开发者可以针对不同的项目选择合适的框架。

 

原文地址: http://www.php100.com/html/it/mobile/2014/0409/6762.html

微软强拆撒谎,腾讯借船出海

这是一个可以写进商业教材的典型病例。一个软件巨人在没落时代的自以为是和麻木不仁。

微软宣布,4月将中止为windows xp系统服务。理由是“xp不安全”。中止服务表示将不再发布XP的漏洞和补丁,不再对xp的安全负责。微软说,此后XP用户将成为黑客首要目标,网银账号可能被偷,即使杀毒软件也不能保护。

简单说,微软在逼用户向win8迁移,用的是“安全”的招牌。原来老外也会玩中国人的把戏,“强拆”。说老楼房会被打劫,断水断电撤保安,逼居民掏钱住新楼房。

有13年历史的xp是历史上最成功的操作系统,到今天仍是最受欢迎的操作系统。Net Market Share统计,2013年全球PC中XP份额29%。中国PC中XP份额在2012年仍占73%。

xp不够安全是种模糊的可能,而xp在阻挠微软挣钱则是个钢铁现实。中国XP在用量2亿台,有84%不打算升级Win8。就算若有10%被迫升级,就是200亿,远超微软中国一年的收入。逼迫用户升级是微软中国完成KPI的那棵稻草。

在全球,恐龙微软在移动时代远落后于苹果和谷歌,XP后的操作系统一代不如一代。将XP存量用户变现,是微软增收一“妙”招。

这就是软件巨人微软的命门。用户必须买新版本,才能挣钱。但你不可能永无止尽的塞给用户他们根本不需要的“新东西”。这些新版本里的花俏的玩意儿也许是适合耍酷的IT工程师,却根本不适合大部分老百姓。这个结,就是微软没落的核心原因。

微软不打算就这样死去,它要挣扎。它说,你不升级就会被偷。听起来就好像是:“我死之前,你们会先死。”

有多少人喜欢被要挟呢?互联网时代的一个法则是:站在用户的一边,不要与他们为敌。难怪鲍尔默要离职,微软一直反着干。

好在微软貌似觉醒了。它刚联合腾讯推出“扎篱笆”计划。意思是,对没升级的xp用户实施安全保护。

这就是微软的谎言所在。之前中止xp服务的理由是“不安全”,但现在又可以对xp“安全保护”。到底之前是撒谎,还是现在撒谎?

也许两次都在撒谎。第一次强拆未遂。第二次绵里藏针,请君入瓮。腾讯帮微软站台的可能原因之一是,借船出海,搭着微软的船在安全领域扩张。腾讯能给微软的好处之一是,用自己的品牌和用户量带来更多升级。微软得收入且挽回些民心,腾讯得市场。相得益彰。

好在那个微软的职业经理人张先生绞尽脑汁说了一句话:“扎篱笆这一过渡时期安全服务的保护作用仍然是有限的,强烈建议用户升级至微软更高级的系统。”

“保护作用有限”到底啥意思?若能保护,就不用升级;若不能保护,腾讯就是打酱油的。这话不仅暴露微软的两次谎言,更扇了腾讯一耳光。

真是好奇大公司里这些职业经理人用的是哪个物种的逻辑,它是不懂中文,还是觉得中国的媒体都是脑残?“扎篱笆”这个词应该也是这位张先生的创造。篱笆能防住持刀的强盗吗?“扎篱笆”基本等于那句“保护作用有限”。

微软的如意算盘是,通过“篱笆联盟”让国内企业用自己的品牌和渠道为升级微软系统背书,同时暗示“篱笆”并非铜墙铁壁,保持对用户恐吓。微软又尤其要防止篱笆盟友们真的向用户宣传自己有能力把篱笆墙变成铜墙铁壁。那就是赔了夫人又折兵。

微软这家公司,年老色衰,自以为是。从这家公司身上看不到希望。

在曾在微软任职的“深喉”的帮助下,之前写过一篇文章号召卖空微软股票,仅几天后它大跌11%;也写过3篇抨击Surface以及微软官僚政治的文章。这里引用其中一句:

“曾在微软工作的阿D博士说,使用Surface的第一天我就明白这是一个笑话,它一定失败。但微软内部居然没一个人在Surface发布前出来大喊:这东西不靠谱,不能发布。这是微软真正的危险。他们在集体忽悠。”

现在看来,中止xp服务然后再来一个“扎篱笆”,无非是又一个版本的Surface。

这就是大公司的最终结果。

本自媒体帐号:孕峰

科技当以人为本。越科技,越人文