我的 web 开发学习之路

最初了解到 web 是从自己使用网站,又因为专业的缘故,所以对编程对 web 开发逐步有了概念。学校论坛算是启蒙,因为管理着后台,其实并不怎么需要编码,无非是挖掘 Discuz 的功能,整合现有资源,并应用到论坛,服务论坛上的用户,比如找朋友、签到打卡、搬运工(学校通知、考试安排等)这些功能。

学校的课程体系中包含 HTML、CSS、JavaScript、JSP 动态网页、XML、JAVA 这些课程,正是这些课程让我逐步对 web 开发感兴趣,让我花时间去了解在这之外的东西,才慢慢地走上了 web 开发之路。但不得不说道路是曲折的,有过弯路有过徘徊,还好度过了那个时期,没有中途离开,否则也就没有这篇文章了。

一无所知

静态网页–> 动态网站

最开始对 web 的理解就是网页,互相连接起来的网页,才有可能形成 world,大家都在使用才能 wide,所以加上网页就形成了 WWW。后来又发现网站都是动态的啊,纯静态网站那是十多年前的事情了呢,于是知道原来有动态网站和动态语言。最先看到的当属 asp 了,在 w3school 上,形形色色的网页都是 asp 后缀的呢。于是开始在 w3chool 上学习 HTML 与 CSS,刚开始的过程无疑是新奇有趣又略有困难的,很多概念不懂,需要不断回顾再学习。这时候 JavaScript 是让我觉得神奇的语言,因为不需要服务器,只需要浏览器的引擎即可操纵网页,轻易修改。

动态网页最先接触的是 JSP,因为恰好学习 Java,使用 JSP 无疑是比较好的选择,使用一本叫作 《Servlet/JSP 深入详解》 的书籍作为入门以及应付考试。了解了 9 大内置对象,了解了如何使用 JSP 与后台 JAVA 进行交互,但始终没有用它做点什么东西出来。后来还是跟着解丹老师做某一个项目,使用 FLEX 作为前端代替了 JSP,这是后话。

逐步形成概念

网站组成

由于身处计算机专业,又待在网络中心,与学校论坛的前辈们在一个地方做事情,所以难免学着去了解 Discuz 这个系统。因为种种原因,加入了论坛团队,担任技术组组长一职。论坛可谓我网站启蒙。因为网站的运行运营以及各种困难问题的解决离不开团队成员的配合与努力,这段期间可谓各自努力学习,都希望把前人所作的工作做好同时让论坛在学校火热起来,其实还有一个目的,就是让我们院系能在学校被熟悉起来,因为曾说自己是信工的,被问居然还有这个院系!!

由于论坛工作的原因,那时对网站粗浅的理解就是网站是社区。由于要和其他院系以及学校组织做活动,因此得准备活动的素材来应对这些活动。所以对网站的组成做了初步的了解。最先做的大概就是 Banner 了,使用阿里妈妈的工具做,只需找好素材,然后根据活动主题做相应改变。

网站大概由前后端以及相应的组件组成,这些组件包括 Banner、flash 广告,图片轮播等等。

网站思考

这段时期我对网站做了相应的思考,其实论坛说到底是一种以话题做主线的社区,大家因为相同的志趣而集合到一起,因为相同的话题而产生交流。失去了话题论坛活跃度必然降低,所以可以看到,学校论坛中学校通知、租房、杏林广播、聚餐吃饭、爆照这些话题是经久不衰,其他话题如灌水吐槽等不能长久,但是可以作为润滑剂,毕竟干货以及热门话题需要时间,不会一直都有,既需要引导也需要刻意制造。

技能学习

静态部分学习

由于动态网站课程的学习,于是顺带地学习了HTML、CSS、jQuery。但也只是很粗浅的入门。一方面原因是眼界不够,觉得无非就这些知识,类似于 XX 天精通 XXX,但实际上有很大的误导,因为任何一门技术研究起来实际上都不是三言两语就可以解释清楚的。比如你学习了 HTML,觉得它无非标签的嵌套以及网页的布局,有什么难的呢。可是写过之后会知道根本不是这样。问题:行内元素和块级元素有什么区别,它们能相互嵌套吗?如果只是学习了标签是不会知道这个问题的答案的。即使了解了这个问题的答案,又会发现它们嵌套后在不同浏览器下效果是不同的,因为浏览器的解析引擎不一样,效果就有所区别了。

