1.11 PHP之?dāng)?shù)據(jù)庫(kù)操作

1.PHP支持哪些數(shù)據(jù)庫(kù)?

PHP通過(guò)安裝相應(yīng)的擴(kuò)展來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作直撤,現(xiàn)代應(yīng)用程序的設(shè)計(jì)離不開數(shù)據(jù)庫(kù)的應(yīng)用琳要,當(dāng)前主流的數(shù)據(jù)庫(kù)有MySQL,MsSQL,Sybase,Db2,Oracle,PostgreSQL,Access等,這些數(shù)據(jù)庫(kù)PHP都能夠安裝擴(kuò)展來(lái)支持仓蛆,一般情況下常說(shuō)的LAMP架構(gòu)指的是:Linux垛贤、Apache日川、Mysql寓盗、PHP,因此Mysql數(shù)據(jù)庫(kù)在PHP中的應(yīng)用非常廣泛望侈,我們會(huì)在本章中簡(jiǎn)單的了解Mysql的操作方法印蔬。

<?php    
    if (function_exists('mysql_connect')) {        
        echo 'Mysql擴(kuò)展已經(jīng)安裝';    
    }
?>

2.數(shù)據(jù)庫(kù)擴(kuò)展

PHP中一個(gè)數(shù)據(jù)庫(kù)可能有一個(gè)或者多個(gè)擴(kuò)展,其中既有官方的脱衙,也有第三方提供的侥猬。像Mysql常用的擴(kuò)展有原生的mysql庫(kù)例驹,也可以使用增強(qiáng)版的mysqli擴(kuò)展,還可以使用PDO進(jìn)行連接與操作退唠。不同的擴(kuò)展提供基本相近的操作方法鹃锈,不同的是可能具備一些新特性,以及操作性能可能會(huì)有所不同瞧预。
參考資料:PHP的數(shù)據(jù)庫(kù)擴(kuò)展之MySQL,mysqli和PDO

  1. mysql擴(kuò)展進(jìn)行數(shù)據(jù)庫(kù)連接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
  1. mysqli擴(kuò)展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
  1. PDO擴(kuò)展:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';    
$user = 'dbuser';    
$password = 'dbpass';    
$dbh = new PDO($dsn, $user, $password);

示例代碼:

<?php    
    $link = mysql_connect('127.0.0.1', 'code1', '') or die('數(shù)據(jù)庫(kù)連接失敗');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    $result = mysql_query('select * from user limit 2');    
    $row = mysql_fetch_assoc($result);    
    print_r($row);

注:以下示例代碼均以 mysqli擴(kuò)展 為準(zhǔn).

3.連接數(shù)據(jù)庫(kù)

PHP要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作屎债,首先要做的是與數(shù)據(jù)庫(kù)建立連接,通常我們使用 mysqli_connect 函數(shù)進(jìn)行數(shù)據(jù)庫(kù)連接垢油,該函數(shù)需要指定數(shù)據(jù)庫(kù)的地址, 用戶名, 密碼等信息盆驹。

