在php-5.1.4中使用mysqli
我一直都在用php4,很少接觸php5。由于學(xué)習(xí)的需要,慢慢去接觸了php5,了解了php5的面向?qū)ο螅琈ySQL i擴(kuò)展庫,SPL及pdo等等新的特性。請別笑,我對php5接觸得還是比較少。
為了能夠使用php5,我搭建了php-5.1.4 mysql-5.0.22 IIS-5.1運(yùn)行環(huán)境,安裝php及mysql的資料比較多,這里不重復(fù)了。
我進(jìn)階的第一個(gè)目標(biāo)就是mysqli,為了使用mysqli,你得在php.ini里增加一行extension=php_mysqli.dll,這個(gè)dll內(nèi)置在php5.1.4的ext文件夾里,重啟www服務(wù)即可以使用mysqli擴(kuò)展庫了(部份用戶可能需要重啟)。
配置完后,使用mysqli的面向?qū)ο缶幊谭绞骄帉懭缦麓a:
<?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();
?>
興沖沖的放在網(wǎng)站下運(yùn)行該代碼,結(jié)果卻發(fā)現(xiàn)腳本有錯(cuò)誤“使用了未定義的set_charset函數(shù)”,難道pphp5.1.x不再支持mysqli?于是我注釋了第二行,結(jié)果卻發(fā)現(xiàn),程序是成功執(zhí)行成功的!我很開心,終于可以顯示數(shù)據(jù)了,雖然有一部份數(shù)據(jù)是亂碼(亂碼是因?yàn)槲矣昧藆tf8編碼,而mysqli連接默認(rèn)用了laint1)
接下來我一口氣試了mysqli里的函數(shù),結(jié)果發(fā)現(xiàn)大部份還是可用的。但字符集的問題就不可以解決了嗎?如果不能解決,對用其它數(shù)據(jù)庫編碼的的程序,就不能使用了。于是我試試將第二行的語句換成$db->query("SET NAMES utf8");,執(zhí)行成功,卻沒能像我預(yù)期中的那樣解決了亂碼,使用echo $db->character_set_name();查看當(dāng)前的編碼,還是laint1。
我還不死心,上php.net里查看資料,終于知道php.net里發(fā)布的php_myqli.dll真的不能使用這個(gè)函數(shù),而mysql卻提供了這個(gè)dll。下載地址是:http://dev.mysql.com/downloads/connector/php,這個(gè)頁面里,mysql聲明這個(gè)connector與php.net提供的唯一區(qū)別就是:mysql提供的是最新版本的!而且mysql建議我們使用php5.1.4及mysql5.0.22,所以也只提供了這二個(gè)相關(guān)的connector下載。
connector的安裝很簡單,停止www服務(wù)覆蓋根目錄下的libmysql.dll及ext目錄下的php_mysqli.dll文件即可。
當(dāng)我開心的打開瀏覽器執(zhí)行前面的代碼時(shí),卻出現(xiàn)“Unable to load dynamic library php_mysqli.dll ,無法加載”的錯(cuò)誤。我即刻暈倒。難道php與mysql真的是不是冤家不對頭嗎?
我還是很不情愿,不甘心這樣放棄我的php5之路,于是我上google查資料,搜索出來的結(jié)果比較一致的說法是缺少libmysql.dll,需要將這個(gè)庫放到php路徑里或system32里。我的php目錄里明明有l(wèi)ibmysql.dll呀(這個(gè)libmysql.dll是mysql connector里提供的),難道要放在system32里?copy一份libmysql.dll到system32,重啟再執(zhí)行php,還是失敗。
后來我上mysql.com的技術(shù)支持里查資料,看能不能找到一些頭緒。經(jīng)過大量的瀏覽后,發(fā)現(xiàn)有一個(gè)人說用depends來查查,剛開始我還以為是一個(gè)自行開發(fā)的軟件,作者在此作一個(gè)廣告,不過后來我真的沒有辦法了,只有死馬當(dāng)活馬醫(yī)了,上去http://www.dependencywalker.com下載了一個(gè)depends work,原來這個(gè)東西是一個(gè)類似于脫殼的軟件。結(jié)果我用它查到了mysql的connector里用了vc7來編譯dll的,而我的機(jī)器是沒有安裝vc7的運(yùn)行庫,所以不能裝載php_mysqli.dll。
原因找到了,我立即就上http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71下載msvcr71.dll運(yùn)行庫,拷貝到system32系統(tǒng)目錄下(順便把剛才copy進(jìn)來的libmysql.dll刪除了,在php目錄下保持一份就可以了),重啟,瀏覽,終于可以執(zhí)行mysql新的特性了。
(注:為了方便自己的調(diào)試,我打開了php.ini里的display_errors及display_startup_errors)
上面是我解決的整個(gè)過程,實(shí)質(zhì)上的步驟無需這么多,安裝完php5.1.4后,上mysql網(wǎng)站下載mysql的php connector覆蓋php目錄下的相應(yīng)文件。再搜索下自己系統(tǒng)盤里是否有msvcr71.dll這個(gè)文件,如果不存在于系統(tǒng)目錄里,就下載一個(gè)并放入system32系統(tǒng)目錄里。
另外,如果系統(tǒng)是ntfs的格式,還得注意權(quán)限的問題。特別是剛才從網(wǎng)上下載過來的文件,默認(rèn)的權(quán)限可能不夠。如果打開了display_startup_errors參數(shù),會有Unable to load dynamic library ***.dll 拒絕訪問的字眼。這時(shí)你就得注意下權(quán)限的問題了。
第一次這么認(rèn)真發(fā)貼,主要是想一些剛學(xué)mysqli的朋友提供點(diǎn)有用的資料,而不是討論mysqli好不好的問題。由于,也很希望能與大家繼續(xù)討論下php5里的新特性,特別是pdo及pear方面,我的郵箱zhiouzhu(at)gmail.com,歡迎你們的指點(diǎn)。