实习时由于要做一个内部的系统,其中有个需求是根据日期选择数据,这种需求如果是自己来实现必然费时,而如果使用 jQuery 的组件就是几段代码的工作量。jQuery 给我最大的益处就是其丰富的 DOM 对象 API,基于这些 API,对 DOM 元素的操作变得无比简单,而且由于其对多浏览器的支持,可以简单地开发出适配手机端的网页。

技能的学习让我深深觉得,每一门技术都有好坏,重要的根据需求选择技术并根据应用场景合理地配置,以便达到开发的目的。

服务器配置

每一种服务背后都有前人巨大的工作量作为铺垫,比如 Apache、Memcache、Redis、Nginx 等。

最初搭建论坛使用的是 WAMP 套件,因为不熟悉 Linux 而且 Windows 服务器也够用,所以长久以来也没有更换。

搭建起网站并运行起来最基本的就是设置网站文件目录,并支持动态语言文件的解析,即转发给指定的解析引擎进行解析并返回。套件的好处就是这些设置有可视化的界面,而且有基本够用的设置,不怎么需要额外修改,坏处是可定制性差一点,但是每个阶段有每个阶段的重点。

实际上做 WEB 开发最好还是在 Linux 平台下。因为常用的服务大都是在 Linux 下进行更新,Windows 系统下这些服务一般也会有人维护,但总是会慢一拍,而且有些服务根本不能在 Windows 下运行。

域名、空间以及 DNS

最初由于想使用自己的名字作为网站名搭建博客程序,就去了解了空间及域名。后来由于使用 jayxhj 网名,就购买了 jayxhj.com 这个域名。空间最初准备使用万网的空间以及域名,后来发现实在太贵,一年保守估计 1K 以上,索性购买美国的空间,使用的是 老薛主机, 优点是不需要备案,而且客服支持不错。

工具

最初接触网站并上传文件使用的是 FlashFXP, 后来才了解到使用 SVN 或者 Git 利用 hook 机制上传代码既方便快捷又能回溯,而且由于天然的版本机制,对代码控制和 new feature 的并入是非常好的选择。

WEB 开发体系逐步形成

由于大四实习的需要,在找到 实习 后得以有机会了解到真实的网站开发以及团队协作的流程。

技术选择

对于个人而言,选择一门主要的语言,使用合适的工具,了解足够多的技术并应用,业余学习新技术新语言,无疑是大多数开发者的常态。而对于公司而言,最初会选择一定的技术满足线上的需求,当选择的技术无法支撑需求时会考虑进行优化或者重构以及更换技术方案。由于论坛的接触,以及 PHP 天然地适合 web 开发,于是我选择了 PHP 作为自己的主要开发语言。

开发流程

最初加入的是 股票雷达,公司是创业型互联网金融公司,十人左右的团队,每个人负责一大块,PHP 这边有三个人,iOS 开发一人,技术总监一人,Java 开发一人,产品经理一人,CEO 一人,再加上实习几人,平常的业务会外包给别人做。

公司使用 Asana 作为团队协作工具,任务的分发以及任务的标记完成,使得需求转化成具体可操作的技术任务。一般是由产品经理与 CEO 推出需求,然后与开发人员协商,给出工作安排,CEO 负责资源的配置,即将任务合理分发,产品经理跟进项目的执行并及时反馈,再根据反馈及时调整,以合理控制项目进度。当前端切好页面并调好效果时一般总监会把架构设计好了,后端也把基本的代码设计及接口做好了,这时候就是前后端的整合,整合完成后移交给产品经理做基本测试,然后就是 beta 版发布,发布之后就是根据运营数据做调整,同时跟进开发新的功能,以及修复过去开发的产品的缺陷及 bug。

开发框架的选择

有句话叫作:不要重复造轮子。由于有太多的框架给我们选择,所以从头开发实无必要。框架好在把路由、逻辑分发、代码包含、分层架构做的非常好,而且内置变量还能让开发过程更简洁高效,代码可读性也更好,最重要的是 OOP 的框架能让开发者注重逻辑的实现而无需纠结于细节。

团队配合