mysqli_connect ([ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string$dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

PHP連接數(shù)據(jù)庫(kù)的方式類似于直接在命令行下進(jìn)行連接,類似:mysql -ucode1 -p滩愁,當(dāng)連接成功以后躯喇,我們需要選擇一個(gè)操作的數(shù)據(jù)庫(kù),通過(guò)mysql_select_db函數(shù)(為向下兼容仍然可以使用 mysql_selectdb(), 但反對(duì)這樣做; 直接用mysqli_connect設(shè)置即可)來(lái)選擇數(shù)據(jù)庫(kù)硝枉。
通常我們會(huì)先設(shè)置一下當(dāng)前連接使用的字符編碼廉丽,一般的我們會(huì)使用utf8編碼。

$host = 'localhost';
$user = 'user';    
$pass = 'password';    
$db = 'db'
$link = mysql_connect($host, $user, $pass, $db);
mysqli_query($link, "set names 'utf8'");

通過(guò)上面的步驟妻味,我們就與數(shù)據(jù)庫(kù)建立了連接正压,可以進(jìn)行數(shù)據(jù)操作了。

4.執(zhí)行MySQl查詢

在數(shù)據(jù)庫(kù)建立連接以后就可以進(jìn)行查詢责球,采用mysqli_query加sql語(yǔ)句的形式向數(shù)據(jù)庫(kù)發(fā)送查詢指令焦履。

$res = mysql_query('select * from user limit 1');

對(duì)于查詢類的語(yǔ)句會(huì)返回一個(gè)資源句柄(resource),可以通過(guò)該資源獲取查詢結(jié)果集中的數(shù)據(jù)棕诵。

$row = mysql_fetch_array($res);    
var_dump($row);

默認(rèn)的,PHP使用最近的數(shù)據(jù)庫(kù)連接執(zhí)行查詢凿将,但如果存在多個(gè)連接的情況校套,則可以通過(guò)參數(shù)指令從那個(gè)連接中進(jìn)行查詢。

$link1 = mysql_connect('127.0.0.1', 'code1', '');    
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //開啟一個(gè)新的連接    
$res = mysql_query('select * from user limit 1', $link1); //從第一個(gè)連接中查詢數(shù)據(jù)

5.插入新數(shù)據(jù)到MySQl中

當(dāng)我們了解了如何使用mysql_query進(jìn)行數(shù)據(jù)查詢以后牧抵,那么類似的笛匙,插入數(shù)據(jù)其實(shí)也是通過(guò)執(zhí)行一個(gè)sql語(yǔ)句來(lái)實(shí)現(xiàn),例如:

$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";    
mysql_query($sql); //執(zhí)行插入語(yǔ)句通常數(shù)據(jù)都是存儲(chǔ)在變量或者數(shù)組中犀变,因此sql語(yǔ)句需要先進(jìn)行字符串拼接得到妹孙。    
$name = '李四';    
$age = 18;    
$class = '高三一班';    
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";    
mysql_query($sql); //執(zhí)行插入語(yǔ)句在mysql中,執(zhí)行插入語(yǔ)句以后获枝,可以得到自增的主鍵id,通過(guò)PHP的**mysql_ insert_id**函數(shù)可以獲取該id蠢正。    
$uid = mysql_insert_id();這個(gè)id的作用非常大,通呈〉辏可以用來(lái)判斷是否插入成功嚣崭,或者作為關(guān)聯(lián)ID進(jìn)行其他的數(shù)據(jù)操作笨触。

示例代碼:

<?php    
    //連接數(shù)據(jù)庫(kù)    
    mysql_connect('127.0.0.1', 'code1','');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    //已知的數(shù)據(jù)變量有    
    $name = '李四';    
    $age = 18;    
    $class = '高三一班';    
    //在這里進(jìn)行數(shù)據(jù)查詢    
    $sql ="insert into user(name, age, class) values('$name','$age','$class`)";    
    mysql_query($sql);    
    echo mysql_insert_id();

6.取得數(shù)據(jù)查詢結(jié)果

通過(guò)前面的章節(jié),我們發(fā)現(xiàn)PHP操作數(shù)據(jù)庫(kù)跟MySql客戶端上操作極為相似雹舀,先進(jìn)行連接芦劣,然后執(zhí)行sql語(yǔ)句,再然后獲取我們想要的結(jié)果集说榆。PHP有多個(gè)函數(shù)可以獲取數(shù)據(jù)集中的一行數(shù)據(jù)虚吟,最常用的是mysql_fetch_array,可以通過(guò)設(shè)定參數(shù)來(lái)更改行數(shù)據(jù)的下標(biāo)签财,默認(rèn)的會(huì)包含數(shù)字索引的下標(biāo)以及字段名的關(guān)聯(lián)索引下標(biāo)串慰。

$sql = "select * from user limit 1";   
$result = mysql_query($sql);    
$row = mysql_fetch_array($result);

可以通過(guò)設(shè)定參數(shù)MYSQL_NUM只獲取數(shù)字索引數(shù)組,等同于mysql_fetch_row函數(shù)荠卷,如果設(shè)定參數(shù)為MYSQL_ASSOC則只獲取關(guān)聯(lián)索引數(shù)組模庐,等同于mysql_fetch_assoc函數(shù)。

$row = mysql_fetch_row($result);    
$row = mysql_fetch_array($result, MYSQL_NUM); //這兩個(gè)方法獲取的數(shù)據(jù)是一樣的    
$row = mysql_fetch_assoc($result);    
$row = mysql_fetch_array($result, MYSQL_ASSOC);如果要獲取數(shù)據(jù)集中的所有數(shù)據(jù)油宜,我們通過(guò)循環(huán)來(lái)遍歷整個(gè)結(jié)果集掂碱。    
$data = array();    
while ($row = mysql_fetch_array($result)) {        
    $data[] = $row;    
}

7.查詢分頁(yè)數(shù)據(jù)

上一節(jié)中,我們了解到通過(guò)循環(huán)可以獲取一個(gè)查詢的所有數(shù)據(jù)慎冤,在實(shí)際應(yīng)用中疼燥,我們并不希望一次性獲取數(shù)據(jù)表中的所有數(shù)據(jù),那樣性能會(huì)非常的低蚁堤,因此會(huì)使用翻頁(yè)功能醉者,每頁(yè)僅顯示10條或者20條數(shù)據(jù)。通過(guò)mysql的limit可以很容易的實(shí)現(xiàn)分頁(yè)披诗,limit m,n表示從m行后取n行數(shù)據(jù)撬即,在PHP中我們需要構(gòu)造m與n來(lái)實(shí)現(xiàn)獲取某一頁(yè)的所有數(shù)據(jù)。假定當(dāng)前頁(yè)為$page呈队,每頁(yè)顯示$n條數(shù)據(jù)剥槐,那么m為當(dāng)前頁(yè)前面所有的數(shù)據(jù),既$m = ($page-1) * $n宪摧,在知道了翻頁(yè)原理以后粒竖,那么我們很容易通過(guò)構(gòu)造SQL語(yǔ)句在PHP中實(shí)現(xiàn)數(shù)據(jù)翻頁(yè)。

$page = 2;    
$n = 2;    
$m = ($page - 1) * $n;    
$sql = "select * from user limit $m, $n";    
$result = mysql_query($sql);    //循環(huán)獲取當(dāng)前頁(yè)的數(shù)據(jù)    
$data = array();    
while ($row = mysql_fetch_assoc($result)) {        
    $data[] = $row;    
}

在上面的例子中几于,我們使用了$m與$n變量來(lái)表示偏移量與每頁(yè)數(shù)據(jù)條數(shù)蕊苗,但我們推薦使用更有意義的變量名來(lái)表示,比如$pagesize, $start, $offset等沿彭,這樣更容易理解朽砰,有助于團(tuán)隊(duì)協(xié)作開發(fā)。

8.更新與刪除數(shù)據(jù)

數(shù)據(jù)的更新與刪除相對(duì)比較簡(jiǎn)單,只需要構(gòu)建好相應(yīng)的sql語(yǔ)句锅移,然后調(diào)用mysql_query執(zhí)行就能完成相應(yīng)的更新與刪除操作熔掺。

$sql = "update user set name = '曹操' where id=2 limit 1";    
if (mysql_query($sql)) {        
    echo '更新成功';    
}

同樣的刪除可以使用類似以下的代碼:

$sql = "delete from user where id=2 limit 1";    
if (mysql_query($sql)) {          
    echo '刪除成功';    
} 
對(duì)于刪除與更新操作,可以通過(guò)**mysql_affected_rows**函數(shù)來(lái)獲取更新過(guò)的數(shù)據(jù)行數(shù)非剃,如果數(shù)據(jù)沒(méi)有變化置逻,則結(jié)果為0。    

$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}
示例代碼:

<?php    
    //連接數(shù)據(jù)庫(kù)    
    mysql_connect('127.0.0.1', 'code1','');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    //預(yù)設(shè)數(shù)據(jù)以便進(jìn)行更新操作    
    mysql_query("insert into user(name, age, class) values('王二', 19, '高三五班')");    
    $id = mysql_insert_id();    //在這里更新id為$id的行的名字為李白    
    $sql = "update user set name = '李白' where id = $id limit 1";    
    mysql_query($sql);    //輸出更新數(shù)據(jù)條數(shù)    
    echo '數(shù)據(jù)更新行數(shù):'.mysql_affected_rows();    
    mysql_query("delete from user where id='$id'");

9.關(guān)閉MySQL連接

當(dāng)數(shù)據(jù)庫(kù)操作完成以后备绽,可以使用mysql_close關(guān)閉數(shù)據(jù)庫(kù)連接券坞,默認(rèn)的,當(dāng)PHP執(zhí)行完畢以后肺素,會(huì)自動(dòng)的關(guān)閉數(shù)據(jù)庫(kù)連接恨锚。 mysql_close();雖然PHP會(huì)自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接,一般情況下已經(jīng)滿足需求倍靡,但是在對(duì)性能要求比較高的情況下猴伶,可以在進(jìn)行完數(shù)據(jù)庫(kù)操作之后盡快關(guān)閉數(shù)據(jù)庫(kù)連接,以節(jié)省資源塌西,提高性能他挎。在存在多個(gè)數(shù)據(jù)庫(kù)連接的情況下,可以設(shè)定連接資源參數(shù)來(lái)關(guān)閉指定的數(shù)據(jù)庫(kù)連接捡需。 $link = mysql_connect($host, $user, $pass); mysql_close($link);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末办桨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子站辉,更是在濱河造成了極大的恐慌呢撞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饰剥,死亡現(xiàn)場(chǎng)離奇詭異殊霞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汰蓉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門绷蹲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人古沥,你說(shuō)我怎么就攤上這事瘸右〗扛” “怎么了岩齿?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)苞俘。 經(jīng)常有香客問(wèn)我盹沈,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任乞封,我火速辦了婚禮做裙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肃晚。我一直安慰自己锚贱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布关串。 她就那樣靜靜地躺著拧廊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晋修。 梳的紋絲不亂的頭發(fā)上吧碾,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音墓卦,去河邊找鬼倦春。 笑死,一個(gè)胖子當(dāng)著我的面吹牛落剪,可吹牛的內(nèi)容都是我干的睁本。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼著榴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼添履!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起脑又,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暮胧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后问麸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往衷,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年严卖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了席舍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哮笆,死狀恐怖来颤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稠肘,我是刑警寧澤福铅,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站项阴,受9級(jí)特大地震影響滑黔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一略荡、第九天 我趴在偏房一處隱蔽的房頂上張望庵佣。 院中可真熱鬧,春花似錦汛兜、人聲如沸巴粪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)验毡。三九已至,卻和暖如春帝嗡,著一層夾襖步出監(jiān)牢的瞬間晶通,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工哟玷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狮辽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓巢寡,卻偏偏與公主長(zhǎng)得像喉脖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抑月,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容