遭遇Mysql 10061

今天连公司mysql服务器时, 遇到10061错误

ERROR 2003 (HY000): Can’t connect to MySQL server on ’192.168.0.106′ (10061)

按照正常的情形, 应该是mysql服务没有启动, 但是奇怪的是从phpmyadmin可以连接上, 那就说明不是mysql服务的问题. 查看了一下本地mysql客户端和服务器上mysql服务端的版本, 发现本地的要比服务器上的新(本地5.1.34, 服务器5.1.32), 呵呵, 看来高版本客户端连接低版本服务端可能是不被支持的, 至少在我的版本情形下是不被支持的. 立刻更换本地连接客户端为5.0.37(比服务端低或相等皆可), 再次连接, ok!

FF和IE对js保留字class的支持

ff支持 var class(只测试了class), 而ie则不支持这样的写法. 备忘.

js关键字和保留字列表

1. 关键字
break,  case,  catch,  continue,  default, delete,  do,  else, finally  , for, function, if, in, instanceof, new, return, switch, this, throw, try, typeof, var, void, while, with

2. 保留字
abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
fimal
float
goto
implements
import
int
interface
long
mative
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile

自己写的日期联动菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title>Untitled Document</title>

        <script type="text/javascript">

            var yearBegin = 1900;

            var today = new Date(); 

            var yearEnd = Number(today.getFullYear()); 

            var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

            var monthDaysP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

            window.onload = function init()

            {

            initYear();

            initMonth();

            initDay();

            }

            function writeDate(year, month, day)//

            {

            if (year < yearBegin)

            {

            year = yearBegin;

            }

            else if (year > yearEnd)

            {

            year = yearEnd;

            }

            if (month >12 || month <1)

            {

            month = 1;

            }

            //做个日期合法检查

            if (IsPinYear(year))

            {

            if (monthDaysP[month-1] < day)

            {

            day = monthDaysP[month-1];

            }

            }

            else

            {

            if (monthDays[month-1] < day)

            {

            day = monthDays[month-1];

            }

            }

            var yearObj = document.getElementById(‘year’);

            var monthObj = document.getElementById(‘monthSelect’);

            var dayObj = document.getElementById(‘daySelect’);

            yearObj.selectedIndex = year - yearBegin;

            monthObj.selectedIndex = month-1;

            dayObj.selectedIndex = day-1;

            }

            

            function initYear()

            {

            var yearObj = document.getElementById(‘year’);

            var monthObj = document.getElementById(‘monthSelect’);

            var dayObj = document.getElementById(‘daySelect’);

            for(i=yearBegin; i<=yearEnd; i++)

            {

            yearObj.options.add(new Option(i, i));

            }

            }

            function initMonth() //

            {

            var yearObj = document.getElementById(‘year’);

            var monthObj = document.getElementById(‘monthSelect’);

            var dayObj = document.getElementById(‘daySelect’);

            for(i=1; i<=12; i++)

            {

            monthObj.options.add(new Option(i, i));

            }

            }

            function initDay()//设置日期

            {

            var dayObj = document.getElementById(‘daySelect’);

            var month = getSelMonth();

            var year = getSelYear();

            dayObj.options.length = 0;

            if (IsPinYear(year))

            {

            days = monthDaysP[month-1];

            for(i=1; i<=days; i++)

            {

            dayObj.options.add(new Option(i, i));

            }

            }

            else

            {

            days = monthDays[month-1];

            for(i=1; i<=days; i++)

            {

            dayObj.options.add(new Option(i, i));

            }

            }

            }

            function monthChange()

            {

            initDay();

            }

            function yearChange()//年份发生改变

            {

            initDay();

            }

            function getSelYear()//获得当前选择的年

            {

            var yearObj = document.getElementById(‘year’);

            var yearIndex=yearObj.selectedIndex;

            return yearObj.options[yearIndex].value;

            }

            function getSelMonth()//获得当前选择的月份

            {

            var monthObj = document.getElementById(‘monthSelect’);

            var monthIndex=monthObj.selectedIndex;

            return monthObj.options[monthIndex].value;

            }

            function IsPinYear(year)//判断是否闰平年

            { return(0 == year%4 && (year%100 !=0 || year%400 == 0))}

        </script>

    </head>

    <body>

        <select name="year" id="year" onchange="yearChange();">

        </select>

        <select name="monthSelect" id="monthSelect" onchange="monthChange();">

        </select>

        <select name="daySelect" id="daySelect">

        </select>

        <a href="javascript:writeDate(1987, 9, 7);">19870907</a>

        <a href="javascript:writeDate(2987, 9, 7);">不合法的日期29870907</a>

        <script type=‘text/javascript’>

            //<![CDATA[

            if (document.getElementById('processtime')) 

                document.getElementById('processtime').innerHTML = "<span class='runtimedisplay'>Run in 51 ms, 8 Queries, Gzip enabled.</span>";

            //]]>

        </script>

    </body>

</html>

PHP单例模式的必要性

  多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育".  而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看.