无论是即时交流还是延时交流,这些都涉及到工具的选用,比如团队协作工具,比如企业邮箱选择,比如 bug 管理,比如 IM,比如版本控制。实习给我最大的感触就是不论什么事情,要尽心尽力,及时沟通,搞的定的及时做好后期继续优化,搞不定的请教别人,而不是拖到 deadline。因为项目的完成一般是需要协作的,涉及到常见的业务逻辑问题,肯定需要多人的参与,这时及时的沟通就显得尤为重要。工作不比学校,别人为你的工作付出了薪水,所以理应尽最大努力保质完成,即使不能完成也要能找到最好的平衡点,让项目流畅运转。

WEB 开发提高

就好比 PHP 不仅仅是一门脚本或者模板语言,要想学好技术,绝不能仅仅局限在某一门技术上,因为技术的应用范围有限,没有哪个技术能通吃所有方面,在合适的场景下选用合适的技术考虑实现难易综合成本才是比较明智的选择。而技术上的积累,在深度和广度上的平衡,最终会带来质变。

Linux 基础

推荐学习 鸟哥的 Linux 私房菜. 基础学习篇,无论是计算机基础知识的回顾,还是 Linux 的基本概念,这本书都讲的浅显易懂又不致枯燥无味。

面向对象开发

面向对象最大的特点就是封装继承与多态。使用面向对象开发能较容易地实现代码的封装与隔离,使用封装实现数据与数据处理的结合,使用继承可以方便扩展已有封装模块,而多态则实现多变的需求,统一的接口,不同的实现。

MVC

建议看看这个回答

三层构架和 MVC 不同

数据库

无论是关系型数据库还是非关系型数据库(Not Only SQL),数据库都是应用的核心,而且往往应用的瓶颈集中在数据库,这也是 NoSQL 兴起的一大原因,互联网巨大的用户量与数据量使得传统的关系型数据库不堪重负,而 NoSQL 能分担部分压力且表现良好。

代码结构与分层设计

代码结构的设计可以使得资源放在合适的目录,且结构清晰的代码能降低后期维护的成本。提前画好层次结构图,理清代码的设计思路,将应用分层设计,把接口定义良好,可以为后续的开发减轻不少压力。

新技术的学习

新技术的学习无疑是不被社会淘汰最有可能的途经。因为淘汰的常常是不肯学习的人,多学习多思考,跟上先进技术,才能有更好的为应用带来本质的改进。

比如 Node.js 与 PHP 的配合可以使得 API 设计变得更为合理,使用 MongoDB 作为日志分析收集器等等。这些技术的应用往往来自现实中的需求,而只要你的公司你的产品在成长,这些问题迟早会遇到。

涨薪是原动力,做更好的应用是实际需求,更好的服务用户是愿景。

架构

只有从初级工程师一级一级往上爬,当技术积累到一定程度,能带领一个团队做事时,这时候是技术人证明自己的时候,通过好的产品来诠释自己,让同行让团队尊重,也是对自身最好的嘉奖。

总结

一路走来,最大的感觉是成就感与辛苦是同在的。通过实习找到了互联网公司,敲开了互联网之路。而这一路上难免会有犹豫和徘徊,学校非主流语言,不太好的成绩,这些在后来并不被重视的东西当初却是让我对自己产生怀疑的源泉。但好在互联网这一行,不讲出身不相信命运,相信的是个人的努力,相信的是努力之后的结果。现在仍有太多的东西需要学习,仍有不少东西值得去尝试,好在,热血常在,心未凉,一切都值得去探索。

找工作及基本技能储备

面试准备

  1. 技能准备:数据库、数据结构、算法、HTTP、程序语言
  2. 目标公司寻找及相关技能准备
  3. 应聘方式:内推、校园招聘、社会招聘
  4. 自我项目展示:博客、论坛、开源项目参与等

网站搭建

  1. 域名购买、DNS 配置
  2. 开发环境 (IDE、编辑器 VIM emacs、调试环境 WAMP、设备)
  3. 需求分析及了解
  4. 原型设计
  5. 前端界面设计
  6. 后台程序开发
  7. 代码调试
  8. 网站上线

团队构成

  1. 技术研发部:开发部、前端
  2. 无线部门
  3. 运行维护部门
  4. 测试部门
  5. 产品设计部:设计部、产品部
  6. 人力资源部

PHP 笔试题、知识结构、进阶书籍

PHP 基础

