ODM—WEB 总结

ODM—WEB 总结

1. PHPmysql总结

1.1 mysql数据库字符集

Mysql的字符集里有两个概念,“Character set(字符集),另“Collations”

1.1.1Mysql 字符集系统变量

– character_set_server:默认的内部操作字符集

– character_set_client:客户端来源数据使用的字符集

– character_set_connection:连接层字符集

– character_set_results:查询结果字符集

– character_set_database:当前选中数据库的默认字符集

– character_set_system:系统元数据(字段名等)字符集

MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1

(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;

(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;

(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server

(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;

(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

1.1.2 Collations

Collations翻成中文是校验,在网页开发的过程中,词汇,只在Mysql主要作用是指导Mysql对字符的比较,好比,ASCII字符集里,Collations划定了a小于ba等于a,以及a是否等于A之类的。通常,大家基本可以忽略Collations的存在,因为每个字符集都有默认的Collations,通常,使用默认的Collations可以了。

MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感) 如latin1_swedish_ci_cs(表示大小写敏感)_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”“A”是等价的

1.2 MySQL中的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准)

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

• 若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results

1.2.1常见问题解析

Example 1

向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8

插入时根据MySQL服务器的默认设置,character_set_clientcharacter_set_connectioncharacter_set_results均为latin1

插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;

查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码

Example 2

向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8

插入时根据连接字符集设置,character_set_clientcharacter_set_connectioncharacter_set_results均为utf8

插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。

UTF8 编码是国际通用编码,英文用8位而中文用24位编码 。GBK是双字节编码,无论英文和中文都是双字节编码。 它们之间的转换是通过unicode编码转换的。

1.3 PHPmysql字符集处理

1.3.1 涉及到的字符集

MySQL数据库操作过程中出现了三种字符集:

1、页面字符集(也就是 content="TEXT/HTML; CHARSET=GBK"

2、连接字符集(也就是 "Set names 'GBK'"

3、字段字符集(无论是库还是表的字符集,将最终反映到字段上)

PHP最终生成的是文本文件,但他要取数据库里的文本,或将文本存进数据库。因为Mysql支持多字符集,默认情况下,Mysql不知道PHP发给他的是什么编码的字符,所以Mysql要求客户端(PHP)告诉他存取的字符集是什么

PHP通过设置character_set_client,告诉MysqlPHP存进数据库的是什么编码方式

PHP通过设置character_set_results,告诉MysqlPHP需要什么样编码的数据。

PHP通过设置character_set_connection,告诉MysqlPHP查询中的文本,使用什么编码。MYSQL使用设置的编码方式存储文本。

假设Mysql使用setserver来存储文本,PHPcharacter_set_clientsetclientPHPcharacter_set_resultssetresult。那么,MysqlPHP发来的文本,从setclient编码,转换成setserver编码,再存入数据库,PHP取文本,Mysql将文本从setserver转换成setresult,再发送给PHP

PHP文件(最终生成的HTML)本身有个编码,如果Mysql传过来的编码,与PHP自身的编码不同,那么,整个网页,必然乱码。所以PHP一般将自己的编码方式,告诉Mysql

要保证不乱码,就必需将三个编码统一:一是网页自身的编码,二是HTML里指定的编码,三是PHP告诉Mysql的编码(包括character_set_clientcharacter_set_results)

第一和第二个编码,DW之类的编纂器写的网页,通常是一致的,但用记事本写的网页,有可能不一致。

第三个编码,需要手工通知Mysql。这步可以通过PHP使用mysql_query(“set names characterX”)来实现。

字符集转换函数

转换函数1

$row["vWorldName"] = iconv("gbk","utf8//IGNORE",$row["vWorldName"]);

第二个参数为原字符集,第三个为目标字符集

转换函数2

$row["vWorldName"] = mb_convert_encoding($row["vWorldName"],"utf8","gbk");

第二个参数为目标字符集,第三个为原字符集

需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 去掉

1. 发现iconv在转换字符"-"gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个"-"都无法转换成功,无法输出。另外mb_convert_encoding没有这个bug.

2. mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;如:$str = mb_convert_encoding($str,"euc-jp","ASCII,JIS,EUC-JP,SJIS,

UTF-8");“ASCII,JIS,EUC-JP,SJIS,UTF-8”的顺序不同效果也有差异

     3. 一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.

Example 

1、情况一

数据库字段字符集:utf-8

连接字符集:没有显式设置,默认为latin1

页面字符集:gbk

存入过程:

1)页面用GBK表示的SQL向服务器提交存入请求;

2)默认情况下(不用Set Names '??')服务器用latin1打开连接;

3)服务器误认为当前的SQL语句是用latin1表示的;

4)服务器将GBK字符当作latin1字符,错误的运用“latin1UTF-8函数将字符转换后存入UTF-8字段中;

5) 错误的latin1(其实是GBK) => 错误的UTF-8

6)如果用phpmyadmin打开该表(用utf8连接)将会看到该字段为乱码;

