2007-08-11 01:54:41 by 番茄红了鸡零狗碎
在我们的项目中,使用了Oracle做为数据库,PDO_OCI 作为数据库驱动。
项目中需要使用到CLOB字段来存储大量的数据,什么CLOB?我们先来看看Oracle官方的说明:
Oracle 提供了以下 LOB 类型:
* BLOB,用于存储二进制数据
* CLOB,用于使用数据库字符集编码存储字符数据
* NCLOB,用于使用国家字符集存储 Unicode 字符数据。 注意,您将在本文中使用的 PHP OCI8 扩展当前不支持 NCLOB。
* BFILE,用于引用存在于操作系统的文件系统中的外部文
在PHP中,如果你想把LOB字段当做普通的字段来存取数据,会导致程序出错,甚至包括 httpd.exe 的非法错误。PHP的 OCI8 扩展提供了这一字段的支持,但仅提供了 BLOB、CLOB、BFILE 三种类型字段的支持(使用方法请参考Oracle官方文档),但 PDO_OCI 并没有提供这样的支持,那么我们如何解决这个问题?
通过查询相关文档找到了以下的解决办法,由于项目中使用了 Zend_Framework,那么我就以 Zend_Framework 来解决问题,关于 PHP 中的使用方法请参考PHP手册 PDO Functions - Large Objects (LOBs) 一节:
$stmt = new Zend_Db_Statement_Pdo($db, $sql);
$stmt->bindColumn('CONTENT', $content, PDO::PARAM_LOB);
$stmt->bindColumn('TITLE', $title, PDO::PARAM_STR);
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
echo '<h1>' . $title . '</h1>';
echo stream_get_contents($content) .'<hr />';
}
这里,使用到了 PDOStatement->bindColumn() 的方法,参阅相关资料得知:PDO::PARAM_LOB 可用于大文本对像字段,并使用 PDO::FETCH_BOUND 模式来进行存取,这是关于 PDO::PARAM_LOB 的说明:
PDO::PARAM_LOB (integer)
Represents the SQL large object data type.
这样的方法需要要求我们对所需要存取的字段都进行绑定,因此在例子中还使用了 PDO::PARAM_STR,但是那将会是一件非常烦琐的事。因此在项目中我们使用了 OCI8 的扩展来完成工作,这样工作变得简单很多,这也是Oracle官方给出的使用方法,取出数据时用到了一个 load() 的方法,至于更详细的用法就不在这里啰嗦了,大家可以自己参考一下文档。
相关的 Zend_Framework 代码如下:
$stmt = new Zend_Db_Statement_Oracle($db, $sql);
$stmt->execute();
while ($row = $stmt->fetch(Zend_Db::FETCH_ASSOC)) {
echo '<h1>' . $row['TITLE'] . '</h1>';
echo $row['CONTENT']->load() . '<hr />';
}
显然,上面的方法要方便很多。
另外,Zend Framework 对 Oracle 的 OCI 驱动的 lastInsertId (sequence) 的BUG还没有修正,如果大家在使用中出现问题,请找到 Zend_Db_Adapter_Oracle 第218行的 $sequenceName .= ‘_seq’; ,修正为 $sequenceName .= ‘_SEQ’; 即可(PS:这里需要大写,也不知道他们到底有没有做过测试,估计是没有的)。
2007-07-21 14:57:57 by 番茄红了鸡零狗碎
这是在查找Oracle客户端工具时找到的一个软件,使用JAVA开发的,目前拿他来做Oracle、MySQL、PostgreSQL甚至包括 MS SQL Server 数据库管理都是一件非常轻松的事情,官方网站为:http://www.dbvis.com/products/dbvis/。
目前最新版本为6.0,不过我使用的是5.0,大家可以在官方网站申请试用,试用时间为20天。(PS:网上流传有5.0的Crack文件,大家可以去找找)
个人还是比较喜欢这种GUI的管理方式,特别是可以轻松生成E-R图并导出,所以决定以后都使用放弃 phpMyAdmin。
以下是我的BLOG程序数据库E-R图,怎么样,还不错吧。

