使用PDO的一些备忘

之前在论坛上灌水的时候,也曾经看到别人提到过PDO的一些生僻用法。但是当时觉得短期内不会用上,所以不是太在意。等到要用的时候,满世界也找不到出处。

这使我下定决心,做点PDO的小笔记,慢慢补。

设定PDO的fetchMode

初始化pdo的时候,就设定好PDO的fetchMode,应该能省点事,比如我最喜欢的fetchMode是FETCH_OBJ。

$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO:FETCH_OBJ);

其中PDO::ATTR_DEFAULT_FETCH_MODE是php 5.2.0之后才新增的常量

还可以在实例化PDO对象的时候就完成这个设定:

$dbh = new PDO("mysql:dbname=dbname", "user", "password", 
	array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO:FETCH_OBJ));

PDO_MYSQL的一些预定义常量

PDO_MYSQL是PHP Data Objects (PDO) interface的一个mysql扩展。仔细看看php手册上面,其实还是有些有趣的参数可供使用,例如:

PDO::MYSQL_ATTR_INIT_COMMAND (integer)

Command to execute when connecting to the MySQL server. Will automatically be re-executed when reconnecting.

当我使用PDO_MYSQL连上mysql以后,可以利用这个参数自动执行一些QUERY。最常见的使用场合是连接mysql使用utf-8字符集:

$db = new PDO("mysql:dbname=dbname", "user", "password", 
	array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

以上代码会在连上mysql之后马上执行sql:

set names 'utf8';

ubuntu下安装php5 + pdo

这几天尝试把工作机迁到ubuntu上来做开发,系统安装好之后的首要任务是安装php+mysql的开发环境. 我打算直接安装php5, pdo_mysql, 下面是安装过程的记录

首先我直接用apt-get安装了apache2,php5,pear以及mysql5, 为了方便后续的安装,还加上了make和libmysqlclient

  • sudo apt-get install apache2-mpm-prefork
  • sudo apt-get install php5
  • sudo apt-get install php5-dev
  • sudo apt-get install php5-pear
  • sudo apt-get install mysql-server-5.0
  • sudo apt-get install make
  • sudo apt-get install libmysqlclient15-dev

pdo在ubuntu的apt里头似乎还找不到安装源,所以通过pecl来安装这个扩展,非常简单 —- 如果海底光纤能连通的话:

pecl install pdo

增加一行:

extension=pdo.so

到文件:

/etc/php/apache2/php.ini
/etc/php/cli/php.ini

接下来安装pdo_mysql碰到一些问题, 直接跑pecl install pecl_mysql会出现一些错误,搜索了一下发现是pecl本身的问题,下面是个比较简单的解决办法:

wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar xzvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2

注释掉configure里头判断是否已经安装pdo扩展的代码片段,继续跑:

phpize
./configure
make
make install

然后再次添加下面一行到前面提到的两个php.ini

extension=pdo_mysql.so

重启apache之后, php5 + pdo_mysql就在ubuntu上安装好了, documentroot是/var/www

后记

更简单的解决办法是运行:

PHP_PDO_SHARED=1 pecl install pdo_mysql

php 5.2 + pdo_mysql安装

这天在一台redhat的机器上安装php 5.2+pdo_mysql,走了些弯路,浪费了不少时间.记录一下:

首先我按照之前记录的手册安装php,参数上有些变化,configure参数增加了–with-pdo=shared –with-pdo-mysql=shared

最后得到一些错误提示:

checking for MySQL support for PDO... yes, shared
checking for mysql_config... /usr/bin/mysql_config
./configure: line 3038: -e: command not found
./configure: line 3039: -e: command not found
checking for mysql_query in -lmysqlclient... no
configure: error: mysql_query missing!?

于是暂时去掉了pdo-mysql模块的安装,直接安装pecl.php.net上最新的PDO_MYSQL

tar -xf PDO_MYSQL.tar
cd PDO_MYSQL-1.0.1
phpize
./configure

仍然出现之前的错误提示.很郁闷,在google上搜索了一下,有个最粗鲁最暴力的办法就是直接修改configure,绕过mysql_query的检测,这样能够编译成功,但是使用的时候调用pdo_mysql模块失败.

偶在这个问题上是卡了很久,在google的搜索结果里一个个比对,最后一个比较有建设性的提示是让俺回去查glibc的版本.

rpm -qa|grep glibc

这样看到这台机器上的glibc版本是2.3,而我下载安装的mysql却是for glibc 2.2,难怪会编译失败. 安装对应版本的mysql之后问题解决.