读取过程:

1)默认情况下(不用Set Names '??')服务器用latin1打开连接;

2)服务器将UTF-8字段中的值转换为latin1返回给客户端;

3)(错误的UTF-8 => 错误的latin1(其实是GBK))该过程为存入过程5的逆过程。(刚好错错得对了)

4)将服务器误认为是latin1GBK编码按页面字符集正常显示;

CI框架中数据库连接方式

· hostname - 数据库的主机名,通常位于本机,可以表示为 "localhost".

· username - 需要连接到数据库的用户名.

· password - 登陆数据库的密码.

· database - 你需要连接的数据库名.

· dbdriver - 数据库类型。如:mysqlpostgresodbc 等。必须为小写字母。

· dbprefix - 当运行Active Record查询时数据表的前缀,它允许在一个数据库上安装多个CodeIgniter程序.

· pconnect - TRUE/FALSE (boolean) - 使用持续连接.

· db_debug - TRUE/FALSE (boolean) - 显示数据库错误信息.

· cache_on - TRUE/FALSE (boolean) - 数据库查询缓存是否开启,详情请见数据库缓存类。

· cachedir - 数据库查询缓存目录所在的服务器绝对路径。

· char_set - 与数据库通信时所使用的字符集。

· dbcollat - 与数据库通信时所使用的字符规则(character collation )

· swap_pre - A default table prefix that should be swapped with dbprefix. This is useful for distributed applications where you might run manually written queries, and need the prefix to still be customizable by the end user.

· autoinit - 是否自动初始化数据库

· stricton - TRUE/FALSE (boolean) - 是否强制使用 "Strict Mode" 连接在开发程序时,使用 strict SQL 是一个好习惯。

· port - 数据库端口号要使用这个值,你应该添加一行代码到数据库配置数组。

1.3.2使用MySQL字符集时的建议

建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰;

数据库和连接字符集都使用latin1时虽然大部分情况下都可以解决乱码问题,但缺点是无法以字符为单位来进行SQL操作,一般情况下将数据库和连接字符集都置为utf8是较好的选择;

使用mysql C API时,初始化数据库句柄后马上用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,这样就不用显式地用 SET NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8

对于mysql PHP API,一般页面级的PHP程序总运行时间较短,在连接到数据库以后显式用SET NAMES语句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集。

1.3.3其他注意事项

my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用!

对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。

SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!

2. PHPcurl使用教程

CURL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTPFTPTELNET等。

2.1 CURL基本结构

PHP中建立CURL请求的基本步骤:

1. 初始化 

2. 设置变量 

3. 执行并获取结果 

4. 释放cURL句柄 

Example 

      // 1. 初始化

$ch = curl_init();

// 2. 设置选项,包括URL

curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADER, 0);

// 3. 执行并获取HTML文档内容

$output = curl_exec($ch);

// 4. 释放curl句柄

curl_close($ch);

最为重要的步骤为第二步CURL设置

2.2检查错误

Example 

$output = curl_exec($ch);

if ($output === FALSE) {

echo "cURL Error: " . curl_error($ch);

}

// ...

2.3GETPOST方式发送数据

POST方式传递

$url = "http://localhost/post_output.php";

$post_data = array (

"foo" => "bar",

"query" => "Nettuts",

"action" => "Submit"

);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// 我们在POST数据哦!

curl_setopt($ch, CURLOPT_POST, 1);

// post的变量加上

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

$output = curl_exec($ch);

curl_close($ch);

echo $output;

———————————————————————————————————

GET            $conn="http://172.16.129.32/PingMysql.php?ip=".$testip."&user=".$testuserum."&pwd=".$testpwd.""; 

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,$conn);

//  curl_setopt($ch,CURLOPT_NOBODY,1);  加上此设置将无法接受ECHO

curl_setopt($ch,CURLOPT_HEADER,0); 

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

$output=curl_exec($ch);

You can't specify target table 'A' for update in FROM clause