不过创建连接之前需要下载 JDBC 的jar包,基本上都是使用 jdbc 的方式来建立连接的,相关包大家可以到官方网站下载:http://www.dbvis.com/products/dbvis/drivers.html
DbVisualizer添加JDBC驱动程序的步骤:
1. 选择Database菜单。
2. 选择DriverManager 菜单项。
3. 选择Add new driver location 工具栏菜单项。
4. 选择mysql-connector-java-3.0.9-stable-bin.jar。
创建MySQL数据库连接:
1. 选择Database菜单。
2. 选择 Add Database Connection菜单项。
3. 指定连接别名 (如 sem)。
4. 在下拉列表中,把JDBC驱动选择为com.mysql.jdbc.Driver。
5. 在下拉列表中,把数据库URL选择为 jdbc:mysql:/// 。
6. 将URL修改为个人的地址,输入用户名和密码,连接建立完毕
对于具体的细节,大家自己去体验了,非常强大的功能界面,感觉操作方式及设计上还是比较人性化的,顺便截两张界面图,分享一下



2007-07-21 04:55:52 by 番茄红了鸡零狗碎
今天晚上睡得早了点(一点多睡的),结果睡了几个小时睡不着,于是爬起来喝点啤酒~~突然想到一直想写个自己的BLOG程序,于是决定利用 Zend Framework 做开发,编写个人的 BLOG 程序。花了点时间,把基础的环境搭建起来先,感谢星星为我提供 SVN 空间。
SVN 地址为:svn://www.i-fang.com/Akon
目前仅对入口文件及一些简单的操作进行了封装,有兴趣的朋友可以看一下。
不过估计不会花太多时间在这上面,因为项目也比较紧,加上最近准备花大把时间学习C,所以开发进度可能会比较缓慢,不过算啦,有时间就写一点,相信总会写完的。
2007-07-05 13:28:59 by 番茄红了鸡零狗碎
今天看一新闻文章时看到的一段,觉得有点意思,给大家分享一下
1、紫菱说巴黎铁塔没什么了不起:它从前面看是一座铁塔,它从后面看是一座铁塔,它从左面看是一座铁塔,它从右面看是一座铁塔,它从上面看是一座铁塔,它从下面看还是一座铁塔……
2、紫菱:云帆,我晕车耶!
云帆:怎么会晕车呢,这只是马车呀。是不是中暑了?有没有发烧?
紫菱:我不是那种晕车!我是坐着这样的马车,走在这样的林阴大道上,我开心得晕了,陶醉得晕了,享受得晕了,所以,我就晕车了。其实,我自从来到普罗旺斯,就一路晕。我进了梦园,我晕。我看到了有珠帘的新房,我晕。到古堡,我晕。看到种熏衣草的花田,我还是晕。看到山城,我更晕。反正,我就是晕。
云帆:好,你晕吧,我在你身边,如果你晕倒了,我会抱住你。
2007-07-03 23:28:53 by 番茄红了鸡零狗碎
由于ZF1.0的发布,导致最近与某些人在在PHPChina上大打口水战,很是不爽。
今天在看某一论坛XX人的解答时,发现了不少个人认为是解答错误的地方,特来指出一二,如果觉得我说得有错的,欢迎指教。
另外也针对一下XX人一直认为“特别”优秀的框架做一些简单的对比。
1、关于Join会降低效率,使用“递归关联查询”提高效率
参考:http://www.fleaphp.org/bbs/viewt … p;extra=page%3D1### 四楼
1、不同对象的职责更明确;
2、尽量减少不必要的 join,显著提高查询效率;
3、可以在递归关联查询时,获得更多的灵活性。
1、首先我不明白什么是“递归关联查询”,我搜篇了Google没发现有这个名词,估计乃XX人所独创,实在是强。
2、如果“递归关联查询”是指“递归查询”的话,不知道有谁听过“递归关联查询”比JOIN更快的方法。
3、从来只听说过使用JOIN的方法来提高查询效率,生平第一次听说JOIN会使效率降低,实在感叹自己像XX人所说“井底之蛙”,不知道XX人是否知道什么叫做笛卡尔乘积?
一些参考:http://dev.mysql.com/doc/refman/ … t-join-optimization
http://edu.cnzz.cn/NewsInfo/29612.aspx
4、至于说到JOIN在查询大量数据时会降低效率,这不能说明什么,只用一个select查询表和多表关联查询时能快多少?
不知道有没有谁的项目是会在一个页面中显示上百条记录的数据的,我想很少,那么这个效率已经缩小了。
5、JOIN真的会慢很多吗?
当JOIN的驱动表(应该是一个结果集比较小的表)对另一个表做查询时,表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来。 由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个恒定值。MySQL在查询时做一个 LEFT/RIGHT JOIN 优化时,当它在当前表中找到了和前一条记录符合 LEFT JOIN 条件后,就不再搜索更多的记录了。
由上可见,当驱动表较小的时候,使用JOIN做查询的时候,是会超过其他的方式的(当然不包括单表的SELECT)。当然JOIN确实也是会降低效率的,因为他要花很多的功夫在对数据的排序操作上,但当驱动表变小的时候,这一性能上的消耗几乎可以忽略不计。除非有人硬是要在一个页面上取出成百上千条记录,但我想这个时候要还没建视图,我想这家伙也够笨了,如果有人认为还有比视图查询更快速的查询方法,麻烦提出来,其实JOIN不就是一个逻辑上的视图吗?
2、建议手写 SQL 作为 $conditions,这样效率非常高,而且再复杂的条件都可以使用
参考:http://www.fleaphp.org/bbs/viewt … &extra=page%3D1
1、这是一个多么幼稚建议啊,稍稍复杂一点就要都手写SQL语句了,那我还要框架干嘛呢?
殊不知被人称为丑陋的 Zend_Db_Select 在这上面就非常好用,添加几段类似如下的代码,由ZF本身对几个字符串组合一下就能生成正确的SQL语句,这样已经大大减少了写SQL语句的工作,对于一个项目来说,少写许多SQL语句对于开发效率来说会是一个多大的提升啊。
(PS:不知道是不是因为ZF要组织一下字符串生成SQL,而使某人觉得这样消耗了性能还是其他,如果是这样我也无话可说了)
$select = $db->select();
$select->from(….)
->where(….)
->where(….)
->where(….)
…;
看上面的代码,多么容易阅读和扩展啊?居然有人说这是垃圾,真搞不懂,哎~~~
3、可以给 $dbo 增加两个属性:activeDb 和 defaultDb,分别指示当前操作的数据库和该 $dbo 原本要操作的 数据库
参考:http://www.fleaphp.org/bbs/viewt … &extra=page%3D1
不知道XX人听说过 Database Schema 这个东西没有,我很庆幸我正在使用中的 Zend Framework 提供了这个功能,非常方便且好用,至少不需要像XX人提出的建立多个连接来进行操作了。
(PS:我之前在某文中提到的框架局限性中非常严重的包括了这一部分的问题)
总结:看了看XX框架的代码,看了看某人对数据库的了解,感觉这个框架在DB这方面的设计思路上似乎有些问题,可能效率不是很好,不过还没做数据测试,暂时不下定论,明天抽个时间做个测试吧。另外,XX框架号称支持Oracle,殊不知在Oracle中根本没法使用,因为作者似乎不知道 Database Schema 是一个非常重要的东西,相信框架的作者并没有在Oracle上做太多的测试就发布了,让人用起来有点心惊胆战的。
2007-06-12 21:36:17 by 番茄红了鸡零狗碎
恰好这一天是星星的生日,中午和阿标、macoo、frank几个人小聚祝星星生日快乐,然后一帮人去超市买些东西为下午的烧烤做准备。
老天爷很争气,下了好多天雨的广州突然不下雨了。
只可惜最近身边的朋友似乎都不怎么走运,一住深圳布吉的同事家里被盗,损失了近2万多元,最惨的是几年积累下来的代码全都丢失,这个损失是无法估计的。在从深圳去广州的路上,同事macoo居然把钱包弄丢了,损失了500多元还有许多的证件和银行卡,包括身份证… 我只能同情一下了,各位出门在外的朋友也要小心一下。