PHP 手册(时常翻阅)、《PHP 和 MySQL web 开发》、《PHP 经典实例》、《PHP 与 MYSQL 权威指南》、《PHP 必须知道的 300 个问题》、《PHP 实战 1200 例》、《PHP 模块开发大全》、《PHP MVC 开发实战》一般来说所有的 PHP 应用程序可以在 CMS/Shop/BBS 这三种网站的模块中找到逻辑。

PHP 提高

《高性能 PHP》《PHP 应用程序安全编程》《PHP 开发与最佳实践》《PHP MVC 开发实战》 《精粹 PHP》。

软件架构

soap mvc socket 了解就行了 框架了解就行了
MongoDB、Redis、memcache 知道基本的使用就行 分布式 主从和优化

数据库方面

基础:MySQL 手册 、《MySQL 经典》、《SQL 基础教程》
提高:《高性能 MySQL》 、《高可用 MySQL》、《MySQL 的架构设计和性能调优》

中间件方面

了解 CDN 、Vanish、 Squid 、 thrift 、PHPRPC

HTTP

《图解 HTTP》、《HTTP 权威指南》

Linux

《鸟哥的 Linux 私房菜: 基础学习篇》、《Linux 系统命令及 Shell 脚本实践指南》

架构方面

《构建高性能 web 站点》 《负载均衡优化策略》

算法数据结构

严蔚敏的《数据结构》
链表、栈、二叉树、
排序的那些东西一般排序(快速 二分查找)

email 中 To、Cc、Bcc 字段的作用

你应该确保你的邮件正确地发给了你想要的人。To、Cc、Bcc 域允许你指定合适的策略让收件人接收信息。

To 字段是为那些与邮件信息极度相关且随时需要作出回应的人准备的。如果你认为谁与此极度相关,你应该把他们包含在 To 域中。

在邮件的开头把所有你认为相关的人都写进来是个不错的方法,这样你可以让别人知道谁参与了此事。

比如这样的开头:Hi Bill, Ted, Mary, Suzy,
如果你的收件人超过了四个,那么你最好以 Hi all or Hello team 开头,而不是以上面的方式。

只要你喜欢,你可以添加尽可能多的邮件地址到 To 字段中。有人错误地认为 Cc 域是用来解决收件人过多时的解决方法。

Cc 域(抄送)用来发送给那些你认为应该知道这件事情但又不是特别相关的人:他们仅仅需要知道事情的进展而不需要为此做出回应。

对于那些在 80 年代之后出生的人来说,“抄送”来源于用打字机写信。你需要把两张纸同时放入打字机中,中间放一张复写纸。信的内容通过复写纸被复印到底下的那张纸中。这样在底下就留下了与第一个信件相同的副本。

你有很多种使用 Cc 域的理由

  • 他保证被包含进来的人在这个环内(常被用来让经理们与及时跟进此议题)
  • 他让人们明白他们是应该对此作出回应还是仅仅只需知道就好了
  • 他允许你让收件人知晓其他的人也知道正在发生什么(万一你想让别人重视这件事情,或者把他作为重要的事情对待)。

Bcc 域(密送)被用来当你希望其他人收到这个邮件,但是你不想除收件人以外的人知道他收到了这封邮件。

当人们收到邮件,他们能看到 To,Cc 域但是看不到 Bcc 域的收件人。当你发送邮件给成千上万的人时,使用 Bcc 无疑是不错的选择。你不想让收件人知道其他收件人的邮件地址,所以你使用它,而不是 To,或 Cc。

总结下来就是这样:
To 发送给那些需要响应的人
Cc 发送给那些需要知晓事情进展但是不需要做出行动的人
Bcc 发送给那些不需要知道其他收件人的人或者用于大量的邮件发送

原文地址:http://www.writebetteremails.com/to-cc.htm

看国内各大邮箱服务提供商,基本提供了以上三种发送方式,To 对应在收件人中填写多个邮箱地址,Cc 对应于添加抄送,Bcc 对应于添加密送,当然还有分别发送(QQ 邮箱)或群发单显(网易和新浪),这种服务将多个发送任务放入队列中分别发送,收件人会依次收到相同的邮件。

substr() 与 mb_substr() 的区别

这两个函数都是获取子字符串,而 mb_substr() 一般在字符串中包含中文的情况下使用。其中有个很重要的区别是 mb_substr() 按字来切分字符串,不管中英文。
例子如下