解决方法:

原句:delete  from menu_item  where parent_id =(select menu_item_id from menu_item where menu_data like '%manageVendors%');

修改后:delete  from menu_item  where parent_id =(select temp.menu_item_id from (select m.menu_item_id,m.menu_data from menu_item m) temp where temp.menu_data like '%manageVendors%');

就是全部展示出来SQL要查询的内容. 子查询内容要详细.

配置virtualhost

<VirtualHost 172.16.195.164:80>

#    AllowOverride All

    ServerName getlog.ied.com

    ScriptAlias /cgi-bin/ "/data/GetLog/cgi-bin/"

    SetEnv LD_LIBRARY_PATH /usr/local/lib;/data/wwwdata/lib

    <Directory "/data/GetLog/htdocs/">

      Options Includes FollowSymlinks  MultiViews

      Order allow,deny

      Allow from all

      AllowOverride all

    </Directory>

</VirtualHost>

还要配置本地  C:\Windows\System32\drivers\etc 目录下 修改host文件

添加  地址和域名

172.16.195.164 odm.ied.com

172.16.195.164  getlog.ied.com

3.Extjs grid 应用

   获取数据

var proxy=new Ext.data.HttpProxy({url:'/test.php',method:'POST'}); 

    var reader=new Ext.data.JsonReader({

root: 'results',   //json数据的节点{results:[{}]

// totalProperty:'total',

fields:

   [ {name: 'iGameID'} ] 

        }) ;

var ds=new Ext.data.Store({         

 proxy:proxy,      

         reader:reader,

         remoteSort:true  //远程排序,grid为分页时候必须 

}); 

ds.on('beforeload',function(){

  this.baseParams={

 ddlGameList:gameid,

 ddlWorldList:worldid

};

});

ds.setDefaultSort('iGameID','asc');  //设置远程排序的时候,加上默认排序参数,可以想后台传入要

//排序的列sort和升序或降序dir

  //     ds.load({params:{start:0,limit:25,ddlGameList:gameid,ddlWorldList:worldid}});

         //查看grid控件是否存在,存在就destory改控件

     if(grid != undefined )    //防止页面出现多个grid  每次加载的时候都判断有无,有则删除

      {

grid.destroy();

  }

//grid上复选框

var mysm=new Ext.grid.CheckboxSelectionModel();   //grid中的最前面加入复选框

    grid = new Ext.grid.GridPanel({

        store: ds,   //数据源

        id:"grid",

        sm:mysm,   //行中加入 复选框

        columns: [

            mysm,  //列中加入复选框

         {header: "游戏名", width: 60, dataIndex: 'vGameName', sortable: true} ],    //dataIndex

//保持和数据源ds中的fieldname名字一致

    //    autoHeight:true,

            height :400, 

            autoScroll:true,  //出现滚动条,此时高度必须设置才出来

             stripeRows: true,

         loadMask:true,  //加载的时候出现遮罩效果

            width: 1000,

            title: '查询结果',

            // config options for stateful behavior

            stateful: true,

    viewConfig:{   

                    forceFit:true  

                },

           tbar:{     //grid 中加入工具条

           frame: true, //

          items:[ 

{

xtype: 'button',   //工具条中加入button

width: 89,

text: '修改',

x: 250,

y: 10,

region: 'west',

listeners:{

 click':function(){

     var gsm = (Ext.getCmp("grid")).getSelectionModel();//获取选择列

   var rows = gsm.getSelections();//根据选择列获取到所有的行

     if (rows.length > 0) 

     {

 //当有选择的数据的时候

 for (var i = 0; i < rows.length; i++)

 {

 //循环迭代所有的选择的row var rs_gamename = row.get('vGameName');//获得游戏名称

                         }

                             }

 else

 {

Ext.Msg.alert('提示', '请选择要修改的业务信息!');

 }

}

}

                }

                  ],

        listeners:{       

                'render':function(){        //加两个滚动条  

                        var tbar =  new Ext.PagingToolbar({                             

                        store : ds, 

                        pageSize : 25,                       

                           displayInfo : true,                          

                           beforePageText:"",                         

                           afterPageText:"/ {0}",                     

                           firstText:"首页",                    

                           prevText:"上一页",                   

                           nextText:"下一页",                   

                           lastText:"尾页",        

                           refreshText:"刷新",                          

                           displayMsg : "当前显示记录从 {0} - {1} 条 总 {2} 条记录",         

                           emptyMsg : "没有相关记录!"            

                          });       

                        tbar.render(grid.tbar);    //渲染到grid中的tbar    

                        }    

             }   

    });

           //行双击事件

     grid.on('rowdblclick',function(grid,index,e){

       //

       var row = grid.store.getAt(index);//取出点击的那条记录   grid 是对象名

  var rs_gamename = row.get('vGameName');//获得游戏名称

 });

    

    // render the grid to the specified div in the page

    grid.render('divShow');

