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
- mysql擴(kuò)展進(jìn)行數(shù)據(jù)庫(kù)連接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
- mysqli擴(kuò)展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
- 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);