1
2
3
4
5
6
7
8
<?php
$operation="中文 test 英文 abc";
var_dump(strlen($operation));
$price = mb_substr ($operation, 0, strlen ($operation ), 'utf-8' );
var_dump($price);
$price = mb_substr ($operation, 0, strlen ($operation )-8, 'utf-8' );
var_dump($price);
?>

// 输出为

1
2
3
int 19
string ‘中文 test 英文 abc’ (length=19)
string ‘中文 test 英文 abc’ (length=19)

大家有没有注意到,第二个函数我使用的是的 $length 参数长度为字符串长减 8 啊,为何结果却一样呢?

这就是我今天要说的区别:mb_substr() 将字符按字符数读取,故读取字符串”中文 test 英文 abc”的长度为 11,而实际上中文字符串占三个字节,所以输出长度为 19。

如果需要按字节来截取包含中文的字符串可以使用 mb_strcut() 函数。另外需要注意的是 mb 开头的函数都必须启用 PHP 的 php_mbstring.dll 扩展才可使用。

分组求和,将一列的数据求和

在数据库操作中常常会将某一列的具有相似性质的数据进行求和,昨天在做的项目中遇到了。 后来请教了一下自己又摸索了一下,得出了解决方案,那就是 分组求和。 需求:将某列数据求和 例子:数据库内容为: 数据库内容

根据 record_type 进行分组再求和,也就是将 1、2、3 三种类型进行分组,所以结果预期为三行 根据 record_type 分组

再一种是根据 record_date 来分组,由于日期有两组,故预期分组也为两组,结果为同一日期的 c、d 列数据相加 根据 record_date 进行分组

总结:当需要进行对某一列的具有相似条件(对应于 where 中的条件)的数据进行合并时,使用 group by 将记录分组,再使用聚合函数对数据进行需要的操作。这样就可以使用一条语句将所有的数据进行分组求和。

创建例子中的数据的 SQL 语句为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 CREATE DATABASE /*!32312 IF NOT EXISTS*/`group` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `group`;
/*Table structure for table `test` */
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`record_date` date DEFAULT NULL, `record_type` int(10) DEFAULT NULL,
`c` int(10) DEFAULT NULL,
`d` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


/*Data for the table `test` */
insert into `test`(`id`,`record_date`,`record_type`,`c`,`d`) values (1,'2013-10-14',1,1000,10000),(2,'2013-10-15',1,2000,20000),(3,'2013-10-14',2,3000,30000),(4,'2013-10-15',2,4000,40000),(5,'2013-10-14',3,5000,50000);

查询语句为

1
2
3
4
5
SELECT SUM(c) 'c 列数据的和',SUM(d)'d 列数据的和'
FROM test
WHERE record_date BETWEEN '2013-10-13' AND '2013-10-16'
GROUP BY record_type
ORDER BY record_type ASC

32 位 Windows7 下 PHP5.5 与 Apache2.4 的集成