ds.load({params:{start:0,limit:25,ddlGameList:gameid,ddlWorldList:worldid}});  //store装载数据时候装载参数到后台

4.Ajax 传数据

//Ajax 传数据  jquery方式

     $.post(

     "/AjaxCache/getLogGroup",

     {"getgame_id": document.getElementById("ddlGameList").value},

     function(oData, sStatus){

     fillGroup(oData, sStatus);

     },

     "text"

     );

5. Apache root用户设置

1) 首先,设置环境变量CFLAGS = -DBIG_SECURITY_HOLE 

2)进去apache的源文件目录 使用make clean;make distclean

3)然后重新编译apache。./configure prefix=/安装目录 - -enable-so  CFLAGS = “-DBIG_SECURITY_HOLE

4) 启动apache。 到安装bin目录下启动。

5. 小写变大写 替换

$pattern="/(\[\w+\])/e";

$resultGameDetail[0]['vDBPattern']=preg_replace($pattern,"strtoupper('\\1')",$resultGameDetail[0]['vDBPattern']);

6. php 文件下载

         header('Content-Type: application/vnd.ms-excel');

    header('Content-Disposition: attachment;filename="'.$outputFileName.'"');

    header('Cache-Control: max-age=0'); 

 $oWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');  $oWriter->save('php://output');  

下载的时候如果出现乱码文件,修改php文件类型为UTF8 BOM 类型

7. Codeignite 直接使用GET

CI默认过滤了$_GET

需要传递get参数时一般直接 /参数一/参数二 
详见手册说明:http://codeigniter.org.cn/user_guide/general/controllers.html#passinguri

但是有时候需要传递很长的复杂的url,比如常用的 http://www.nicewords.cn/index.php/controller/method/?backURL=http://baidu.com/blog/hi

这时 这种模式就行不通了。参数中本身的/会与默认的分隔符冲突

解决方案:

 1) 在config.php 中,将‘uri_protocol’ 设置为 ‘PATH_INFO’. 

PHP

$config['uri_protocol'] = "PATH_INFO";

$config['enable_query_strings'] = TRUE;

2) 在需要使用$_GET的之前加:

PHP

parse_str($_SERVER['QUERY_STRING'], $_GET);

这样,形如 index.php/blog/list?parm=hello&page=52 就可以运行了。

8. Apache php mysql 安装

安装apache

1.首先安装 apr-1.3.9.tar.gz

  tar zxvf apr-1.3.9.tar.gz;cd apr-1.3.9;

./configure --prefix=/usr/local/apr-apache/;

make;

make install;

2.安装 apr-util-1.3.9.tar.gz

  tar zxvf apr-util-1.3.9.tar.gz;

cd apr-util-1.3.9;

./configure --prefix=/usr/local/apr-util-apache --with-apr=/usr/local/apr-apache/;

make;

make install;

3.安装apache

tar zxvf httpd-2.2.15.tar.gz;

cd httpd-2.2.15;

./configure --prefix=/usr/local/apache2/ --enable-so --with-apr=/usr/local/apr-apache/ --with-apr-util=/usr/local/apr-util-apache/;

make;

make install

/usr/local/apache2/bin/apachectl configtest

显示ok  没有问题

安装php5

.首先要安装 libxml2(默认安装)

tar zxvf libxml2-2.6.30.tar.gz;

cd libxml2-2.6.30;

./configure ;

make ;

make install;

.安装curl

tar zxvf curl-7.20.1.tar.gz;

cd curl-7.20.1;

./configure --prefix=/usr/local/curl;

make ;

make install

3.安装php

tar zxvf php-5.3.2.tar.gz;

cd php-5.3.2;

./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-curl=/usr/local/curl/ --with-config-file=/usr/local/lib;

make ;

make install;

cp php.ini-development /usr/local/lib/php.ini

很不全,待更新 mysql包 soap 等等都没装

posted @ 2012-06-26 10:15  holyes  阅读(333)  评论(0编辑  收藏  举报