Archive for PHP

搞定PHP+MYSQL中文乱码问题(转)

在Google上找了很久,大部分的看似很牛的文章都没解决我的问题,但这篇搞定了,解决的很彻底,转自http://i-cando.cn/blogcn/topic.php?id=54:

 PS:我要解决的是用GB2312编码进行通讯,将下述utf8改为gb2312即可并注意将下述单引号改为键盘第二排的第一个字符`.

先讲下两个字符集的区别:

gb2312是标准中文字符集。

UTF-8 是 UNICODE 的一种变长字符编码,即 RFC 3629,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。 UTF-8 是字节顺序无关的,它的字节顺序在所有系统中都是一样的,排序更加容易。因此 UTF-8 具有更高的性能。

不过如果是纯英文的话,用什么都可以,用GB2312也没问题。

再分析下出现乱码的原因

mysql+php产生乱码原因:
1. mysql数据库默认的编码是utf8,如果这种编码与你的PHP网页不一致,可能就会造成MYSQL乱码.
2. MYSQL中创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.
3. MYSQL创建表时添加字段是可以选择编码的,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.
4. 用户提交页面的编码与显示数据的页面编码不一致,就肯定会造成PHP页面乱码.
5. 如用户输入资料的页面是big5码, 显示用户输入的页面却是gb2312,这种100%会造成PHP页面乱码.
6. PHP页面字符集不正确.
7. PHP连接MYSQL数据库语句指定的编码不正确.
最后讲 根治 的处方:
拿UTF8来举例

1、 保证页面的编码
如果是html 那么别忘了在 文件开头写上

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
如果是 php那么 记得在文件最上方写上

lzy © 2008, View php source

  1. header(“Content-type: text/html;charset=utf-8″);

Parsed in 0.021 seconds

保证文件的编码必须是 UTF-8
解决方法 (1)把你的文件用记事本打开 ,选文件另存为,在文件名的下面有个编码  看看字符集是不是UTF-8 如果不是请修改

2、 保证数据库是UTF8
在添加表的时候  需要设置编码为 UTF8
如果已经添加了 那么可以
在PHPMYADMIN 中查看表结构  的‘整理’属性上 是否为 utf8_general_ci
如果不是 请修改

lzy © 2008, View php source

  1.  

  2. ALTER TABLE ‘gbook’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

  3.  

Parsed in 0.049 seconds

数据库和字段 的编码同理:

lzy © 2008, View php source

  1.  

  2. ALTER DATABASE ‘testdata’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

  3. ALTER TABLE ‘ testdata’ CHANGE ‘test’ ‘test’ VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin

Parsed in 0.118 seconds

3、 PHP在连接数据库的时候加上一句:set names utf8

lzy © 2008, View php source

  1.  

  2. mysql_connect(‘localhost’,‘user’,‘password’);

  3. mysql_select_db(‘mydb’);

  4. mysql_query(“set names utf8;”);//**设置字符集***

  5.  

Parsed in 0.081 seconds

这样就做到万无一失了,如果还有什么问题 大家可以给我留言 我会及时回复的

Comments (1)

Joomla后记

这两天又重拾Joomla,有了一些新的心得:

从UI设计者的角度,页面是根据布局划分的,如header, footer, left, right, main等.这些元素构成了teamplate里的position.
从程序开发者的角度,页面是根据功能划分的,如导航栏(nav),文章列表(list),广告区(banner),投票(poll)等.这些元素构成了module.
因此,在joomla里程序开发者编写的功能模块(module)要显示在页面上,只需要通过指定module放在template的哪一个position就可以了.这样来看,以前不解的地方变得合理起来了.

———————————————-

Joomla的设计应用了MVC模式,创建一个新的module,需要编写一个helper.php实现数据获得部分(Model),mod_**.php实现主调用(Control),通常数据习惯放在名为$list的变量里.tmpl/default.php实现界面显示部分(View).

———————————————-

每个页面只能有一个组件,每个组件的views目录下对应组件可产生的页面模块文件,有点像asp.net的用户控件中的.ascx文件,也是前台UI界面,但UI设计者在模板设计时不能修改模块的界面.

可以这么理解,joomla的页面功能由组件实现,比如新闻列表和新闻内容,由com_content这个组件提供views/section和view/article来实现,为了丰富每个页面,可以将module拼装在页面上,因此,通常将登陆框,导航栏这种需要在多个页面中被复用的功能做成module,如果将来程序开发者希望对某个组件的功能进行扩展,那么可以编写插件,如为新闻内容的显示界面添加tag显示,那么就可以编写一个content的插件放在plugins/content/目录下.

———————————————-

1.先将网站按功能划分,如用户信息方面的/内容方面的(如新闻)/投票方面的/友情链接方面的等,形成不同的component定义.
2.然后针对每个功能提出不同的功能视图,即该功能的不同表现形式(组织形式,这里指数据的组织形式,而非显示样式,显示样式由模板来决定),如内容的列表显示及内容的Detail显示等,形成每个component的view定义.
3.接着每个component按MVC模型进行组建,编写共同的controller及不同的model和view.
4.组件实现并安装后,需要在网站上提供一个调用组件的入口,如在第一个组件com_content的某个视图中提供一个链接地址(通常这种入口链接会以模块的方式组装在组件页面上,如导航栏模块)来调用新组件.
5.如果组件的视图需要被多个页面调用的,像一个独立的box一样,那么就要创建成module而不是component view,举例:内容方面的功能创建了一个组件com_content,但有一个需求是列出前5条高点击率新闻,并且在多个页面中都需要显示它,此时就要创建成module.
6.创建成module的好处是,这个功能模块将可以被复用并组装到任意页面,典型的如footer, poll等.一个页面可以使用多个模块,这使用页面变得灵活并且更丰富.
7.另外,在设计组件时要考虑组件功能的扩展,提供一些接口可以使得新的idea在组件Release之后还能够通过插件的方式将其加入到组件功能中去,如com_content组件提供了onAfterDisplayContent接口,使得它的插件可以向该事务注册新的观察者调用.(这段的理解不一定对,比如组件的接口如何暴露出来?)

Comments (19)

边学边记之Joomla

关于分类:

jos_sections对应于单元,单元可以理解为最父级的网站分类,比如示例数据库中网站的单元分为News/FAQ/About三种.

jos_categories对应于分类,每个分类都有一个section,从数据库里可以看出,section字段设计为文本类型,它不仅仅可以指定为jos_sections表里的section id,也可以自定义.

这里我的理解是,可以在后台中动态进行管理的单元被纳入了jos_sections表进行管理,其它可能由某个组件绑定或使用的分类就直接自定义section,比如常见的友情链接组件,它的分类单元应该为友情链接,但友情链接并不做为单元存储在jos_sections表中,而是自定义了section字段值com_weblinks代表为友情链接单元.

这里我的疑问是,
1.为什么不将组件名称也做为一个单元纳入jos_sections表进行管理呢?可以定义一个字段来表示是可管理的单元,还是自动产生的不可管理单元.当然这样管理的话当组件被卸载时要同步删除jos_sections表和jos_categories表.
2.从jos_categories表结构来看,分类是存在parentid的,但后台管理中并没有发现分类存在N级关系,这个功能是可支持的么?

关于组件/插件:

jos_components对应于组件,jos_plugins对应于插件,组件和插件的区别以及如何编写,回头我再研究.

关于菜单/模块/布局:

jos_menu_types对应于菜单模块,通常页面左边的导航,上方的导航,用户控制面板等都属于常见菜单模块,jos_menu对应于菜单项,用于管理每个菜单模块中的具体菜单项,通常菜单项为一个链接,它可以指向系统预设的一些功能.

这里我的疑问是,
1.”menutype记录菜单类型目前系统分为四种菜单mainmenu(主菜单),topmenu(顶菜单),othermenu(其他菜单),usermenu(用户菜单)”这句话似乎没什么意义,这四个菜单模块貌似是可以删除的,并且没有特殊含义啊…
2.如何修改系统预设的可选菜单项呢?
menu

jos_modules对应于模块,用于管理网站中一些固定模块的布局,如上面提到的菜单模块将会在模块管理中决定它是否显示,显示在哪些页面(显示在哪些页面由jos_modules_menu管理,对应于菜单分配这个功能,这个功能的常见用途是指定某个模块只显示在首页,或指定的某些页面,如投票模块或用户控制面板等)以及显示在页面的什么位置.系统也预置了一些模块供用户添加,比如页脚模块,投票模块等.

这里我的疑问是,如何添加系统预设的模块呢?投票模块是否在投票组件安装时自动产生的呢?
module
关于布局,这里我的理解是,
模板的设计者先在templateDetails.xml中使用position标签指定页面布局由几大位置决定,比如left,top,right,user1,user2等.然后在模块管理中指定每个模块显示在什么位置,以及在该位置中的次序,比如左边导航以及用户控制面板都设定显示在left位置,然后通过次序决定谁显示在上面,谁显示在下面.

这里我的疑问是,
模块通过位置来控件,但位置是定义在模板的配置文件中的,那么显然模块的位置就会受模板限制,理想中应该是完全由模板来控制显示哪些模块以及模块的位置,但目前来看,修改模板的同时也可能需要修改模块信息才能达到换肤的效果.比如模板B添加了一个position叫user5,并且将模块2显示在user5位置,当切换到模板A时模块2的显示位置就无效了.感觉需要同时修改两个地方,很别扭…那么好处是什么呢?

关于模板:

jos_templates_menu对应于模板,用于定义模板与菜单之间的关系,”这就是为什么joomla可以采用多模板机制,可以为不同的菜单分配不同的模板”这句话是什么含义,回头我再研究.

Comments (27)

学习PHP.

假设你有不错的其它WEB语言的基础,却偏偏不懂PHP,那么就跟我一起来看看PHP吧~PHP与很多语言有相似之处却又有它独特的地方,刚接触它时如果不愿意按步就班的一步步学习,那么有一些东西是你必须要先知道的,否则就会像我一样在一个小问题上吃大亏:

1.PHP嵌入HTML中时使用
?>
这样的语句进行包含.而ASP是<%%>.

2.PHP中任何变量均可以不定义直接使用,这一点比较像VB.

3.申请一个常量,可以使用define(’MAX’, 10);引用的地方就直接使用$count = MAX;不需要像变量一样加$前缀.

4.向设备输出(如网页)使用echo ”;而ASP使用response.wirte.

5.包含子页面使用require_once或include.

6.初始化数组使用$arr = array(”A”, “B”, “C”);或array(0=>”A”, 1=>”B”, 2=>”C”);意义等同.

7.全局变量的使用与C不同,如:
$produce = 1;
function test()
{
echo $produce;
}
这样打印出来的$produce并不等于1,因为它此时被默认当做局部变量,并且是一个未赋值的局部变量,因此打印值为0,如果希望能正确的打印出1,需要这样:
$produce = 1;
function test()
{
global $produce;
echo $produce;
}

8.字符串拼接用.符号,如
$tmp = ” am “;
$str = “I”.$tmp.”cyndi”;
echo $str;
此时打印出I am cyndi.而ASP使用&符号.

9.地址栏传参与表单传参的方法,$_POST[”name”],$_GET[”password”]这样的方法,也可以这样使用:
extract($_POST);
extract($_GET);
echo $name.$password;

10.执行shell脚本有一点需要注意的是,默认php.ini中safe_mode是打开的,这表示你只可以通过system,exec等函数执行指定目录下的脚本或命令,如果想执行在自定义目录下的命令你必须关闭安全模式或者将自定义目录添加到safe_mode_include_dir中.

11.中止当前页面输出使用die;而ASP中使用response.end.

Comments (65)