点击这里查看更多聚会照片…
2007-06-05 17:21:12 by 鸡零狗碎
6月3日,公司全体开发人员+股东及家属一起到大鹏湾游玩,天气非常晴朗,非常清爽,海水也非常蓝,上午9点半出发,在一个滨海的小村庄里吃了午饭后就径直前往海滩边上。
由于这里是个半岛,海水也变得非常咸,大家在游泳的时候都被呛到不行。其实大家都拍了不少照片,但是我的由于蓝牙坏了,无法导出手机中的照片,因此照片的数量也比较有限,不过也已经够了。
要查看更多的照片可以点击这里,查看到我的相册。

9点半出发,一小时后看到了大海,但这里不是我们的目的地

远远的看到,大海很蓝很蓝,天空很晴朗,这是一个好天气

12点左右终于到达目的地,这里人不是很多。这里相对比较偏僻,人也比较少,查看地图后知道这里是个半岛,比较靠近海中心,因此海水也相对咸很多,大家也都有点不太适应,我也被呛得可以,喝了好多海水
2007-06-04 23:15:24 by 番茄红了鸡零狗碎
被BS了一段时间,终于换WordPress了,作为一个PHP程序员一直在使用ASP的博客,大家都有话说,其实是大家不清楚我为什么一直在使用PJBLOG
我的程序生涯应该可以说是从PJBLOG开始的,那时我还只是网络管理员,每天沉迷在路由、交换、ISA、服务器中。虽然之前也学过一些ASP和PHP,但都是很入门的级别。
刚开始使用的第一个BLOG程序是L-Blog,使用一段时间发现PJBLOG,感觉是一个很不错的BLOG程序,于是开始研究PJBLOG,并且加入了很久以前的PJBLOG开发团队,很多的朋友都不知道有这样一个团队。于是整天漫迹于PJBLOG的论坛、QQ群,认识了诸如虫虫、老鼠、鲸鱼叔叔等等的好朋友,也制作一些BLOG风格、插件,写了些教程,给我的博客也带来了不少的人气,最高的时候曾达到了日IP 1600多,PV达到6000多。最让我感激的则应该是舜子,在这些过程中,他一直是无私奉献的,同时也教会了我不少的东西,在这里对舜子说声“谢谢了”。
后来由于工作的关系,玩BLOG的时间也少了,经常一个月才2~3篇日志,加我QQ向我请教问题的网友被我大量拒绝,BLOG上的留言回复越来越少,我的BLOG于是变成了一个荒芜之地。去年11份不知为什么Baidu拒绝了对我的BLOG的收录,从那时候开始,人气开始急剧下降,尽管后来重新被Baidu收录,而且网站PR也升到了5,但最高也只达到了日PV3000左右。加上在先前的公司工作太忙,经常加班到晚上2~3点,甚至周未也被工作所霸占,更没有时间更新BLOG,人气越来越低,自己也没有了继续更新BLOG的习惯和兴趣。
但是对自己的BLOG已经产生了很浓厚的感情,因为通过BLOG,我认识了不少的朋友,放弃BLOG的同时,也将让我放弃不少的好朋友,这是我所不愿意的。只不过这里将来只会成为一个主要以记录个人生活、学习经验为主的BLOG。
下面记录一些历史:
2005年3月XX日,开始在博客中国写个人日志
2005年6月24日,开始由博客中国改为L-Blog,使用 57dtc.com 的域名和空间(这个空间和域名都是朋友的)
2005年8月19日,升级BLOG程序为PJBLOG,开始了PJBLOG之旅
2005年8月23日,收到同学心跳的提前生日礼物,tblog.com.cn的域名及空间,开始使用新域名
2005年9月7日,发布个人第一个BLOG皮肤,之后陆续发布了不少的皮肤
2005年10月21日,发布PJBLOG皮肤视频教程,虽然现在看来很烂,但是受到了广大网友的支持,BLOG流量开始提高,同时Baidu搜索关键字BLOG排到了第一页
2005年12月底,辞掉轻松的网络管理员职务,回家闭关修炼ASP、PHP、.Net
2006年2月12日,开始修改发布第一个PJBLOG的相关程序
2006年3月18日,开始写第一篇教程,于是带来了空前的人气
2006年4月15日,闭关结束,前往广州工作,BLOG更新开始减少,但人气不减
2006年6月底,因为工作太轻松而且受北京读秀网络邀请而辞职,但后又因为一些原因放弃了去北京工作,同时进入广州多迪网络工作,BLOG更新越来越少
2006年8月,担任多迪网络技术部经理,个人时间越来越少,同时辞去PJBLOG论坛版主,BLOG更新接近停止状态
2006年10月,加入广州PEA,终于找到了组织并经常参加活动
2006年11月,Baidu拒绝收录本站,网站流量开始下降
2007年4月,由于与公司领导发生意见冲突,我连同多个部门经理同时辞职,结束了半年多的加班生活,同时开始成为一个自由职业者,并少量更新BLOG日志
2007年5月18日,与现任同事Macoo接触后决定前往深圳发展,开始新的职业新的生活,结束自由职业者
2007年6月,也就是现在了,更换BLOG程序了为WordPress
我现在的环境还算不错,不用再每天熬夜加班,并且有一大帮有着相同爱好的同事一起工作,一起探讨技术。祝自己工作顺利,我将继续更新BLOG,但我不再把更新BLOG做为自己的责任。