PHP支持哪些數(shù)據(jù)庫
PHP通過安裝相應的擴展來實現(xiàn)數(shù)據(jù)庫操作,現(xiàn)代應用程序的設(shè)計離不開數(shù)據(jù)庫的應用,當前主流的數(shù)據(jù)庫有MsSQL,MySQL,Sybase,Db2,Oracle,PostgreSQL,Access等,這些數(shù)據(jù)庫PHP都能夠安裝擴展來支持,一般情況下常說的LAMP架構(gòu)指的是:Linux、Apache、Mysql、PHP,因此Mysql數(shù)據(jù)庫在PHP中的應用非常廣泛
<?php
if (function_exists('mysql_connect')) {
echo 'Mysql擴展已經(jīng)安裝';
}
數(shù)據(jù)庫擴展
PHP中一個數(shù)據(jù)庫可能有一個或者多個擴展,其中既有官方的,也有第三方提供的。像Mysql常用的擴展有原生的mysql庫,也可以使用增強版的mysqli擴展,還可以使用PDO進行連接與操作。
不同的擴展提供基本相近的操作方法,不同的是可能具備一些新特性,以及操作性能可能會有所不同。
- mysql擴展進行數(shù)據(jù)庫連接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
- mysqli擴展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
- PDO擴展:
$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ù)庫連接失敗');
mysql_select_db('code1');
mysql_query("set names 'utf8'");
$result = mysql_query('select * from user limit 1');
$row = mysql_fetch_assoc($result);
print_r($row);
連接數(shù)據(jù)庫
PHP要對數(shù)據(jù)庫進行操作,首先要做的是與數(shù)據(jù)庫建立連接,通常我們使用mysql_connect函數(shù)進行數(shù)據(jù)庫連接,該函數(shù)需要指定數(shù)據(jù)庫的地址,用戶名及密碼。
$host = 'localhost';
$user = 'code1';
$pass = '';
$link = mysql_connect($host, $user, $pass);
PHP連接數(shù)據(jù)庫的方式類似于直接在命令行下通過進行連接,類似:mysql -hlocalhost -ucode1 -p,當連接成功以后,我們需要選擇一個操作的數(shù)據(jù)庫,通過mysql_select_db函數(shù)來選擇數(shù)據(jù)庫。
mysql_select_db('code1');
通常我們會先設(shè)置一下當前連接使用的字符編碼,一般的我們會使用utf8編碼。
mysql_query("set names 'utf8'");
通過上面的步驟,我們就與數(shù)據(jù)庫建立了連接,可以進行數(shù)據(jù)操作了。
<?php
$host = '127.0.0.1';
$user = 'code1';
$pass = '';
//在這里編寫數(shù)據(jù)庫連接代碼
mysql_connect($host,$user,$pass);
mysql_select_db('code1');
mysql_query("set names 'utf8'");
執(zhí)行MySQL查詢
在數(shù)據(jù)庫建立連接以后就可以進行查詢,采用mysql_query加sql語句的形式向數(shù)據(jù)庫發(fā)送查詢指令。
$res = mysql_query('select * from user limit 1');
對于查詢類的語句會返回一個資源句柄(resource),可以通過該資源獲取查詢結(jié)果集中的數(shù)據(jù)。
$row = mysql_fetch_array($res);
var_dump($row);
默認的,PHP使用最近的數(shù)據(jù)庫連接執(zhí)行查詢,但如果存在多個連接的情況,則可以通過參數(shù)指令從那個連接中進行查詢。
$link1 = mysql_connect('127.0.0.1', 'code1', '');
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //開啟一個新的連接
$res = mysql_query('select * from user limit 1', $link1); //從第一個連接中查詢數(shù)據(jù)
插入新數(shù)據(jù)到MySQL中
當我們了解了如何使用mysql_query進行數(shù)據(jù)查詢以后,那么類似的,插入數(shù)據(jù)其實也是通過執(zhí)行一個sql語句來實現(xiàn),例如:
$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";
mysql_query($sql); //執(zhí)行插入語句
通常數(shù)據(jù)都是存儲在變量或者數(shù)組中,因此sql語句需要先進行字符串拼接得到。
$name = '李四';
$age = 18;
$class = '高三一班';
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";
mysql_query($sql); //執(zhí)行插入語句
在mysql中,執(zhí)行插入語句以后,可以得到自增的主鍵id,通過PHP的mysql_insert_id函數(shù)可以獲取該id。
$uid = mysql_insert_id();
這個id的作用非常大,通??梢杂脕砼袛嗍欠癫迦氤晒?,或者作為關(guān)聯(lián)ID進行其他的數(shù)據(jù)操作。
完整示例:
<?php
//連接數(shù)據(jù)庫
mysql_connect('127.0.0.1', 'code1', '');
mysql_select_db('code1');
mysql_query("set names 'utf8'");
//已知的數(shù)據(jù)變量有
$name = '李四';
$age = 18;
$class = '高三一班';
//在這里進行數(shù)據(jù)查詢
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";
mysql_query($sql); //執(zhí)行插入語句
$uid = mysql_insert_id();
echo $uid;
取得數(shù)據(jù)查詢結(jié)果
PHP操作數(shù)據(jù)庫跟MySql客戶端上操作極為相似,先進行連接,然后執(zhí)行sql語句,再然后獲取我們想要的結(jié)果集。
PHP有多個函數(shù)可以獲取數(shù)據(jù)集中的一行數(shù)據(jù),最常用的是mysql_fetch_array,可以通過設(shè)定參數(shù)來更改行數(shù)據(jù)的下標,默認的會包含數(shù)字索引的下標以及字段名的關(guān)聯(lián)索引下標。
$sql = "select * from user limit 1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
可以通過設(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);
// ------ 這兩個方法獲取的數(shù)據(jù)是一樣的
$row = mysql_fetch_assoc($result);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
如果要獲取數(shù)據(jù)集中的所有數(shù)據(jù),我們通過循環(huán)來遍歷整個結(jié)果集。
$data = array();
while ($row = mysql_fetch_array($result)) {
$data[] = $row;
}
查詢分頁數(shù)據(jù)
在實際應用中,我們并不希望一次性獲取數(shù)據(jù)表中的所有數(shù)據(jù),那樣性能會非常的低,因此會使用翻頁功能,每頁僅顯示10條或者20條數(shù)據(jù)。
通過mysql的limit可以很容易的實現(xiàn)分頁,limit m,n表示從m行后取n行數(shù)據(jù),在PHP中我們需要構(gòu)造m與n來實現(xiàn)獲取某一頁的所有數(shù)據(jù)。
假定當前頁為$page,每頁顯示$pagesize條數(shù)據(jù),那么offset為當前頁前面所有的數(shù)據(jù),既$offset = ($page-1) * $pagesize,在知道了翻頁原理以后,那么我們很容易通過構(gòu)造SQL語句在PHP中實現(xiàn)數(shù)據(jù)翻頁。
<?php
//連接數(shù)據(jù)庫
mysql_connect('127.0.0.1', 'code1', '');
mysql_select_db('code1');
mysql_query("set names 'utf8'");
//預設(shè)翻頁參數(shù)
$page = 2;
$pagesize = 2;
//在這里構(gòu)建分頁查詢
$offset = ($page - 1) * $pagesize;
$sql = "select * from user limit $offset, $pagesize";
//獲取翻頁數(shù)據(jù)
$result = mysql_query($sql);
$data = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$data[] = $row;
}
echo '<pre>';
print_r($data);
echo '</pre>';
更新與刪除數(shù)據(jù)
數(shù)據(jù)的更新與刪除相對比較簡單,只需要構(gòu)建好相應的sql語句,然后調(diào)用mysql_query執(zhí)行就能完成相應的更新與刪除操作。
$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 '刪除成功';
}
對于刪除與更新操作,可以通過mysql_affected_rows函數(shù)來獲取更新過的數(shù)據(jù)行數(shù),如果數(shù)據(jù)沒有變化,則結(jié)果為0。
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}