在 php-5.1.4 中使用 mysqli,金猪下崽 APP 开发 (T: I8O、2853、296OV 黎灿),我一直都在用 php4,很少接触 php5。由于学习的需要,慢慢去接触了 php5,了解了 php5 的面向对象,MySQL i 扩展库,SPL 及 pdo 等等新的特性。请别笑,我对 php5 接触得还是比较少。
为了能够使用 php5,我搭建了 php-5.1.4 mysql-5.0.22 IIS-5.1 运行环境,安装 php 及 mysql 的资料比较多,这里不重复了。
我进阶的第一个目标就是 mysqli,为了使用 mysqli,你得在 php.ini 里增加一行 extension=php_mysqli.dll,这个 dll 内置在 php5.1.4 的 ext 文件夹里,重启 www 服务即可以使用 mysqli 扩展库了(部份用户可能需要重启)。
配置完后,使用 mysqli 的面向对象编程方式编写如下代码:
CODE:[Copy to clipboard]
<?php
$db = new mysqli(“localhost”,”root”,”123456″,”test”);
$db->set_charset(“utf8”);
$rs = $db->query(“SELECT * FROM gallery_ablum
“);
while($row = $rs->fetch_assoc())
{
echo $row[‘Name‘],"<br>";
}
$rs->close();
$db->close();
?>
兴冲冲的放在网站下运行该代码,结果却发现脚本有错误“使用了未定义的 set_charset 函数”,难道 pphp5.1.x 不再支持 mysqli?于是我注释了第二行,结果却发现,程序是成功执行成功的!我很开心,终于可以显示数据了,虽然有一部份数据是乱码(乱码是因为我用了 utf8 编码,而 mysqli 连接默认用了 laint1)
接下来我一口气试了 mysqli 里的函数,结果发现大部份还是可用的。但字符集的问题就不可以解决了吗?如果不能解决,对用其它数据库编码的的程序,就不能使用了。于是我试试将第二行的语句换成 $db->query(“SET NAMES utf8”);,执行成功,却没能像我预期中的那样解决了乱码,使用 echo $db->character_set_name(); 查看当前的编码,还是 laint1。
我还不死心,上 php.net 里查看资料,终于知道 php.net 里发布的 php_myqli.dll 真的不能使用这个函数,而 mysql 却提供了这个 dll。下载地址是:http://dev.mysql.com/download…,这个页面里,mysql 声明这个 connector 与 php.net 提供的唯一区别就是:mysql 提供的是最新版本的!而且 mysql 建议我们使用 php5.1.4 及 mysql5.0.22,所以也只提供了这二个相关的 connector 下载。
connector 的安装很简单,停止 www 服务覆盖根目录下的 libmysql.dll 及 ext 目录下的 php_mysqli.dll 文件即可。
当我开心的打开浏览器执行前面的代码时,却出现“Unable to load dynamic library php_mysqli.dll,无法加载”的错误。我即刻晕倒。难道 php 与 mysql 真的是不是冤家不对头吗?
我还是很不情愿,不甘心这样放弃我的 php5 之路,于是我上 google 查资料,搜索出来的结果比较一致的说法是缺少 libmysql.dll,需要将这个库放到 php 路径里或 system32 里。我的 php 目录里明明有 libmysql.dll 呀(这个 libmysql.dll 是 mysql connector 里提供的),难道要放在 system32 里?copy 一份 libmysql.dll 到 system32,重启再执行 php,还是失败。
后来我上 mysql.com 的技术支持里查资料,看能不能找到一些头绪。经过大量的浏览后,发现有一个人说用 depends 来查查,刚开始我还以为是一个自行开发的软件,作者在此作一个广告,不过后来我真的没有办法了,只有死马当活马医了,上去 http://www.dependencywalker.c… work,原来这个东西是一个类似于脱壳的软件。结果我用它查到了 mysql 的 connector 里用了 vc7 来编译 dll 的,而我的机器是没有安装 vc7 的运行库,所以不能装载 php_mysqli.dll。
原因找到了,我立即就上 http://www.dll-files.com/dlli…,拷贝到 system32 系统目录下(顺便把刚才 copy 进来的 libmysql.dll 删除了,在 php 目录下保持一份就可以了),重启,浏览,终于可以执行 mysql 新的特性了。
(注:为了方便自己的调试,我打开了 php.ini 里的 display_errors 及 display_startup_errors)
上面是我解决的整个过程,实质上的步骤无需这么多,安装完 php5.1.4 后,上 mysql 网站下载 mysql 的 php connector 覆盖 php 目录下的相应文件。再搜索下自己系统盘里是否有 msvcr71.dll 这个文件,如果不存在于系统目录里,就下载一个并放入 system32 系统目录里。
另外,如果系统是 ntfs 的格式,还得注意权限的问题。特别是刚才从网上下载过来的文件,默认的权限可能不够。如果打开了 display_startup_errors 参数,会有 Unable to load dynamic library *.dll 拒绝访问的字眼。这时你就得注意下权限的问题了。
第一次这么认真发贴,主要是想一些刚学 mysqli 的朋友提供点有用的资料,而不是讨论 mysqli 好不好的问题。由于,也很希望能与大家继续讨论下 php5 里的新特性,特别是 pdo 及 pear 方面,我的邮箱 zhiouzhu(at)gmail.com,欢迎你们的指点。