1.
php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源.

2.
如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分.

3.
在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志.避免到处var_dump, echo.

cygwin导入windows用户

系统重装后,发现cygwin许多不能用了,进入系统path设置,添加 {%cygwinroot%}/bin ,其中{%cygwinroot%}是cygwin的安装目录.
发现可以用了, 由于之前很多设置都是和帐户有关的, 所以需要再导入之前的用户. cygwin没有adduser命令, 只能通过先windows添加用户, 然后通过如下命令来实现:
mkpasswd -l [-d] > /etc/passwd
mkgroup  -l [-d] > /etc/group
-d 用于导入域用户.
 

设置body高度为浏览器页面高度

在ie6下直接设置

body {height: 100%;}   

以上代码在ie7和ff下无效, 需如下设置:
html, body {height:100%; overflow:hidden;}  

overflow:hidden是为了避免ff下可能出现的竖向滚动条(在使用frame的情况下)

Zend Framework自定义路由一则

经常性的看到如下的url:
http://www.example.com/id/4
或者更干脆
http://www.example.com/3
链接清爽,且搜索引擎友好.
ZF为我们提供了快速简单的实现方式,代码如下
 

//$front为前段控制器实例

$router $front->getRouter();

//实现如http://www.example.com/id/4类型的url

$router->addRoute(

‘test1′

    new Zend_Controller_Router_Route(

     ‘id/:aid’

        array(‘controller’ => ‘index’ ‘action’ => ‘view’)

    ))

    //实现如http://www.example.com/3类型的url

    ->addRoute(

    ‘test2′

    new Zend_Controller_Router_Route(

     ‘/:aid’

        array(‘controller’ => ‘index’ ‘action’ => ‘view’)

        )

);

 

addRoute有两个参数,第一个为URL规则名称,第二个为URL规则的实例,该实例对应类必须实现Zend_Controller_Router_Interface接口,通常为Zend_Controller_Router_Route.
Zend_Controller_Router_Route有三个参数,定义原型为:
public function __construct($route, $defaults = array(), $reqs = array())
其中,
$route为URL匹配的方式, 例如test1实例中的’id/:aid’表示匹配http://www.example.com/id/x,":"代表之后为URL变量分隔符, 表示在实际的URL中aic为变量.
$defaults表示在URL匹配$route指定的形式时默认的各种参数,本例中设置了 控制器为index,动作为view, 所以当URL匹配时则相当于访问了http://www.example.com/index/view/id/x
$reqs则用于指定匹配的正则表达式, 例如 我们可以指定aid为整数时才匹配, 则:
 

$router->addRoute(‘test1′,    

    new Zend_Controller_Router_Route(‘id/:aid’,    

            array(   

                ‘controller’=>‘index’,   

                ‘action’=>‘view’                           

              )   

          ),   

    array(‘aid’=>‘\d+’)   

);

 

简单的介绍下,更多请查看ZF手册.

补充:
定义了’id/:aid’形式的路由规则之后,在动作控制器中,使用
$this->_request->getParam(‘aid’);
来获得id值.

Zend Framework代码实例 — 手工扑捉PHP内部错误

很明显本文的标题不够准确、不能很好体现本文所要表达的意思, 如果你想明白我想说什么, 那么你只好看下去. 呵呵.
今天看ZF源码时看到类Zend_Config_Ini中一段比较有意思的代码:

set_error_handler(array($this‘_loadFileErrorHandler’));           

$iniArray = parse_ini_file($filenametrue); // Warnings and errors are suppressed   

restore_error_handler();   

// Check if there was a error while loading file   

if ($this->_loadFileErrorStr !== null) {   

/**  

@see Zend_Config_Exception  

*/  

    require_once ‘Zend/Config/Exception.php’;   

    throw new Zend_Config_Exception($this->_loadFileErrorStr);   

}   

 

看了这段代码我的第一反应时为什么要这样处理呢?立刻转到错误处理方法看看
 

protected function _loadFileErrorHandler($errno$errstr$errfile$errline)   

{    

    if ($this->_loadFileErrorStr === null) {   

        $this->_loadFileErrorStr = $errstr;   

    } else {   

        $this->_loadFileErrorStr .= (PHP_EOL . $errstr);   

    }   

}

很简单,错误处理方法只是在出错时将类的$_loadFileErrorStr 属性设置为出错字符串.

翻看PHP手册, 从parse_ini_file函数的定义我们可以看出该函数在出现错误时(例如文件不存在,ini文件格式不正确等等)直接输出错误信息, 而不是通过返回值来表达出错信息, 这样我们在使用该函数时就无法很好的控制——在出错时合适的终止程序并给出错误提示或者不可避免的将可能不可理解的错误信息呈现给用户, 为了能够比较简单的手工处理出错信息, 这里采用了这个修改出错处理函数的方法, 由于这个出错函数比较有局限性, 所以之后又立即恢复了出错处理函数.
 

Pages: 上一页 1 2 3 4 5 6 7 8 下一页