PHP 官网提示:如果你的 Apache 是在 apache.org 上下载的,那么你必须使用旧的 VC6 编译版本的 PHP,不能使用 VC9 + apache.org 二进制版本的 PHP(意思就是如果想安装 PHP5.5 必须使用http://www.apachelounge.com/download/ 网站的 Apache 安装包)。

如果想安装更高版本的 PHP,那么需要下载 VC11 builds of Apache for x86 and x64。下载 5.5 版本的 PHP,最好下载线程安全的版本。下面介绍安装步骤。

  1. 配置 Apache2.4:解压下载的 apache2.4,在附件中找到命令提示符,以管理员身份运行,切换到 apache 的 bin 目录,命令为 cd c:/Apache24/bin ,安装 apache24 服务,命令为 httpd.exe -k install ,这样点击目录里的 ApacheMonitor.exe 就可以开启 apche 了,在浏览器输入 127.0.0.1 可测试,若出现 It Works! 表示 apache 配置成功。

  2. 配置 PHP5.5 : 将下载的 PHP5.5 的文件解压到某一目录,将目录里的 php.ini-production 文件另存为 php.ini,修改其中的 doc_dir, 如 doc_root =”C:/Apache24/htdocs”,extension_dir = “d:/php/ext”

  3. 修改 Apache 的 httpd.conf 文件,添加如下语句

    1
    2
    LoadModule php5_module "c:/php/php5apache2.dll"
    AddHandler application/x-httpd-php .php

configure the path to php.ini
PHPIniDir "C:/php"
这样当处理的网页为.php 后缀时将交给 php 引擎进行处理。

  1. 测试:在 htdocs 目录中添加 test 文件,文件内容为 < ?php phpinfo();?>, 若出现 php 的配置信息则代表 php 与 apache 配置成功。
    注意:由于 php5.5 由 VC11 编译完成,需要 Visual C++ 运行库的支持,下载地址为 x86 or x64。

链接汇总:

  1. Apache2.4:[http://www.apachelounge.com/download/](http://www.apachelounge.com/download/
  2. PHP5.5:http://windows.php.net/download/#php-5.5 建议下载 Thread-safe 版本
  3. Visual C++ 运行库http://www.microsoft.com/en-us/download/details.aspx?id=30679 如果网站加载缓慢,建议直接百度 Visual C++ 2012 运行库下载即可。

第一次电话面试

这是第一次在网上投简历有结果,上午十一点对方公司打电话过来说下午两点安排技术人员和我电话面试,下午两点一到对方电话就打过来了,效率很高很守时,我非常喜欢。
下面的是面试的内容,最大的感触就是基础得练扎实,得多实践。

自我介绍

PHP

常见的 PHP 字符串处理函数?
Session 和 cookie 的区别?
Session 储存于服务器端, cookie 储存于客户端。分别使用超全局变量 $_SESSION 和 $_COOKIE 数组访问。
Require()和 include()的区别?
require() 意为”必须”,include() 意为”包含”。它们都能实现包含一个文件的功能,但
include() 语句如果指定的文件无法定位,代码继续运行,而 require() 语句会导致代码停止运行并抛出错误。若文件找不到,两者都会报错但是只有 require() 语句会完全终止代码得运行。require_once() 语句与 include_once() 语句保证被包含的文件只被引入一次,防止重复定义和执行的问题。

HTTP

常见的 HTTP 状态码及表示的意思?

数据库

联结语句有哪些有什么区别?
内联结和外联结与交叉联结,外联结分为左外联结和右外联结。左外联结以左表为主表,右外联结以右表为主表。
性能优化,举例?
一张表有 100 条记录(表 a),另一张有 60 条记录(表 b),左联结后记录为多少,右联结后记录数为多少?
左联结时语句为
SELECT * FROM a LEFT OUTER JOIN b ON a.col1=b.col1
返回结果有 100 条,其中记录行中所有不满足条件的记录,表 b 的那几列均为 NULL
右联结语句
SELECT * FROM a RIGHT OUTER JOIN b ON a.col1=b.col1
返回结果有 60 条,其中记录行中所有不满足条件的记录,表 a 的那几列均为 NULL

算法

常见的排序算法,时间复杂度为多少,空间复杂度为多少?
世界上最快的排序算法是什么?

上面我能回答的都在这里,待我能回答了再到评论里进行更新。
最大的感触就是学的确实不够扎实,面试官建议好好练基础,然后找项目时间。在压力下你会逼着自己把事情做出来。
很高兴,虽然今天感觉被打击了,但也在意料之中也在情理之中。
好好学习吧,努力会有收获的。

PHP5.2+Apache2.2 的配置

由于安装 PHP5.5 的版本后在 Apache 的 http.conf 文件中配置 php 后导致 Apache 启动失败,错误提示为
the requested operation has failed

找官方文档发现配置 php5 模块的语句为 LoadModule php5_module &quot;c:/php/php5apache2_2.dll;,可是 5.5 的版本这个 DLL 文件后缀为 2_4, 修改后并没有成功,网上找大多建议安装 VC 运行库( 文章

其实问题归根结底是因为 PHP 版本与 Apache 版本不匹配,所以总结了下面的方法,很简单,结合了书上和官方文档的方法。

软件:PHP:php-5.2.17-Win32-VC6-x86.zip
Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi

步骤:安装 Apache,按说明依次操作即可。解压 PHP 到某一目录。

在 apache 的 http.conf 文件中加入以下代码:

1
2
LoadModule php5_module &quot;c:/php/php5apache2_2.dll;
AddHandler application/x-httpd-php .php

配置 php.ini 的路径
PHPIniDir "C:/php;"

在 php.ini 中设置

1、扩展 dll 目录
extension_dir="c:/php/ext;"

2、Web 服务器根目录(Apache2.2)
doc_root ="C:/Program Files/Apache Software Foundation/Apache2.2/htdocs;"

3、打开运行的扩展
extension=php_mysqli.dll

以上配置中 php 解压到 c:\php Apache 安装在 C:/Program Files/Apache Software Foundation/Apache2.2
安装完成后重启 Apache,然后在 htdocs 放入 test.php 文件,内容为 <? phpinfo();?> 如若显示 PHP 的配置信息则安装成功。

有时间我在配置一下 5.5 版本的 PHP 再把安装过程贴出来。

Caused by: java.sql.SQLException: 无法转换为内部表示解决方法

Hibernate 应用有三种开发方式:

  1. 自底向上从数据库到持久化类;
  2. 自顶向下从持久化类到数据库表;
  3. 从中间出发向上和向下同时发展。
    如果从下往上开发,使用 Database Explorer 反向生成 PO,其中的配置文件并不那么智能,比如如下规则

NUMBER(1)~NUMBER(18) 都可以使用 Long 来映射
一般 NUMBER(1)~NUMBER(9) 使用 Integer 映射
NUMBER(10)~NUMBER(18) 使用 Long 来映射
大于 NUMBER(18) 的只能用 BigInteger(出自 http://bbs.csdn.net/topics/310225381)

这些规则实际上是不会反映到配置文件中去的
所以会导致数据库里的字段类型与 Java 里映射该字段属性的类型不能对应转换,出现 java.sql.SQLException

一般这种情况下你得检查你的配置文件

  • java 类型与数据库类型是否匹配?(参看 oracle 数据类型和对应的 java 类型

  • 其他 POJO 是否与当前所查找的属性有关联,有那么在配置文件中会有一对多或多对一的关系,修改为对应的 java 类型即可

  • 在 POJO 中属性的数据类型为 Long,但是这个属性的 getxxx()方法返回的类型却为 long,而非 Long,程序不会报错,但运行时会出错。(如果对数据库进行操作时,没有涉及到的属性,即使配置文件或者 POJO 数据类型出错也不会有问题,但一旦涉及,若类型不匹配,则会出现错误)

建议反向工程生成 PO 时检查数据类型,设置对应格式。

使用 instantclient 和 PL/SQL 连接 oracle 远程数据库

PLSQL 连接 Oracle

Windows 装 Oracle 11g ,PLSQL Developer 使用出现以下问题:

1、Database 下拉框为空:

2、强制输入用户名、密码及 Database,登录弹出:

错误内容引用

1
Initialzation error
Could not initialize
"...."
Make sure you have the 32 bits Oracle Client installed.

OracleHomeKey:
OracleHomeDir:...
Found:oci.dll
Using:
...
Loadlibrary(...)
returned 0

解决办法

1、 下载 32 位 Oracle 客户端

下载链接:http://www.oracle.com/technetwork/cn/topics/winsoft-095945-zhs.html

下载 Instant Client 程序包就可以了。

下载需要登录,得先在 Oracle 注册账号才能下载!

2、 解压软件

将下载到的 instant client 解压,比如解压到到 D:\instantclient_11_2

3、 设置 PLSQL Developer

在工具 - 首选项,连接,OCI 库输入

D:\instantclient_11_2\oci.dll

4、 建立连接信息

tnsnames.ora,并保存到安装目录:D:\instantclient_11_2

tnsnames.ora 内容如下

1
2
3
4
5
6
7
8
9
SERVICE_NAME=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host_ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SERVICE_NAME)
)
)

需要修改的内容:SERVICE_NAME 为服务名,host_ip 为远程服务器的 ip,若为本地服务器在本地则为 127.0.0.1 或者 localhost;

5、 添加环境变量

添加环境变量系统变量中添加 2 个:第一个是指向 TNS 文件所在目录的,这个目录是你安装的 Oracle 的 TNS 文件所在目录。TNS 文件就是保存了连接信息的文件。

TNS_ADMIN 值: D:\instantclient_11_2\

第二个是指定数据库使用的编码。如果不设置成以下值,那么连接上数据库后,你看到的所有中文的内容将会是乱码,都是一堆问号。

NLS_LANG 值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

这样就可以远程连接 Oracle 服务器了,也可以解决使用 PL/SQL 远程登陆时下拉列表里没有数据库的问题。